[{"data":1,"prerenderedAt":989},["ShallowReactive",2],{"blog-uk-supabase-bucket-not-found":3,"blog-index-uk":458},{"id":4,"title":5,"body":6,"category":415,"cover":416,"coverAlt":417,"description":418,"draft":419,"extension":420,"faq":421,"image":437,"keywords":438,"meta":446,"navigation":447,"ogTitle":5,"path":448,"published":449,"seo":450,"stem":451,"tldr":452,"updated":449,"__hash__":457},"blog_uk\u002Fblog\u002Fsupabase-bucket-not-found.md","Supabase \"Bucket not found\": три речі, які це може означати",{"type":7,"value":8,"toc":402},"minimark",[9,13,16,27,30,38,43,46,49,75,78,100,104,107,112,118,121,132,135,141,145,162,165,168,174,178,181,190,193,208,213,217,220,223,226,237,241,244,254,268,271,275,278,290,297,301,304,313,331,340,357,361,389],[10,11,12],"p",{},"Ваш застосунок показує зламану картинку там, де мало бути фото. Або\nвивантаження падає, і повідомлення, яке повертається, складається з трьох слів:\n\"Bucket not found\". Тоді ви відкриваєте Supabase, ідете в Storage, а бакет\nстоїть просто там, у списку.",[10,14,15],{},"Відкрийте адресу картинки в окремій вкладці, і Storage відповість ось так:",[17,18,23],"pre",{"className":19,"code":21,"language":22},[20],"language-text","{\n  \"statusCode\": \"404\",\n  \"code\": \"NoSuchBucket\",\n  \"error\": \"Bucket not found\",\n  \"message\": \"Bucket not found\"\n}\n","text",[24,25,21],"code",{"__ignoreMap":26},"",[10,28,29],{},"Це тіло, яке сьогодні будує власний вихідний код Supabase Storage, прочитаний\n17 жовтня 2026 року. Supabase \"Bucket not found\" покриває цим одним тілом три\nрізні ситуації, і в першій із них бакет лежить точно там, де ви його залишили.",[10,31,32,33,37],{},"Ось що посібник за посібником подає хибно: ",[34,35,36],"strong",{},"перше виправлення, яке ви\nзнайдете, це зробити бакет публічним, і коли воно спрацьовує, то тому, що\nкожен файл у цьому бакеті теж стає публічним."," Для двох із трьох причин воно\nне змінює взагалі нічого. Для тієї, що лишається, воно міняє зламану картинку\nна бакет, з якого може читати будь-хто з адресою файлу.",[39,40,42],"h2",{"id":41},"що-означає-supabase-bucket-not-found","Що означає Supabase \"Bucket not found\"?",[10,44,45],{},"Storage шукав бакет саме з тією назвою, що у вашому запиті, у проєкті, до якого\nдійшов ваш запит, і не знайшов жодного, який погодився б віддати цьому запиту.",[10,47,48],{},"Остання частина там тому, що в бакета більше ніж одні двері, і кожні двері\nставлять питання по-своєму. Вихідний код Storage показує троє з них:",[50,51,52,63,69],"ul",{},[53,54,55,58,59,62],"li",{},[34,56,57],{},"Публічна адреса файлу",", та, яку створює ",[24,60,61],{},"getPublicUrl",". Ці двері\nвраховують тільки бакети, позначені як публічні, тож приватний бакет тут \"не\nзнайдено\", хоч він і існує.",[53,64,65,68],{},[34,66,67],{},"Вивантаження."," Ці двері враховують кожен бакет у проєкті, приватні теж.\n\"Не знайдено\" тут означає, що такої назви в цьому проєкті справді немає.",[53,70,71,74],{},[34,72,73],{},"Запит на список файлів бакета."," Ці двері ніколи не кажуть \"Bucket not\nfound\". Бакет, якого не існує, відповідає порожнім списком, тією самою\nвідповіддю, що й порожній бакет, і ми бачимо це ззовні щоразу, коли питає наш\nсканер.",[10,76,77],{},"Тож перше завдання це з'ясувати, через які двері зайшов запит, що впав.",[10,79,80,83,84,87,88,91,92,95,96,99],{},[34,81,82],{},"Два числа в цьому повідомленні суперечать одне одному, і це плутає обробку\nпомилок."," Тіло каже ",[24,85,86],{},"\"statusCode\": \"404\"",", тоді як сам запит падає з\nHTTP-статусом 400. Storage надсилає цю помилку з кодом 400 і тримає свій\nвласний 404 усередині тіла. Бібліотека supabase-js передає обидва у ваш код:\n",[24,89,90],{},"error.status"," дорівнює 400, а ",[24,93,94],{},"error.statusCode"," дорівнює ",[24,97,98],{},"\"404\"",". Код, який\nваш білдер написав, щоб ловити 404, цю помилку пропустить.",[39,101,103],{"id":102},"причина-1-публічне-посилання-на-приватний-бакет","Причина 1: публічне посилання на приватний бакет",[10,105,106],{},"Саме ця причина стоїть за зламаними картинками. Адресу збудували для\nпублічного бакета, а бакет приватний.",[10,108,109,111],{},[24,110,61],{}," нічого не питає в Supabase. Він складає адресу вашого проєкту,\nназву бакета й назву файлу в посилання, усередині вашого застосунку, і віддає\nйого вам. Примітка над цією функцією у власній клієнтській бібліотеці Supabase\nкаже це двома реченнями:",[113,114,115],"blockquote",{},[10,116,117],{},"Ця функція не перевіряє, чи бакет публічний. Якщо публічну URL-адресу\nстворено для бакета, який не є публічним, ви не зможете завантажити файл.",[10,119,120],{},"Пізніше браузер відвідувача просить це посилання, і Storage шукає бакет тільки\nсеред публічних бакетів. Приватний бакет не проходить цей пошук так само, як\nвідсутній, і відповідь звучить \"Bucket not found\".",[10,122,123,124,127,128,131],{},"Цю причину можна впізнати з самого посилання. Публічна адреса файлу містить\n",[24,125,126],{},"\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002F",", а за ним назву бакета. Якщо цей бакет не має\nпозначки публічного в ",[34,129,130],{},"Storage → Buckets",", посилання не відкрилося б ніколи,\nхоч як пиши назву.",[10,133,134],{},"Нові бакети стартують приватними, тож налаштування поводиться саме так, як\nзадумано. Сталося те, що код, ваш або вашого білдера, написали для публічного\nбакета і спрямували на приватний.",[136,137],"diagram",{"alt":138,"caption":139,"src":140},"Сховище картинок зі значком замка і двома отворами в лівій стіні. Картка з getPublicUrl посилає бурштинову стрілку до верхнього отвору, перекритого засувом, над яким стоїть хрестик. Картка з createSignedUrl посилає бірюзову стрілку до нижнього отвору, засув якого піднятий, а картинка виходить з іншого боку сховища до людини поруч із галочкою.","Один приватний бакет, два способи попросити файл. Публічну адресу розвертають біля дверей, а підписане посилання пропускають до того самого файлу.","\u002Fblog\u002Fsupabase-bucket-not-found\u002Ftwo-doors-1600x720.png",[39,142,144],{"id":143},"причина-2-назва-яка-не-зовсім-збігається-з-назвою-бакета","Причина 2: назва, яка не зовсім збігається з назвою бакета",[10,146,147,148,151,152,155,156,151,159,161],{},"Storage порівнює назву бакета символ за символом, тож ",[24,149,150],{},"Avatars"," і ",[24,153,154],{},"avatars"," це\nдва різні бакети, так само як ",[24,157,158],{},"avatar",[24,160,154],{},".",[10,163,164],{},"У вихідному коді Storage пошук це звичайна рівність за id бакета. Великі\nлітери мають значення, пропущена літера має значення, і дефіс там, де в бакеті\nпідкреслення, теж має значення. Кожен із цих випадків повертається тими самими\nтрьома словами.",[10,166,167],{},"Застосунок, збудований за допомогою ШІ-інструмента, може опинитися тут без\nжодної помилки у введенні. Код, який вивантажує чи показує файл, пишуть на\nодному кроці, а бакет, який він називає, мають створити на іншому. Якщо цей\nдругий крок так і не відбувся, або відбувся з трохи іншою назвою, код просить\nбакет, якого ніхто не створив.",[10,169,170,171,173],{},"Для перевірки потрібні два списки. Відкрийте ",[34,172,130],{}," і запишіть\nназву кожного бакета точно так, як вона там написана. Потім скажіть своєму\nбілдеру простими словами: перелічи кожну назву бакета Storage, яку використовує\nцей застосунок, і покажи, де використовується кожна. Будь-яка назва з його\nсписку, якої немає у вашому, і є та, що падає.",[39,175,177],{"id":176},"причина-3-бакет-лежить-в-іншому-проєкті","Причина 3: бакет лежить в іншому проєкті",[10,179,180],{},"Ваш застосунок говорить рівно з одним проєктом Supabase, тим, що в його адресі\nSupabase, і бакета, створеного в будь-якому іншому проєкті, для вашого\nзастосунку просто не існує.",[10,182,183,184,189],{},"Найчіткіше ця причина видна під час вивантаження. Під час вивантаження Storage\nшукає бакет у всьому проєкті, не застосовуючи ваших правил доступу, тож \"Bucket\nnot found\" при вивантаженні ніколи не є проблемою дозволів. Коли бакет існує, а\nваші правила відхиляють файл, Storage відповідає\n",[185,186,188],"a",{"href":187},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","іншим повідомленням, про row-level security",".\nОтже, \"Bucket not found\" при вивантаженні означає, що такої назви немає в\nпроєкті, куди пише ваш застосунок.",[10,191,192],{},"Є цілком звичайні шляхи до двох проєктів: тестовий проєкт поруч із робочим,\nкопія застосунку, підключена до свіжого проєкту, проєкт, створений вручну, щоб\nщось спробувати. Бакет створюється в тому, який на ту мить був відкритий у\nпанелі.",[10,194,195,196,199,200,203,204,207],{},"Перевірка це порівняння двох коротких рядків. Адреса Supabase вашого\nзастосунку має вигляд ",[24,197,198],{},"https:\u002F\u002F\u003Cref>.supabase.co",", і частина перед\n",[24,201,202],{},".supabase.co"," це референс проєкту. Адреса вашої панелі містить той самий\nреференс після ",[24,205,206],{},"\u002Fproject\u002F",". Якщо вони різні, ви дивитеся на один проєкт, поки\nваш застосунок говорить з іншим.",[136,209],{"alt":210,"caption":211,"src":212},"Ліворуч вікно застосунку з бірюзовою стрілкою до проєкту, чий референс збігається з його власним. У цьому проєкті два тьмяні бакети і пунктирний контур там, де мав би бути третій, позначений бурштиновим хрестиком. Праворуч окремий проєкт з іншим референсом містить сам бакет, підсвічений бірюзовим, і ніщо не з'єднує його із застосунком.","Бакет існує. Його створили в проєкті праворуч, а кожен запит вашого застосунку йде до того, що ліворуч.","\u002Fblog\u002Fsupabase-bucket-not-found\u002Ftwo-projects-1600x700.png",[39,214,216],{"id":215},"чи-варто-робити-бакет-публічним-щоб-це-виправити","Чи варто робити бакет публічним, щоб це виправити?",[10,218,219],{},"Тільки якщо кожен файл у бакеті призначений будь-кому, хто має його адресу, і\nтільки для першої причини. Для неправильної назви чи не того проєкту перемикач\nне змінює нічого.",[10,221,222],{},"Публічний бакет робить одну річ, і документація Supabase описує її одним\nрядком: будь-хто, хто має адресу файлу, може його відкрити. Вхід тут ніяк не\nзадіяний. Власні приклади Supabase це аватари, публічні медіа та вміст дописів\nу блозі, і логотипи чи фото товарів належать до тієї ж групи.",[10,224,225],{},"Для рахунків, сканів документів, експортів чи будь-чого, що належить одній\nлюдині, це хибне налаштування. Перемикач діє на весь бакет і на кожен файл, що\nпотрапить туди пізніше, зокрема на файли з функції, яку ви ще не збудували.",[10,227,228,229,232,233,236],{},"Той самий короткий шлях має двійника на боці правил, і саме його ми вимірюємо.\nПравило на ",[24,230,231],{},"storage.objects",", яке називає тільки бакет, змушує завантаження\nпрацювати для всіх і заразом віддає список назв у бакеті. Ми просканували\n8 435 живих застосунків, що називають проєкт Supabase. Перевірка бакетів\nотримала відповідь від 4 703 з них, і ",[34,234,235],{},"792 відповіли на наш запит списку\nназвами того, що лежало всередині",", без жодного входу. Це приблизно кожен\nшостий із застосунків, які ми змогли запитати. Коли бакет публічний і його\nсписок теж відкритий, кожна назва в цьому списку це робоче посилання.",[39,238,240],{"id":239},"як-показати-приватний-файл-не-роблячи-його-публічним","Як показати приватний файл, не роблячи його публічним",[10,242,243],{},"Дайте сторінці підписане посилання: адресу, яка працює стільки секунд, скільки\nви оберете, а потім перестає працювати.",[10,245,246,247,250,251,253],{},"Документація Supabase називає два способи дістати файл із приватного бакета.\nПерший це завантаження, яке несе сесію людини, що увійшла. Другий це\n",[24,248,249],{},"createSignedUrl",", який створює посилання, \"до якого можна отримати доступ\nпротягом обмеженого часу\". Саме другий заступає ",[24,252,61],{}," скрізь, де\nсторінка показує картинку.",[10,255,256,257,260,261,263,264,267],{},"Підписане посилання теж підкоряється вашим правилам. Перш ніж Storage щось\nпідпише, його вихідний код перевіряє, чи має людина, яка просить, право читати\nцей файл, тож приватному бакету потрібне правило ",[24,258,259],{},"select"," на ",[24,262,231],{},",\nяке каже, хто що може читати.\n",[185,265,266],{"href":187},"Помилка вивантаження пояснює, як пишуться такі правила",",\nзокрема чому правило читання, яке називає тільки бакет, відкриває і його\nсписок.",[10,269,270],{},"Щоб передати це своєму білдеру, простими словами: для бакета, через який\nвиникає помилка \"Bucket not found\", заміни getPublicUrl на createSignedUrl,\nзалиш бакет приватним і додай policy для Storage, яка дозволяє кожній людині\nчитати тільки ті файли, які їй належить бачити. Потім перезавантажте сторінку,\nде була зламана картинка.",[39,272,274],{"id":273},"що-ваші-бакети-показують-стороннім-просто-зараз","Що ваші бакети показують стороннім просто зараз",[10,276,277],{},"Два екрани в панелі кажуть вам, що ви налаштували, а одна перевірка ззовні\nкаже, що отримує сторонній.",[10,279,280,282,283,286,287,289],{},[34,281,130],{}," показує, які бакети публічні. Для кожного публічного\nзапитайте себе, чи кожен файл у ньому ви показали б сторонньому. ",[34,284,285],{},"Storage →\nPolicies"," показує правила. Правило ",[24,288,259],{},", єдина умова якого це назва\nбакета, дозволяє будь-кому читати цей бакет, разом зі списком файлів.",[10,291,292,293,161],{},"Наше безкоштовне сканування просить ваш живий проєкт про список файлів кожного\nбакета, використовуючи тільки ключ, який уже є в коді вашого застосунку, як\nзробив би сторонній, і каже, які бакети відповіли назвами. Воно читає назви і\nніколи не завантажує файлів. Це займає близько 20 секунд і не потребує\nоблікового запису: ",[185,294,296],{"href":295},"\u002Fsecurity-scanner","проскануйте свій застосунок",[39,298,300],{"id":299},"як-тримати-файли-там-де-ви-їх-поклали","Як тримати файли там, де ви їх поклали",[10,302,303],{},"Після сьогоднішнього виправлення ще можуть зрушити дві речі: хтось перемкне\nналаштування, ганяючись за іншим багом, і буде видалено файл, який комусь був\nпотрібен.",[10,305,306],{},[34,307,308,312],{},[185,309,311],{"href":310},"\u002Fwebsite-monitoring","Reeve Monitor"," і далі перевіряє ззовні:",[50,314,315,318,321,328],{},[53,316,317],{},"повна перевірка безпеки, повторювана за розкладом, разом із перевіркою списку бакетів",[53,319,320],{},"чи працює ваш застосунок",[53,322,323,324,327],{},"повідомлення, коли результат ",[34,325,326],{},"змінюється",", щоб бакет, який відкрився вночі, не чекав, поки ви глянете",[53,329,330],{},"щомісячний звіт простою мовою про те, що він бачив",[10,332,333],{},[34,334,335,339],{},[185,336,338],{"href":337},"\u002Fsupabase-backups","Reeve Care"," тримає копію того, що там лежить:",[50,341,342,345,348,351,354],{},[53,343,344],{},"зашифрована копія вашої бази даних Supabase за розкладом, у власному сховищі Reeve в ЄС, поза вашим обліковим записом Supabase",[53,346,347],{},"кожна копія перевірена, перш ніж зарахуватися, підрахунком рядків у кожній таблиці",[53,349,350],{},"ваші вивантажені файли теж, щойно ви підключите доступ до Storage",[53,352,353],{},"відновлення в один клік, із безпечною копією поточного стану, зробленою заздалегідь",[53,355,356],{},"усе, що робить Monitor",[39,358,360],{"id":359},"що-зробити-сьогодні","Що зробити сьогодні",[362,363,364],"key-takeaways",{},[50,365,366,372,375,378,381],{},[53,367,368,369,371],{},"Відкрийте посилання, що не працює, в окремій вкладці. Якщо адреса містить ",[24,370,126],{},", а бакет приватний, це перша причина.",[53,373,374],{},"Скопіюйте назву бакета зі Storage → Buckets і порівняйте її, з великими літерами включно, з назвою, яку використовує ваш застосунок.",[53,376,377],{},"Порівняйте референс проєкту в адресі Supabase вашого застосунку з тим, що в адресі вашої панелі.",[53,379,380],{},"Тримайте бакет приватним, якщо тільки кожен файл у ньому не призначений будь-кому з його адресою, і віддавайте приватні файли через підписані посилання.",[53,382,383,384,260,386,388],{},"Прочитайте кожне правило ",[24,385,259],{},[24,387,231],{},". Те, що називає тільки бакет, віддає також список файлів.",[10,390,391,392,396,397,401],{},"Почніть із запиту, який упав, бо двері, якими він зайшов, кажуть вам, яку з\nтрьох причин перевіряти. ",[185,393,395],{"href":394},"\u002Fchecklist","Чекліст безпеки на 10 хвилин"," охоплює\nте, що щойно запущений застосунок зазвичай лишає відкритим окрім цього, а\n",[185,398,400],{"href":399},"\u002Fblog\u002Fsupabase-storage-bucket-public","що відкриває публічний бакет"," це\nнаступне читання, якщо якийсь із ваших бакетів виявився публічним.",{"title":26,"searchDepth":403,"depth":403,"links":404},3,[405,407,408,409,410,411,412,413,414],{"id":41,"depth":406,"text":42},2,{"id":102,"depth":406,"text":103},{"id":143,"depth":406,"text":144},{"id":176,"depth":406,"text":177},{"id":215,"depth":406,"text":216},{"id":239,"depth":406,"text":240},{"id":273,"depth":406,"text":274},{"id":299,"depth":406,"text":300},{"id":359,"depth":406,"text":360},"Основи безпеки","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcover-1200x630.png","Полиця з бакетами, один замкнений на замок. Попереду бурштинова бирка з адресою, чия пунктирна лінія впирається в засув перед ним.","Supabase \"Bucket not found\" означає одне з трьох: публічне посилання на приватний бакет, неточну назву або не той проєкт.",false,"md",[422,425,428,431,434],{"q":423,"a":424},"Чому Supabase каже, що мого бакета не знайдено, якщо я його бачу?","Бо Storage шукає бакет по-різному залежно від запиту. Публічну адресу файлу, ту, яку створює getPublicUrl, він шукає тільки серед публічних бакетів, тож приватний бакет, який ви бачите в панелі, там вважається не знайденим. Якщо ж помилка прийшла з вивантаження, назва у вашому коді не збігається точно з жодним бакетом у проєкті, до якого підключений ваш застосунок.",{"q":426,"a":427},"Чи розрізняє назва бакета в Supabase великі й малі літери?","Так. Storage порівнює назву символ за символом, тож Avatars і avatars це два різні бакети, так само як avatar і avatars. Скопіюйте назву зі Storage → Buckets у своїй панелі й порівняйте її з назвою, яку використовує ваш застосунок.",{"q":429,"a":430},"Чи робити бакет публічним, щоб виправити \"Bucket not found\"?","Тільки якщо кожен файл у ньому призначений будь-кому, хто має його адресу, наприклад аватари чи фото товарів. Публічний означає, що будь-хто з адресою файлу може відкрити цей файл без входу. Помилку це виправляє тільки тоді, коли публічне посилання створили для приватного бакета; неправильна назва чи не той проєкт лишаються зламаними в будь-якому разі. Для файлів, що належать одній людині, залиште бакет приватним і використовуйте підписане посилання.",{"q":432,"a":433},"Як показати файл із приватного бакета?","Через підписане посилання. createSignedUrl створює адресу, яка працює стільки секунд, скільки ви оберете, а потім перестає, і вона заступає getPublicUrl скрізь, де сторінка показує файл. Той, хто просить посилання, мусить мати право читати файл, тож бакету потрібне правило select на storage.objects, яке каже, хто що може читати.",{"q":435,"a":436},"Чому помилка каже 404, якщо запит упав із 400?","Supabase Storage надсилає цю помилку з HTTP-статусом 400 і кладе свій власний статус, 404, у тіло як statusCode. У supabase-js це приходить як error.status 400 і error.statusCode \"404\", і саме тому код, написаний ловити 404, цю помилку просто пропускає.","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",[439,440,441,442,443,444,445],"supabase bucket not found","supabase storage bucket not found","bucket not found getpublicurl","supabase публічне посилання bucket not found","supabase вивантаження bucket not found","supabase storage 404","supabase підписане посилання приватний бакет",{},true,"\u002Fblog\u002Fsupabase-bucket-not-found","2026-10-17",{"title":5,"description":418},"blog\u002Fsupabase-bucket-not-found",[453,454,455,456],"Supabase \"Bucket not found\" означає, що Storage шукав бакет саме з такою назвою, у проєкті, до якого дійшов ваш запит, і не знайшов жодного, який погодився б віддати цьому запиту. Сам бакет при цьому може спокійно стояти у вашій панелі.","Посилання, створене через getPublicUrl для приватного бакета, дає цю помилку, коли його відкривають, бо Storage віддає такі посилання тільки з публічних бакетів.","Під час вивантаження це означає, що такої назви в цьому проєкті немає. Перевірте написання й великі літери, а потім те, на який проєкт дивиться ваш застосунок.","Публічний бакет прибирає повідомлення і дає змогу будь-кому, хто має адресу файлу, цей файл відкрити. Для файлів, що належать одній людині, використовуйте підписане посилання.","OEWiWU9A1b7EFcsDPKjVpChkMvl1voShsVsacgDqI-c",[459,465,471,477,483,489,495,501,507,513,519,526,532,538,544,550,556,562,568,574,580,586,592,598,599,605,611,617,623,629,634,640,646,652,658,664,670,676,682,688,694,700,706,712,718,724,729,735,741,747,753,759,765,771,777,783,789,795,801,807,813,819,825,831,837,843,849,855,861,867,873,879,885,891,897,903,909,915,921,927,932,938,944,950,955,961,967,973,978,984],{"path":460,"title":461,"description":462,"published":463,"category":415,"image":464,"draft":419},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\": пояснення","Supabase \"max client connections reached\": у пулера немає місця ще для одного клієнта. Ліміт визначає порт у вашому рядку підключення.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":466,"title":467,"description":468,"published":469,"category":415,"image":470,"draft":419},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Помилка Supabase: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\": вхід через Google вимкнено у вашому проєкті Supabase. Як увімкнути та виправити redirect_uri_mismatch.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":472,"title":473,"description":474,"published":475,"category":415,"image":476,"draft":419},"\u002Fblog\u002Fviolates-foreign-key-constraint","Помилка Supabase \"violates foreign key constraint\" під час вставки","Supabase \"insert or update on table violates foreign key constraint\": ваш рядок посилається на рядок, якого немає. Який, чому і як це виправити.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":478,"title":479,"description":480,"published":481,"category":415,"image":482,"draft":419},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Помилка Supabase \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": обовʼязковий стовпець прийшов порожнім. Звідки взявся null і як це виправити.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":484,"title":485,"description":486,"published":487,"category":415,"image":488,"draft":419},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": куди поділася сесія","\"Auth session missing!\" означає, що supabase-js не знайшла жодної сесії й навіть не спитала Supabase. Куди поділася сесія і як це виправити.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":490,"title":491,"description":492,"published":493,"category":415,"image":494,"draft":419},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": ніхто не ввійшов","\"invalid claim: missing sub claim\": Supabase Auth отримав справжній токен без жодного користувача, ключ проєкту замість сесії.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":496,"title":497,"description":498,"published":499,"category":415,"image":500,"draft":419},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": справжня причина","\"Failed to send a request to the Edge Function\": браузер не отримав відповіді, яку можна прочитати. Його консоль каже, чому, і чи ваша функція запускалася.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":502,"title":503,"description":504,"published":505,"category":415,"image":506,"draft":419},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Чому Supabase перенаправляє посилання з листів на localhost:3000","Якщо Supabase перенаправляє на localhost:3000, Site URL так і не змінили або вашої адреси немає в Redirect URLs. Як виправити і якої маски уникати.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":508,"title":509,"description":510,"published":511,"category":415,"image":512,"draft":419},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" на новому посиланні","На посиланні, надісланому хвилину тому, \"Email link is invalid or has expired\" у Supabase зазвичай означає, що поштовий фільтр використав його першим.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":514,"title":515,"description":516,"published":517,"category":415,"image":518,"draft":419},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\": пояснення","Supabase \"canceling statement due to statement timeout\": запит перевищив ліміт своєї ролі, 3 секунди для відвідувача. Спершу перевірте політику RLS.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":520,"title":521,"description":522,"published":523,"category":524,"image":525,"draft":419},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" у Supabase і що зникає разом","\"Database error deleting user\" у Supabase: ваша база відмовилася видаляти. Причина в логах, а виправлення вирішує, що ще буде видалено.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":527,"title":528,"description":529,"published":530,"category":415,"image":531,"draft":419},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" у Supabase","Вебхук Stripe в Edge Function Supabase пише \"No signatures found matching the expected signature\"? Причин дві. Не вимикайте перевірку.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":533,"title":534,"description":535,"published":536,"category":415,"image":537,"draft":419},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" у Supabase: три причини","Supabase відповідає \"Invalid login credentials\" на неправильний пароль, невідому пошту й акаунт Google. Як зрозуміти, що саме.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":539,"title":540,"description":541,"published":542,"category":415,"image":543,"draft":419},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": справжня помилка","\"Edge Function returned a non-2xx status code\" означає, що ваша функція Supabase відповіла помилкою. Ось де прочитати справжню.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":545,"title":546,"description":547,"published":548,"category":415,"image":549,"draft":419},"\u002Fblog\u002Fcertificate-not-trusted","Сертифікат не довірений: три причини, крім закінчення строку","Сертифікат не довірений, хоча дата в порядку? Він називає іншу адресу, підписав сам себе або в його ланцюжку бракує ланки. Як зрозуміти, що саме.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":551,"title":552,"description":553,"published":554,"category":415,"image":555,"draft":419},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": що в лапках","Supabase \"invalid input syntax for type uuid\" означає, що застосунок надіслав щось, що не є id. Прочитайте лапки, притримайте запит, залиште колонку.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":557,"title":558,"description":559,"published":560,"category":415,"image":561,"draft":419},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\": пояснення","Supabase \"duplicate key value violates unique constraint\": значення вже зайняте. Знайдіть стовпець, оберіть виправлення й сховайте значення від очей.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":563,"title":564,"description":565,"published":566,"category":415,"image":567,"draft":419},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", хоча таблиця на місці","Supabase \"relation does not exist\" або PGRST205: жодна таблиця не має такої назви в цій схемі. Чотири перевірки, і на що зважити, відкриваючи схему.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":569,"title":570,"description":571,"published":572,"category":415,"image":573,"draft":419},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" показує назви аргументів, які надіслав ваш застосунок. Порівняйте їх із функцією.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":575,"title":576,"description":577,"published":578,"category":415,"image":579,"draft":419},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" зазвичай означає, що назва не збігається. Чотири перевірки і рядок для перезавантаження.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":581,"title":582,"description":583,"published":584,"category":415,"image":585,"draft":419},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": два ліміти, один код помилки","Supabase \"Email Rate Limit Exceeded\" обмежує кожен лист вашого проєкту: 2 на годину з вбудованим відправником. Що враховується і як підняти ліміт.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":587,"title":588,"description":589,"published":590,"category":415,"image":591,"draft":419},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 причини","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" виводить ваших користувачів із системи. Три причини і як лог Auth їх розрізняє.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":593,"title":594,"description":595,"published":596,"category":415,"image":597,"draft":419},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": три причини","Supabase \"permission denied for schema public\" означає, що бракує GRANT на схему. Що його прибрало і який рядок його повертає.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":448,"title":5,"description":418,"published":449,"category":415,"image":437,"draft":419},{"path":600,"title":601,"description":602,"published":603,"category":415,"image":604,"draft":419},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: який ключ перестав працювати?","Помилка Supabase invalid JWT — це PGRST301: підписаний токен не пройшов перевірку. У новому проєкті йдеться про сесію, а не про ключ API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":606,"title":607,"description":608,"published":609,"category":415,"image":610,"draft":419},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" майже завжди означає нуль","Supabase повертає PGRST116, \"JSON object requested, multiple (or no) rows returned\", коли запит нічого не знайшов. Прихований рядок має вигляд відсутнього.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":612,"title":613,"description":614,"published":615,"category":415,"image":616,"draft":419},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" у Supabase: де шукати","\"Database error saving new user\" означає, що щось причеплене до вашої реєстрації в Supabase впало. Справжня помилка лежить у ваших логах.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":618,"title":619,"description":620,"published":621,"category":415,"image":622,"draft":419},"\u002Fblog\u002Fwhat-is-supabase","Що таке Supabase? База даних, яку обрав ваш білдер","Що таке Supabase: база даних, вхід і сховище файлів за вашим застосунком. Supabase тримає сервери, а правила про те, хто читає ваші рядки, ваші.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":624,"title":625,"description":626,"published":627,"category":415,"image":628,"draft":419},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Відкритий у фронтенді ключ AWS це не те саме, що ключ OpenAI","Ключ доступу AWS, відкритий у вашому фронтенді, читає і пише ваше сховище. Рішення зазвичай presigned URL, а не новий ключ.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":187,"title":630,"description":631,"published":632,"category":415,"image":633,"draft":419},"\"Row-level security policy for table objects\" при вивантаженні","\"New row violates row-level security policy for table objects\" означає, що вашому вивантаженню бракує правила insert. Публічний бакет його не додає.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":635,"title":636,"description":637,"published":638,"category":415,"image":639,"draft":419},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":641,"title":642,"description":643,"published":644,"category":415,"image":645,"draft":419},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":647,"title":648,"description":649,"published":650,"category":415,"image":651,"draft":419},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" без вимкнення RLS","\"Infinite recursion detected in policy for relation\" означає, що ваша policy запитала таблицю, яку вона захищає. Ось як розірвати коло.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":653,"title":654,"description":655,"published":656,"category":415,"image":657,"draft":419},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" у Supabase, і хибне виправлення","\"No API key found in request\" означає, що запит дійшов до Supabase без ключа. Більшість відповідей натомість вказують на правила вашої бази.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":659,"title":660,"description":661,"published":662,"category":415,"image":663,"draft":419},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":665,"title":666,"description":667,"published":668,"category":415,"image":669,"draft":419},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Сховати ключ API: перенесіть його в Supabase Edge Function","Сховати ключ API означає прибрати його з браузера, а Supabase Edge Function це найменше місце, куди його покласти. Два кроки поруч важать більше.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":671,"title":672,"description":673,"published":674,"category":415,"image":675,"draft":419},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":677,"title":678,"description":679,"published":680,"category":415,"image":681,"draft":419},"\u002Fblog\u002Fis-v0-safe","Безпека v0: усі 1 790 просканованих застосунків v0 отримали A","Безпека v0 на 1 790 живих застосунках v0: усі отримали A. Лише 17 згадували базу даних, і саме це здебільшого вимірює оцінка A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":683,"title":684,"description":685,"published":686,"category":415,"image":687,"draft":419},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":689,"title":690,"description":691,"published":692,"category":415,"image":693,"draft":419},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":695,"title":696,"description":697,"published":698,"category":415,"image":699,"draft":419},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Чи шифрує Supabase мої дані? Так. Ось від чого це захищає","Чи шифрує Supabase дані? Так: AES-256 у стані спокою, TLS під час передавання, SOC 2 та ISO 27001. Що покриває кожне і який витік не зупиняє жодне.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":701,"title":702,"description":703,"published":704,"category":415,"image":705,"draft":419},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":707,"title":708,"description":709,"published":710,"category":524,"image":711,"draft":419},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":713,"title":714,"description":715,"published":716,"category":524,"image":717,"draft":419},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":719,"title":720,"description":721,"published":722,"category":524,"image":723,"draft":419},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":725,"title":726,"description":727,"published":722,"category":415,"image":728,"draft":419},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":730,"title":731,"description":732,"published":733,"category":415,"image":734,"draft":419},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":736,"title":737,"description":738,"published":739,"category":415,"image":740,"draft":419},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":742,"title":743,"description":744,"published":745,"category":524,"image":746,"draft":419},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":748,"title":749,"description":750,"published":751,"category":415,"image":752,"draft":419},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":754,"title":755,"description":756,"published":757,"category":415,"image":758,"draft":419},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":760,"title":761,"description":762,"published":763,"category":415,"image":764,"draft":419},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":766,"title":767,"description":768,"published":769,"category":415,"image":770,"draft":419},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":772,"title":773,"description":774,"published":775,"category":415,"image":776,"draft":419},"\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":778,"title":779,"description":780,"published":781,"category":415,"image":782,"draft":419},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":784,"title":785,"description":786,"published":787,"category":415,"image":788,"draft":419},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":790,"title":791,"description":792,"published":793,"category":415,"image":794,"draft":419},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":796,"title":797,"description":798,"published":799,"category":524,"image":800,"draft":419},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":802,"title":803,"description":804,"published":805,"category":524,"image":806,"draft":419},"\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":808,"title":809,"description":810,"published":811,"category":524,"image":812,"draft":419},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":814,"title":815,"description":816,"published":817,"category":415,"image":818,"draft":419},"\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":820,"title":821,"description":822,"published":823,"category":415,"image":824,"draft":419},"\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":826,"title":827,"description":828,"published":829,"category":415,"image":830,"draft":419},"\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":832,"title":833,"description":834,"published":835,"category":415,"image":836,"draft":419},"\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":838,"title":839,"description":840,"published":841,"category":415,"image":842,"draft":419},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Вісім інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":844,"title":845,"description":846,"published":847,"category":415,"image":848,"draft":419},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":850,"title":851,"description":852,"published":853,"category":415,"image":854,"draft":419},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":856,"title":857,"description":858,"published":859,"category":415,"image":860,"draft":419},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":862,"title":863,"description":864,"published":865,"category":415,"image":866,"draft":419},"\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":868,"title":869,"description":870,"published":871,"category":415,"image":872,"draft":419},"\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":874,"title":875,"description":876,"published":877,"category":524,"image":878,"draft":419},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":880,"title":881,"description":882,"published":883,"category":415,"image":884,"draft":419},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":886,"title":887,"description":888,"published":889,"category":524,"image":890,"draft":419},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":892,"title":893,"description":894,"published":895,"category":415,"image":896,"draft":419},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":898,"title":899,"description":900,"published":901,"category":415,"image":902,"draft":419},"\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":904,"title":905,"description":906,"published":907,"category":415,"image":908,"draft":419},"\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":910,"title":911,"description":912,"published":913,"category":415,"image":914,"draft":419},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":916,"title":917,"description":918,"published":919,"category":524,"image":920,"draft":419},"\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":922,"title":923,"description":924,"published":925,"category":524,"image":926,"draft":419},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":399,"title":928,"description":929,"published":930,"category":415,"image":931,"draft":419},"Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":933,"title":934,"description":935,"published":936,"category":415,"image":937,"draft":419},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":939,"title":940,"description":941,"published":942,"category":524,"image":943,"draft":419},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":945,"title":946,"description":947,"published":948,"category":415,"image":949,"draft":419},"\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":951,"title":952,"description":953,"published":948,"category":415,"image":954,"draft":419},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":956,"title":957,"description":958,"published":959,"category":415,"image":960,"draft":419},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: це той самий anon key?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":962,"title":963,"description":964,"published":965,"category":524,"image":966,"draft":419},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":968,"title":969,"description":970,"published":971,"category":415,"image":972,"draft":419},"\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":974,"title":975,"description":976,"published":971,"category":524,"image":977,"draft":419},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":979,"title":980,"description":981,"published":982,"category":524,"image":983,"draft":419},"\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":985,"title":986,"description":987,"published":982,"category":415,"image":988,"draft":419},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213654442]