[{"data":1,"prerenderedAt":584},["ShallowReactive",2],{"blog-uk-replit-secrets-explained":3,"blog-index-uk":342},{"id":4,"title":5,"body":6,"category":299,"cover":300,"coverAlt":301,"description":302,"draft":303,"extension":304,"faq":305,"image":320,"keywords":321,"meta":328,"navigation":329,"ogTitle":330,"path":331,"published":332,"seo":333,"stem":334,"tldr":335,"updated":340,"__hash__":341},"blog_uk\u002Fblog\u002Freplit-secrets-explained.md","Як користуватися секретами в Replit і що все одно публікується",{"type":7,"value":8,"toc":288},"minimark",[9,13,21,24,33,38,41,80,83,90,94,97,100,103,107,110,113,116,122,136,147,160,167,171,174,184,190,195,205,208,212,215,218,221,232,238,246,250,276],[10,11,12],"p",{},"Десь між створенням застосунку та його публікацією Replit сказав вам перестати\nписати ключ API просто в коді. Тож ви подивилися, як користуватися секретами в\nReplit, перенесли ключ в інструмент Secrets, і попередження зникло. Потім вам\nсказали, що ключ усе ще видно у вашому опублікованому застосунку, і обидві ці\nречі здаються правдою одночасно.",[10,14,15,16,20],{},"Так і є. Ось частина, яку більшість порад про це оминає: ",[17,18,19],"strong",{},"інструмент Secrets\nвирішує, де значення зберігається. Ваш код вирішує, куди його понесуть."," Це два\nокремі питання, і лише перше має хоч якийсь стосунок до інструмента.",[10,22,23],{},"На Replit це б’є найдужче, бо половина вашого застосунку, яка працює на машині\nReplit, і половина, яка працює на ноутбуці вашого відвідувача, лежать в одному\nпроєкті, часто в сусідніх файлах. Ніщо в редакторі не проводить між ними лінію.",[10,25,26,27,32],{},"Між 12 та 14 серпня 2026 року ми прогнали ті самі дев’ять зовнішніх перевірок\nчерез 30 998 робочих застосунків, з яких 3 042 опубліковані на Replit. У 219 з\nцих застосунків Replit щось схоже на ключ лежало в коді, який завантажує\nвідвідувач. По всій вибірці більшість того, що знаходить ця перевірка, це ключ\nGoogle, з яким після обмеження зазвичай усе гаразд. Ті, з якими не гаразд, це\nсаме ті, яким мав би запобігти інструмент секретів. Повні цифри є в\n",[28,29,31],"a",{"href":30},"\u002Fresearch\u002Fvibe-coded-app-security-2026","нашому звіті сканування",".",[34,35,37],"h2",{"id":36},"як-користуватися-секретами-в-replit","Як користуватися секретами в Replit?",[10,39,40],{},"Відкрийте інструмент Secrets, додайте назву та значення й читайте це значення у\nсвоєму коді як змінну середовища. Це займає близько хвилини.",[42,43,44,52,64,67,77],"ol",{},[45,46,47,48,51],"li",{},"У своєму проєкті відкрийте ",[17,49,50],{},"Secrets",". Він у списку інструментів, і пошук за\nцим словом у панелі інструментів його знаходить.",[45,53,54,55,58,59,63],{},"Виберіть ",[17,56,57],{},"+ New secret",". Дайте назву великими літерами з підкресленнями,\nнаприклад ",[60,61,62],"code",{},"OPENAI_API_KEY",". Саме цю назву використає ваш код, тож вона\nважливіша, ніж здається.",[45,65,66],{},"Вставте значення в друге поле й збережіть. Replit шифрує його й тримає поза\nфайлами проєкту.",[45,68,69,70,73,74,32],{},"Прочитайте його в коді. У JavaScript це ",[60,71,72],{},"process.env.OPENAI_API_KEY",", а в\nPython ",[60,75,76],{},"os.getenv(\"OPENAI_API_KEY\")",[45,78,79],{},"Поверніться й видаліть значення там, де воно було раніше.",[10,81,82],{},"П’ятий крок це той, який пропускають, і той, від якого залежить, чи було з\nусього цього хоч щось. Створення секрету не прибирає копію, яка у вас уже була.\nКлюч, вставлений у файл минулого тижня, і далі в тому файлі, і далі в історії\nвашого проєкту, і далі всередині кожної копії вашого застосунку, опублікованої\nвідтоді.",[10,84,85,86,89],{},"Файл ",[60,87,88],{},".env"," виконує ту саму роботу, що й інструмент Secrets, з однією важливою\nрізницею: це файл, тож він подорожує разом із проєктом, коли хтось робить форк\nабо підключає проєкт до репозиторію.",[34,91,93],{"id":92},"чи-безпечні-секрети-replit","Чи безпечні секрети Replit?",[10,95,96],{},"Для того, що вони роблять, так. Значення зашифроване, воно лежить поза вашим\nкодом, і три найпоширеніші способи втратити ключ цим закриваються: ви ділитеся\nпроєктом зі співавтором, ви підключаєте його до репозиторію, або хтось дивиться,\nяк ви працюєте.",[10,98,99],{},"Уявіть це як замкнену шухляду. Те, що лежить у шухляді, приховане від будь-кого,\nхто читає ваші файли. Чого шухляда вирішити не може, так це що ваш застосунок\nробить із вмістом після того, як ваш власний код її відчинив і пішов далі.",[10,101,102],{},"А опублікований застосунок Replit іде далі з чималим. Кожен відвідувач, який\nзавантажує ваш сайт, отримує всю передню половину, бо браузер не може намалювати\nсторінку, якої йому не надіслали. Якщо код, що відчиняє шухляду, це код, який\nнадсилають відвідувачам, вийняте значення подорожує разом із ним.",[34,104,106],{"id":105},"яка-половина-вашого-застосунку-читає-ключ","Яка половина вашого застосунку читає ключ?",[10,108,109],{},"Половина, яка працює на машині Replit, може читати секрет безпечно. Половина,\nяка працює в браузері вашого відвідувача, не може, і звичний спосіб змусити її\nпрацювати водночас є способом, яким ключ стає публічним.",[10,111,112],{},"Ваш серверний код це та частина, яку запускає Replit: маршрут Express,\nобробник на Python, функція, що спілкується з OpenAI чи Stripe і повертає вашому\nзастосунку відповідь. Вона читає секрет, використовує його, і значення ніколи не\nзалишає машину.",[10,114,115],{},"Ваш код у браузері це все, що виконує ноутбук вашого відвідувача. У проєкті на\nReact це більша частина того, що ви редагували. Він компілюється у пакунок\nJavaScript і повністю завантажується кожним, хто відкриває ваш сайт.",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Замкнене сховище значень усередині пунктирної рамки, яка позначає машину Replit, і два шляхи назовні. Верхній шлях доходить до сервера, що залишається всередині рамки, де значення й далі намальоване прихованими крапками та позначене галочкою. Нижній шлях доходить до вікна браузера з написом VITE_, потім перетинає рамку й закінчується на людині, яка тримає те саме значення як читабельну смужку, перекреслену хрестиком.","Одна шухляда, двоє читачів. Значення йде туди, куди йде код, який її відчинив.","\u002Fblog\u002Freplit-secrets-explained\u002Fwhich-half-reads-it-1600x760.png",[10,123,124,127,128,131,132,135],{},[60,125,126],{},"process.env"," у браузері не існує, тож код у браузері, який його читає, не\nотримує нічого. Щоб значення все ж дійшло, хтось його перейменовує:\n",[60,129,130],{},"VITE_OPENAI_API_KEY"," у проєкті на Vite або ",[60,133,134],{},"NEXT_PUBLIC_OPENAI_API_KEY"," у\nпроєкті на Next.js. Це працює одразу, бо такий префікс це інструкція\nінструменту збірки записати значення всередину пакунка. Власна документація Vite\nкаже це прямо й радить не класти туди ключі API саме з цієї причини.",[10,137,138,139,142,143,146],{},"Тож найшвидша перевірка в цій статті це пошук. Відкрийте свій проєкт і пошукайте\n",[60,140,141],{},"VITE_"," та ",[60,144,145],{},"NEXT_PUBLIC_",". Кожен збіг це значення, яке ваш інструмент збірки має\nвказівку опублікувати.",[10,148,149,150,154,155,159],{},"Для деяких це правильно. Публічний ключ Supabase створений для того, щоб бути в\nбраузері, і ключ Google Maps з\n",[28,151,153],{"href":152},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","обмеженням за referrer"," теж.\nНеправильно це для всього, що витрачає гроші або читає базу даних, не питаючи,\nхто стукає, а\n",[28,156,158],{"href":157},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","відрізнити одне від одного","\nзаймає близько хвилини на ключ.",[10,161,162,163,32],{},"Якщо ви радше подивилися б, що ваш опублікований застосунок віддає, перш ніж\nіти файл за файлом, наше безкоштовне сканування читає ваш сайт ззовні й каже,\nщо воно там знаходить. Воно триває близько 20 секунд і не потребує облікового\nзапису: ",[28,164,166],{"href":165},"\u002Fsecurity-scanner","сканувати застосунок",[34,168,170],{"id":169},"чому-мій-секрет-replit-не-працює","Чому мій секрет Replit не працює?",[10,172,173],{},"Дві причини, і з вашого місця вони дають однаковий симптом: порожнє значення й\nзастосунок, який не працює.",[10,175,176,179,180,183],{},[17,177,178],{},"Код, який його читає, працює в браузері."," Там немає жодного середовища для\nчитання, тож ",[60,181,182],{},"process.env.ВАШ_КЛЮЧ"," порожній і таким залишиться. Це не проблема\nналаштувань, і скільки б разів ви не створювали секрет наново, з місця воно не\nзрушить. Виклик, якому потрібен ключ, має переїхати в серверну половину вашого\nзастосунку.",[10,185,186,189],{},[17,187,188],{},"Ваш опублікований застосунок працює на старішій версії."," Replit тримає два\nнабори значень: ті, що у вашому робочому просторі, і ті, з якими працює ваш\nопублікований застосунок. Вони синхронізуються, тож доданий секрет зазвичай\nдоходить до розгортання. Але те, чим працюючий застосунок користується\nнасправді, це те, що було на момент останньої публікації. Додайте секрет після\nнеї, і працюючий застосунок нічого про нього не знатиме, доки ви не опублікуєте\nще раз.",[117,191],{"alt":192,"caption":193,"src":194},"Дві панелі поруч. На панелі редактора замкнене сховище містить заповнене значення, а попередній перегляд поруч позначений галочкою. На панелі опублікованого застосунку те саме сховище має порожнє місце, працюючий застосунок поруч перекреслений, а під ним стоїть слово undefined.","Та сама назва в обох місцях. Працюючий застосунок працює на значеннях, які були на момент вашої останньої публікації.","\u002Fblog\u002Freplit-secrets-explained\u002Ftwo-stores-one-name-1600x560.png",[10,196,197,198,201,202,204],{},"Власна інструкція Replit для застосунку, який працює в редакторі та ламається\nпісля публікації, починається саме в цьому місці, тож варто відкрити секрети\nрозгортання й прочитати назви, перш ніж вважати щось зламаним. Назва, написана\n",[60,199,200],{},"OPENAI_KEY"," в одному місці та ",[60,203,62],{}," в іншому, дає те саме порожнє\nзначення, що й відсутній секрет.",[10,206,207],{},"Розгортання, яке падає опівночі, це момент, коли беруть коротший шлях. Вставити\nзначення просто в код розблоковує все за секунди, застосунок повертається, і\nключ відтоді лежить у вашому опублікованому пакунку.",[34,209,211],{"id":210},"ключ-уже-в-моєму-опублікованому-застосунку-що-тепер","Ключ уже в моєму опублікованому застосунку. Що тепер?",[10,213,214],{},"Замініть його, перш ніж міняти будь-який код. У панелі постачальника створіть\nновий ключ і відкличте старий.",[10,216,217],{},"Цей порядок важливий, бо заміна це єдиний крок, після якого відкрите значення\nперестає працювати. Редагування коду прибирає його з поточної версії й лишає в\nісторії проєкту, а з копіями вашого пакунка, які вже завантажили, закешували та\nобійшли краулери, не робить нічого. Те, що ваш застосунок маленький, теж не\nрятує: автоматичні краулери безперервно читають публічні сайти в пошуках\nрядків, схожих на ключі, не маючи жодного уявлення, хто ви.",[10,219,220],{},"Далі, у такому порядку:",[42,222,223,226,229],{},[45,224,225],{},"Покладіть новий ключ у Secrets і читайте його лише з серверного коду.",[45,227,228],{},"Перенесіть виклик, якому він був потрібен. Усе, що спілкується з OpenAI,\nAnthropic, Stripe чи вашою базою даних адміністративним ключем, належить за\nмаршрутом, який викликає ваш застосунок, щоб браузер питав ваш сервер, а ключ\nтримав сервер.",[45,230,231],{},"Перегляньте сторінки використання та оплати постачальника за період, коли\nстарий ключ був публічним. Заміна спиняє те, що станеться далі, і нічого не\nкаже про те, що вже сталося.",[10,233,234,235,237],{},"Ключі постачальників моделей на Replit варто перевіряти першими.\n",[60,236,62],{}," це приклад, до якого вдається власна документація Replit, коли\nпоказує, як додати секрет, і публічного варіанту ключа OpenAI чи Anthropic не\nіснує. Кожен із них списує гроші просто з вашого рахунку.",[10,239,240,241,245],{},"Ще одне місце, куди варто зазирнути, поки ви тут: якщо ваш проєкт публікує\n",[28,242,244],{"href":243},"\u002Fblog\u002Fsource-maps-exposed-in-production","source maps",", відвідувач може прочитати\nцей пакунок як оригінальні файли, які ви написали, з вашими власними назвами\nзмінних на них.",[34,247,249],{"id":248},"що-зробити-цього-тижня","Що зробити цього тижня",[251,252,253],"key-takeaways",{},[254,255,256,259,267,270,273],"ul",{},[45,257,258],{},"Перенесіть кожен ключ в інструмент Secrets, а потім видаліть копії, залишені у файлах. Створення секрету не прибирає старе значення.",[45,260,261,262,142,264,266],{},"Пошукайте у своєму проєкті ",[60,263,141],{},[60,265,145],{},". Кожен збіг це значення, яке ваш інструмент збірки публікує навмисно, і кожне з них має бути ключем, який можна публікувати.",[45,268,269],{},"Для кожного, який таким не є, перенесіть виклик, що його використовує, у серверну половину, щоб браузер питав ваш застосунок, а ключ тримав застосунок.",[45,271,272],{},"Якщо секрет порожній в опублікованому застосунку, але працює в редакторі, опублікуйте ще раз і перевірте назву в секретах розгортання, перш ніж міняти код.",[45,274,275],{},"Замініть у постачальника все, що вже вийшло назовні, перш ніж чіпати код. Потім прочитайте сторінку оплати за тижні, коли ключ був публічним.",[10,277,278,279,283,284,32],{},"Спершу зробіть пошук. Він займає хвилину, нічого встановлювати не треба, і він\nкаже, які з ключів у вашому проєкті вже публічні.\n",[28,280,282],{"href":281},"\u002Fchecklist","Десятихвилинний чекліст безпеки"," охоплює решту того, що варто\nперевірити у щойно запущеному застосунку, а посібник простою мовою для цієї\nплатформи це\n",[28,285,287],{"href":286},"\u002Fis-your-replit-app-safe","чи безпечний ваш застосунок Replit",{"title":289,"searchDepth":290,"depth":290,"links":291},"",3,[292,294,295,296,297,298],{"id":36,"depth":293,"text":37},2,{"id":92,"depth":293,"text":93},{"id":105,"depth":293,"text":106},{"id":169,"depth":293,"text":170},{"id":210,"depth":293,"text":211},{"id":248,"depth":293,"text":249},"Основи безпеки","\u002Fblog\u002Freplit-secrets-explained\u002Fcover-1200x630.png","Логотип Replit, стрілка до замкненого сховища прихованих значень і ще одна стрілка до працюючого застосунку, який їх читає.","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.",false,"md",[306,308,311,314,317],{"q":93,"a":307},"Для того, що вони роблять, так. Replit шифрує значення й тримає їх поза вашими файлами, тож поділитися проєктом, підключити його до репозиторію чи вести стрім під час роботи більше не означає віддати ключ тим, хто дивиться. Чого інструмент вирішити не може, так це куди ваш застосунок понесе значення далі. Ключ, який читає код на машині Replit, залишається на Replit. Той самий ключ, який читає код у браузері вашого відвідувача, вбудовується в те, що ви публікуєте, і те, що ви спершу поклали його в Secrets, тут нічого не змінює.",{"q":309,"a":310},"Чому мій секрет Replit показує undefined?","Дві причини, і з вашого місця вони виглядають однаково. Або код, який його читає, працює в браузері, де немає жодного середовища для читання і в process.env нічого немає, або ваш опублікований застосунок працює у версії, розгорнутій до того, як ви створили секрет. Для другого випадку опублікуйте ще раз: працюючий застосунок використовує значення, які були на момент останньої публікації.",{"q":312,"a":313},"Чи можу я використати секрет у своєму фронтенді на React у Replit?","Покласти туди значення ви можете, і секретним воно не буде. Код React працює на машині вашого відвідувача, тож усе, що він читає, спершу треба надіслати на ту машину. Інструменти збірки роблять це явним через префікс: Vite віддає коду в браузері лише змінні, що починаються з VITE_, а Next.js лише ті, що з NEXT_PUBLIC_. Додати префікс це те, як люди змушують ключ працювати у фронтенді, і водночас момент, коли цей ключ стає публічним. Публічні ключі там доречні. Усе, що витрачає гроші або читає базу даних, належить серверу.",{"q":315,"a":316},"Чи треба додавати секрети ще раз під час публікації?","Зазвичай ні, бо секрети розгортання синхронізуються з робочим простором, але значення, яким користується ваш працюючий застосунок, це те, що було на момент останньої публікації. Секрет, доданий після неї, потрапляє в розгортання з наступною. Власна інструкція Replit для застосунку, який працює в редакторі та падає після публікації, починається саме тут, тож якщо під час розгортання чогось бракує, відкрийте секрети розгортання й перевірте, що назва там є і написана так само.",{"q":318,"a":319},"Я вставив ключ API у файл, перш ніж знайшов інструмент Secrets. Чи достатньо видалити файл?","Ні. Спершу замініть ключ у постачальника, бо саме це справді зачиняє двері, і лише потім переносьте значення в Secrets. Видалення рядка коду прибирає його з поточної версії, але не з історії проєкту й не з жодної копії вашого опублікованого застосунку, яку хтось уже має. Заміна це єдиний крок, після якого старе значення перестає працювати, і в панелі постачальника вона зазвичай займає близько хвилини.","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",[322,323,324,325,326,327],"як користуватися секретами в replit","replit secrets","replit secrets не працює","чи безпечні секрети replit","змінні середовища replit","секрет replit",{},true,"Як користуватися секретами в Replit","\u002Fblog\u002Freplit-secrets-explained","2026-08-31",{"title":5,"description":302},"blog\u002Freplit-secrets-explained",[336,337,338,339],"Як користуватися секретами в Replit: відкрийте інструмент Secrets, додайте назву та значення й читайте це значення в коді як змінну середовища.","Це тримає ключ поза вашими файлами. Поза вашим опублікованим застосунком воно його не тримає, бо все, що читає код у браузері, вбудовується в те, що завантажує кожен відвідувач.","Ознака це назва. Змінну, що починається з VITE_ або NEXT_PUBLIC_, ваш інструмент збірки поклав у браузер навмисно.","Порожній секрет в опублікованому застосунку зазвичай означає, що робочу версію опублікували раніше, ніж ви його створили. Опублікуйте ще раз.","2026-09-21","wMAbloqmhBx_7pYBQ_WQRyhN0rgU6EL2OO1i2WukbdY",[343,350,356,361,367,373,379,385,391,397,403,409,415,421,427,433,439,445,451,457,463,469,475,481,482,488,494,500,506,512,518,524,530,535,541,547,551,557,563,569,574,580],{"path":344,"title":345,"description":346,"published":347,"category":348,"image":349,"draft":303},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":351,"title":352,"description":353,"published":354,"category":299,"image":355,"draft":303},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":357,"title":358,"description":359,"published":340,"category":299,"image":360,"draft":303},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":362,"title":363,"description":364,"published":365,"category":299,"image":366,"draft":303},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":368,"title":369,"description":370,"published":371,"category":299,"image":372,"draft":303},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":374,"title":375,"description":376,"published":377,"category":299,"image":378,"draft":303},"\u002Fblog\u002Fvite-and-next-public-env-vars","Змінні оточення Vite відкриті: префікс означає опублікувати це","Змінні оточення Vite відкриті у вашому застосунку, бо так просив префікс. VITE_ і NEXT_PUBLIC_ означають опублікувати це, а ШІ, який їх додав, не знав ціни.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":380,"title":381,"description":382,"published":383,"category":299,"image":384,"draft":303},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":386,"title":387,"description":388,"published":389,"category":299,"image":390,"draft":303},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":392,"title":393,"description":394,"published":395,"category":299,"image":396,"draft":303},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":398,"title":399,"description":400,"published":401,"category":348,"image":402,"draft":303},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":404,"title":405,"description":406,"published":407,"category":348,"image":408,"draft":303},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery у Supabase: ціна та межі","Point-in-time recovery у Supabase відмотує базу на будь-яку секунду за останній тиждень. Коштує $100 на місяць понад Pro і покриває лише базу даних.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":410,"title":411,"description":412,"published":413,"category":348,"image":414,"draft":303},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":416,"title":417,"description":418,"published":419,"category":299,"image":420,"draft":303},"\u002Fblog\u002Fsafest-ai-app-builder","Який білдер застосунків з ШІ найбезпечніший? 30 998 тестів","Який білдер застосунків з ШІ найбезпечніший? Ми просканували 30 998 живих застосунків з Lovable, Base44, Replit, v0 і Bolt. Оцінку вирішує не білдер.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":422,"title":423,"description":424,"published":425,"category":299,"image":426,"draft":303},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":428,"title":429,"description":430,"published":431,"category":299,"image":432,"draft":303},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": чого не бачить попередження","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":434,"title":435,"description":436,"published":437,"category":299,"image":438,"draft":303},"\u002Fblog\u002Frotate-supabase-service-role-key","Як замінити злитий ключ service_role у Supabase","Supabase каже спершу закрити витік. Інші посібники кажуть міняти негайно. Що правильно, залежить від того, куди саме потрапив ваш ключ service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":440,"title":441,"description":442,"published":443,"category":299,"image":444,"draft":303},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":446,"title":447,"description":448,"published":449,"category":299,"image":450,"draft":303},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":452,"title":453,"description":454,"published":455,"category":299,"image":456,"draft":303},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":458,"title":459,"description":460,"published":461,"category":299,"image":462,"draft":303},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":464,"title":465,"description":466,"published":467,"category":299,"image":468,"draft":303},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Ваш ключ API OpenAI відкритий у фронтенді. Замініть його.","Ключ API OpenAI, відкритий у фронтенді, не можна прив'язати до домену. Замініть його сьогодні, перенесіть виклик на свій сервер і обмежте витрати.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":470,"title":471,"description":472,"published":473,"category":299,"image":474,"draft":303},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Ключ API у фронтенді: що насправді віддають 30 998 застосунків","Ключ API, відкритий у вашому фронтенді, зазвичай є ключем Google Maps. Ми просканували 30 998 vibe-coded застосунків і порахували, що витікає насправді.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":476,"title":477,"description":478,"published":479,"category":348,"image":480,"draft":303},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":331,"title":5,"description":302,"published":332,"category":299,"image":320,"draft":303},{"path":483,"title":484,"description":485,"published":486,"category":348,"image":487,"draft":303},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":489,"title":490,"description":491,"published":492,"category":299,"image":493,"draft":303},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":495,"title":496,"description":497,"published":498,"category":299,"image":499,"draft":303},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Де знайти API-ключі Supabase: anon, service_role і URL","URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":501,"title":502,"description":503,"published":504,"category":299,"image":505,"draft":303},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy в Supabase. Що далі?","\"New row violates row-level security policy\" означає, що Supabase відмовив у записі. Швидке виправлення знову відкриває таблицю для всіх.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":507,"title":508,"description":509,"published":510,"category":299,"image":511,"draft":303},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":513,"title":514,"description":515,"published":516,"category":348,"image":517,"draft":303},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching у Supabase це не бекап. Він іде тільки вперед.","Чому branching у Supabase це не бекап: гілка стартує без ваших даних, а мердж переносить саму лише схему. Для чого він потрібен і що брати замість нього.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":519,"title":520,"description":521,"published":522,"category":348,"image":523,"draft":303},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":525,"title":526,"description":527,"published":528,"category":299,"image":529,"draft":303},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":152,"title":531,"description":532,"published":533,"category":299,"image":534,"draft":303},"Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":536,"title":537,"description":538,"published":539,"category":348,"image":540,"draft":303},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":542,"title":543,"description":544,"published":545,"category":299,"image":546,"draft":303},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":243,"title":548,"description":549,"published":545,"category":299,"image":550,"draft":303},"Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":552,"title":553,"description":554,"published":555,"category":299,"image":556,"draft":303},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":558,"title":559,"description":560,"published":561,"category":348,"image":562,"draft":303},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":564,"title":565,"description":566,"published":567,"category":299,"image":568,"draft":303},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":570,"title":571,"description":572,"published":567,"category":348,"image":573,"draft":303},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":575,"title":576,"description":577,"published":578,"category":348,"image":579,"draft":303},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Три способи зробити резервну копію бази Supabase, і чого бракує","Панель, pg_dump і керований сервіс. Що насправді зберігає кожен спосіб, що тихо лишає осторонь і який із них переживе втрату акаунта.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":157,"title":581,"description":582,"published":578,"category":299,"image":583,"draft":303},"Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150956960]