[{"data":1,"prerenderedAt":1184},["ShallowReactive",2],{"blog-uk-permission-denied-for-schema-public":3,"blog-index-uk":653},{"id":4,"title":5,"body":6,"category":612,"cover":613,"coverAlt":614,"description":615,"draft":616,"extension":617,"faq":618,"image":634,"keywords":635,"meta":642,"navigation":643,"ogTitle":5,"path":644,"published":645,"seo":646,"stem":647,"tldr":648,"updated":645,"__hash__":652},"blog_uk\u002Fblog\u002Fpermission-denied-for-schema-public.md","Supabase \"permission denied for schema public\": три причини",{"type":7,"value":8,"toc":598},"minimark",[9,18,21,31,38,46,51,57,86,101,115,124,130,133,137,153,162,165,171,182,186,191,198,204,213,216,220,223,229,239,242,249,252,268,273,276,280,286,298,301,305,315,343,356,360,363,366,372,398,404,424,430,446,450,453,486,493,497,500,509,527,536,553,557,592],[10,11,12,13,17],"p",{},"Учора ваш застосунок працював. Сьогодні кожен екран, що читає дані із Supabase,\nвідкривається порожнім або показує помилку, а в консолі браузера для кожного з\nних той самий рядок: ",[14,15,16],"code",{},"permission denied for schema public",". Ви відкриваєте\nдашборд Supabase, і всі таблиці на місці. SQL Editor читає їх без жодних\nнарікань.",[10,19,20],{},"Відповідь за цим рядком зазвичай приходить як 401 або 403. Якщо залишити два\nполя, що мають значення, вона виглядає так:",[22,23,28],"pre",{"className":24,"code":26,"language":27},[25],"language-text","{\n  \"code\": \"42501\",\n  \"message\": \"permission denied for schema public\"\n}\n","text",[14,29,26],{"__ignoreMap":30},"",[10,32,33,34,37],{},"Supabase \"permission denied for schema public\" походить від Postgres, бази\nданих, на якій працює Supabase, і список її причин короткий. Кожен проєкт\nSupabase створюється з GRANT, який пускає ваш застосунок до схеми ",[14,35,36],{},"public",".\nХтось або щось його прибрало, а повернути його можна одним рядком SQL.",[10,39,40,41,45],{},"Ось що легко зрозуміти навпаки: ",[42,43,44],"strong",{},"цей GRANT це вхідні двері будівлі, а замки на\nваших даних стоять далі всередині."," Якщо хтось прибрав його, щоб не пустити\nсторонніх, то разом із ними він не пустив і ваш застосунок. А чи безпечно\nвідчинити ці двері знову, залежить від внутрішніх замків, тож саме їх треба\nперевірити, перш ніж вважати проблему розвʼязаною.",[47,48,50],"h2",{"id":49},"що-означає-permission-denied-for-schema-public","Що означає \"permission denied for schema public\"?",[10,52,53,54,56],{},"Це означає, що роль, від якої прийшов запит, не має права увійти до схеми\n",[14,55,36],{},", тож Postgres відмовив ще до того, як подивився бодай на одну таблицю.",[10,58,59,62,63,65,66,69,70,73,74,77,78,81,82,85],{},[42,60,61],{},"Схема"," це іменована тека з таблицями всередині вашої бази даних. ",[14,64,36],{}," це\nта, куди Lovable, Bolt, v0, Cursor, Claude Code і Replit кладуть ваші таблиці,\nякщо їм не сказати інакше. ",[42,67,68],{},"Роль"," це тип відвідувача, від якого приходить\nзапит: ",[14,71,72],{},"anon"," означає когось, хто не увійшов, ",[14,75,76],{},"authenticated"," когось, хто\nувійшов, а ",[14,79,80],{},"service_role"," ваш власний серверний код із секретним ключем.\n",[42,83,84],{},"GRANT"," дає одній ролі один дозвіл на одну річ.",[10,87,88,89,92,93,100],{},"Дозвіл, про який ця помилка, називається ",[14,90,91],{},"USAGE",", і\n",[94,95,99],"a",{"href":96,"rel":97},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-priv.html",[98],"nofollow","документація Postgres","\nописує його як право шукати (\"look up\") обʼєкти всередині схеми. Роль без нього\nне дістанеться жодної таблиці цієї схеми, хоч би що казали налаштування самої\nтаблиці.",[10,102,103,104,108,109,111,112,114],{},"Якщо ",[94,105,107],{"href":106},"\u002Fblog\u002Fsupabase-permission-denied-for-table","табличний варіант цієї помилки","\nнавчив вас уявляти кожну таблицю кімнатою з окремими дверима для кожної ролі,\nто схема це будівля, у якій стоять ці кімнати, а ",[14,110,91],{}," її вхідні двері.\n",[14,113,16],{}," означає, що ваш запит стоїть перед ними\nнадворі. Які кімнати мають відчинені двері, не має значення, бо до жодної\nкімнати запит не доходить.",[10,116,117,118,123],{},"Supabase дає ці вхідні двері всім трьом ролям, коли створює проєкт.\n",[94,119,122],{"href":120,"rel":121},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fpostgres\u002Fblob\u002Fdevelop\u002Fmigrations\u002Fdb\u002Finit-scripts\u002F00000000000000-initial-schema.sql",[98],"Власний образ бази даних Supabase","\nвиконує цей рядок у своєму першому скрипті налаштування:",[22,125,128],{"className":126,"code":127,"language":27},[25],"grant usage on schema public to postgres, anon, authenticated, service_role;\n",[14,129,127],{"__ignoreMap":30},[10,131,132],{},"Тож якщо ваш застосунок отримує цю помилку, GRANT колись був, а тепер його\nнемає.",[47,134,136],{"id":135},"чому-sql-editor-досі-працює","Чому SQL Editor досі працює?",[10,138,139,140,145,146,149,150,152],{},"Бо SQL Editor не використовує жодної з ролей вашого застосунку. У\n",[94,141,144],{"href":142,"rel":143},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Ftracking-postgres-role-activity-to-specific-dashboard-users-8d3715",[98],"посібнику Supabase з усунення проблем","\nсказано, що запит звідти \"routed through the ",[14,147,148],{},"postgres"," role at the database\nlevel\", тобто на рівні бази даних іде через роль ",[14,151,148],{},".",[10,154,155,157,158,161],{},[14,156,148],{}," це роль, якій належать ваші таблиці, а якщо саму схему створили\nзаново з дашборду або це зробив ваш білдер, то й вона належить цій ролі.\nВласникові не потрібен GRANT, щоб увійти до власної будівлі. Тож дашборд\nпоказує кожну таблицю, ",[14,159,160],{},"select"," у SQL Editor повертає кожен рядок, а той самий\nзапит від вашого застосунку розвертають біля вхідних дверей. Ніщо на цих\nекранах не скаже вам, що ролі застосунку втратили шлях усередину.",[10,163,164],{},"Щоб побачити те, що бачить застосунок, спитайте Postgres про його ролі напряму.\nВставте це в SQL Editor:",[22,166,169],{"className":167,"code":168,"language":27},[25],"select rolname,\n       has_schema_privilege(rolname, 'public', 'USAGE') as can_enter\nfrom pg_roles\nwhere rolname in ('anon', 'authenticated', 'service_role');\n",[14,170,168],{"__ignoreMap":30},[10,172,173,174,177,178,181],{},"У кожному рядку має бути ",[14,175,176],{},"true",". Рядок із ",[14,179,180],{},"false"," означає роль, якою\nкористується ваш застосунок і яка більше не може увійти.",[47,183,185],{"id":184},"grant-відчиняє-будівлю-а-замки-всередині","GRANT відчиняє будівлю, а замки всередині",[10,187,188,190],{},[14,189,91],{}," пускає роль до таблиць схеми. Він нічого не каже про те, якими з цих\nтаблиць роль може користуватися і які рядки вона отримає.",[10,192,193,194,197],{},"За вхідними дверима стоять ще дві перевірки, і обидві належать кожній таблиці\nокремо. Власний GRANT таблиці вирішує, чи може роль узагалі користуватися цією\nтаблицею, і саме його брак повідомляє ",[14,195,196],{},"permission denied for table",". Далі Row\nLevel Security, правила для рядків, які ви, можливо, вже знаєте, вирішує, які\nрядки отримає ця роль. Postgres ставить усі три запитання в такому порядку й\nзупиняється на першій відмові.",[199,200],"diagram",{"alt":201,"caption":202,"src":203},"Три доріжки, кожна це запит від anon до однієї й тієї самої таблиці. На першій ґратчаста брама з написом public зачинена, і стрілка зупиняється біля неї з кодом 42501, ще до власних дверей таблиці. На другій брама відчинена, і стрілка зупиняється біля зачинених дверей таблиці, теж 42501. На третій брама й двері відчинені, стрілка зупиняється біля бару Row Level Security, і два рядки таблиці світяться.","Postgres перевіряє схему, потім таблицю, потім рядки й зупиняється на першій відмові. Зачинена брама розвертає запит ще до того, як він спробує двері будь-якої таблиці.","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fthree-checks-in-order-1600x760.png",[10,205,206,207,209,210,212],{},"Саме цей порядок робить GRANT на схему поганим замком. Для ролі він означає все\nабо нічого: заберіть його в ",[14,208,72],{},", і кожен екран, який бачить відвідувач, що не\nувійшов, перестане працювати одразу, зокрема сторінка входу, якщо вона читає\nбодай щось із ваших таблиць. Заберіть його в ",[14,211,76],{},", і те саме станеться\nз усіма, хто увійшов. Документація Postgres додає, що відкликання \"is not a\ncompletely secure way to prevent object access\", тобто не є цілком надійним\nспособом заборонити доступ, і що роль без нього все одно може прочитати назви\nваших таблиць у системних каталогах.",[10,214,215],{},"Якщо ви бачите цю помилку, вашому застосунку потрібна роль, якій відмовили.",[47,217,219],{"id":218},"причина-1-схему-видалили-й-створили-заново","Причина 1: схему видалили й створили заново",[10,221,222],{},"Ця причина забирає з собою найбільше. Хтось виконав ці два рядки або щось, що\nробить те саме:",[22,224,227],{"className":225,"code":226,"language":27},[25],"drop schema public cascade;\ncreate schema public;\n",[14,228,226],{"__ignoreMap":30},[10,230,231,232,235,236,238],{},"Перший рядок видаляє схему, а через ",[14,233,234],{},"cascade"," ще й кожну таблицю, представлення\nй функцію в ній. Другий створює нову, порожню ",[14,237,36],{},". Нова схема належить\nролі, яка її створила, і документація Postgres прямо каже, що типово ніхто інший\nне отримує на схему жодних привілеїв. GRANT, який Supabase виконав під час\nстворення вашого проєкту, належав старій схемі й зник разом із нею, а свій\nскрипт налаштування Supabase вдруге не запускає.",[10,240,241],{},"Ці два рядки це найкоротший спосіб спорожнити базу Postgres, тож це крок, який\nШІ-асистент може зробити, коли ви просите його почати базу з нуля або змусити\nчисто пройти міграцію, що падає.",[10,243,244,245,248],{},"Після цього ваші таблиці повертаються, якщо міграції застосунку запускаються\nзнову. ",[42,246,247],{},"Міграція"," це один із файлів зі змінами бази даних, які пише ваш\nбілдер, і запуск усіх міграцій відбудовує таблиці, які вони описують. Не\nповертається все, про що вони ніколи не згадують, а GRANT для вхідних дверей\nSupabase створив ще до появи вашої першої міграції. У міграціях, які написав\nваш білдер, його може не бути взагалі.",[10,250,251],{},"Разом зі старою схемою зникають ще дві речі:",[253,254,255,262],"ul",{},[256,257,258,261],"li",{},[42,259,260],{},"Автоматичні GRANT для нових таблиць."," Postgres зберігає їх як типові\nпривілеї (default privileges) схеми, і вони видаляються разом із нею. Таблиці,\nстворені після цього, стартують без GRANT для будь-якої з ролей застосунку.",[256,263,264,267],{},[42,265,266],{},"Рядки."," Міграції відбудовують порожні таблиці. Те, що було в старих,\nповертається лише тоді, коли хтось відновив копію, зроблену до скидання.",[199,269],{"alt":270,"caption":271,"src":272},"Два обнесені стіною двори поруч, обидва з написом public. Ліворуч початкова схема: брама відчинена, три таблиці з відчиненими дверима й освітленими рядками, а над ними мітки postgres, anon, authenticated і service_role. Праворуч відтворена схема: ті самі три таблиці з зачиненими дверима, брама зачинена, світиться лише мітка postgres, а на місці трьох інших пунктирні контури.","До скидання всі чотири ролі могли увійти до схеми. Після нього таблиці можна відбудувати, але брама і їхні двері відчиняються лише для postgres, яка їх збудувала.","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fdrop-and-create-1600x700.png",[10,274,275],{},"Якщо ваші таблиці повернулися порожніми, пошук цієї копії стоїть попереду всього\nіншого на цій сторінці.",[47,277,279],{"id":278},"причина-2-відкликання-яке-мало-захистити","Причина 2: відкликання, яке мало захистити",[10,281,282,283,285],{},"Другий шлях навмисний. Хтось прочитав, що кожна таблиця в ",[14,284,36],{}," доступна\nчерез Data API Supabase, тобто вебадресу, через яку ваш застосунок читає й\nзаписує дані, і відкликав GRANT на схему, щоб це закрити.",[10,287,288,289,294,295,297],{},"Сама тривога слушна, а інструмент обрано не той. Власний посібник Supabase із\n",[94,290,293],{"href":291,"rel":292},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fsecuring-your-api",[98],"захисту Data API","\nніколи не чіпає GRANT на схему. Він відкликає автоматичний доступ, який\nотримують нові таблиці в ",[14,296,36],{},", тож кожна нова таблиця лишається зачиненою,\nдоки хтось свідомо не дасть їй доступ. Supabase вмикає це для всіх наявних\nпроєктів 30 жовтня 2026 року.",[10,299,300],{},"Якщо GRANT на схему прибрав скрипт, який ви запустили, або асистент, якого ви\nпопросили посилити захист бази, перевірочний запит вище покаже, які ролі його\nвтратили. Поверніть його тим, якими користується ваш застосунок, а потім\nзахищайте так, як описують розділи нижче.",[47,302,304],{"id":303},"причина-3-помилка-приходить-із-міграції","Причина 3: помилка приходить із міграції",[10,306,307,308,311,312,314],{},"Якщо повідомлення зʼявляється, коли щось створює таблиці, наприклад міграція,\nдеплой або Prisma чи Drizzle налаштовують вашу базу, то бракує іншого дозволу.\nЩоб створити будь-що в схемі, потрібен ",[14,309,310],{},"CREATE"," на неї, а текст помилки, коли\nбракує ",[14,313,310],{},", той самий рядок.",[10,316,317,318,320,321,323,324,329,330,335,336,339,340,152],{},"Починаючи з Postgres 15, звичайні ролі типово більше не отримують ",[14,319,310],{}," на\n",[14,322,36],{},".\n",[94,325,328],{"href":326,"rel":327},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-schemas.html",[98],"Документація Postgres","\nкаже, що лише бази, оновлені з версії 14 або старшої, досі дають його всім. Тож\nокремий користувач бази, створений для інструмента міграцій, отримує відмову\nвже на своїй найпершій таблиці.\n",[94,331,334],{"href":332,"rel":333},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Fprisma",[98],"Посібник Supabase щодо Prisma","\nстворює користувача ",[14,337,338],{},"prisma",", і його налаштування містить\n",[14,341,342],{},"grant create on schema public to prisma",[10,344,345,346,349,350,352,353,355],{},"Рішення це GRANT ",[14,347,348],{},"create"," для одного цього користувача міграцій. Нікому з\nвідвідувачів вашого застосунку не потрібно створювати таблиці, тож ",[14,351,72],{}," і\n",[14,354,76],{}," його ніколи не отримують.",[47,357,359],{"id":358},"як-безпечно-повернути-grant","Як безпечно повернути GRANT",[10,361,362],{},"Виконайте один рядок, переконайтеся, що всі три ролі можуть увійти, а потім\nперезавантажте застосунок і прочитайте, що він скаже далі.",[10,364,365],{},"Рядок для SQL Editor:",[22,367,370],{"className":368,"code":369,"language":27},[25],"grant usage on schema public to anon, authenticated, service_role;\n",[14,371,369],{"__ignoreMap":30},[10,373,374,375,378,379,382,383,386,387,389,390,392,393,397],{},"Обмежтеся ",[14,376,377],{},"usage",". ",[14,380,381],{},"grant all on schema public"," теж прибирає помилку, але на\nсхемі ",[14,384,385],{},"all"," означає ",[14,388,377],{}," плюс ",[14,391,348],{},", тобто право додавати власні таблиці.\nSupabase радить давати кожній ролі\n",[94,394,396],{"href":291,"rel":395},[98],"мінімум, який їй потрібен",",\nа ролям ваших відвідувачів потрібно лише увійти.",[10,399,400,401,403],{},"Перевірочний запит, що вище, тепер має показати ",[14,402,176],{}," для всіх трьох ролей.\nПерезавантажте застосунок, і станеться одне з двох:",[253,405,406,412],{},[256,407,408,411],{},[42,409,410],{},"Він працює."," Вхідні двері були єдиним, чого бракувало.",[256,413,414,417,418,420,421,152],{},[42,415,416],{},"Нове повідомлення називає таблицю."," ",[14,419,196],{}," означає,\nщо бракує й власного GRANT цієї таблиці. Після першої причини цього варто\nчекати, бо відбудовані таблиці так і не отримали автоматичних GRANT. Дайте\nкожній таблиці\n",[94,422,423],{"href":106},"її GRANT, Row Level Security і правило однією зміною",[10,425,426,427,429],{},"Не піддавайтеся спокусі дати кожній ролі все на кожній таблиці, аби зникло друге\nповідомлення. Таблиця з GRANT для ",[14,428,72],{}," і вимкненим Row Level Security віддає\nкожен рядок будь-кому, хто попросить, і у вашому застосунку нічого не виглядатиме\nінакше.",[10,431,432,433,436,437,439,440,445],{},"Якщо повідомлення називає іншу схему, наприклад ",[14,434,435],{},"permission denied for schema api",", цю схему хтось створив сам, і вона так і не отримала GRANT, з якими\nстартує ",[14,438,36],{},". Посібник Supabase про\n",[94,441,444],{"href":442,"rel":443},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fusing-custom-schemas",[98],"власні схеми","\nперелічує рядки, які їй потрібні.",[47,447,449],{"id":448},"що-захищати-натомість","Що захищати натомість",[10,451,452],{},"Засоби, які тримають сторонніх подалі від ваших даних, належать кожній таблиці\nокремо, і посібник Supabase із захисту їх називає:",[454,455,456,465,474,480],"ol",{},[256,457,458,461,462,464],{},[42,459,460],{},"GRANT на кожну таблицю для тих ролей, яким він потрібен."," Таблиці\nзамовлень GRANT для ",[14,463,72],{}," не потрібен узагалі.",[256,466,467,470,152],{},[42,468,469],{},"Row Level Security на кожній таблиці, з правилом.",[94,471,473],{"href":472},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Як його увімкнути й перевірити, що він тримає",[256,475,476,479],{},[42,477,478],{},"Нові таблиці типово зачинені."," Відкликання автоматичних GRANT робить це\nвже сьогодні, а 30 жовтня зробить це за вас.",[256,481,482,485],{},[42,483,484],{},"Внутрішні таблиці поза Data API."," Посібник Supabase описує, як покласти\nте, що читає ваш застосунок, в окрему схему, щоб усе інше лежало у схемах,\nякі Data API не обслуговує.",[10,487,488,489,152],{},"Потім подивіться на результат ззовні, бо жоден із цих екранів не показує, що\nотримує сторонній. Наше безкоштовне сканування питає кожну таблицю, яку називає\nваш застосунок, скільки рядків отримав би відвідувач, що не увійшов, читає це\nчисло, не завантажуючи жодного рядка, і займає близько 20 секунд без облікового\nзапису: ",[94,490,492],{"href":491},"\u002Fsecurity-scanner","проскануйте свій застосунок",[47,494,496],{"id":495},"як-зберегти-таблиці-й-те-що-в-них","Як зберегти таблиці й те, що в них",[10,498,499],{},"Після сьогоднішнього ще дві речі можуть піти не так: пізніша зміна відкриє\nтаблицю для сторонніх, а скидання, як у першій причині, забере ваші рядки.",[10,501,502],{},[42,503,504,508],{},[94,505,507],{"href":506},"\u002Fwebsite-monitoring","Reeve Monitor"," і далі перевіряє ззовні:",[253,510,511,514,521,524],{},[256,512,513],{},"повна перевірка безпеки щогодини, до трьох застосунків",[256,515,516,517,520],{},"повідомлення, коли результат ",[42,518,519],{},"змінюється",", щоб таблиця, яка відкрилася після міграції, не чекала, поки ви глянете",[256,522,523],{},"чи працює ваш застосунок",[256,525,526],{},"щомісячний звіт простою мовою про те, що він бачив",[10,528,529],{},[42,530,531,535],{},[94,532,534],{"href":533},"\u002Fsupabase-backups","Reeve Care"," тримає копію того, що лежить у ваших таблицях:",[253,537,538,541,544,547,550],{},[256,539,540],{},"зашифрована копія вашої бази даних Supabase за розкладом, у власному сховищі Reeve в ЄС, поза вашим обліковим записом Supabase",[256,542,543],{},"кожна копія перевірена, перш ніж зарахуватися, підрахунком рядків у кожній таблиці",[256,545,546],{},"ваші вивантажені файли теж, щойно ви підключите доступ до Storage",[256,548,549],{},"відновлення в один клік, із безпечною копією поточного стану, зробленою заздалегідь",[256,551,552],{},"усе, що робить Monitor",[47,554,556],{"id":555},"що-зробити-зараз","Що зробити зараз",[558,559,560],"key-takeaways",{},[253,561,562,568,577,580,583,586],{},[256,563,564,565,567],{},"Запустіть перевірочний запит у SQL Editor. Кожна роль із ",[14,566,180],{}," це роль, яку ваш застосунок утратив.",[256,569,570,571,574,575,152],{},"Поверніть GRANT рядком ",[14,572,573],{},"grant usage on schema public to anon, authenticated, service_role;"," і обмежтеся ",[14,576,377],{},[256,578,579],{},"Якщо схему видаляли, подивіться, чи не порожні ваші таблиці, і знайдіть копію, зроблену до скидання.",[256,581,582],{},"Якщо далі зʼявиться помилка таблиці, дайте цій таблиці її GRANT, Row Level Security і правило разом.",[256,584,585],{},"Захищайте кожну таблицю окремо, там, де це можна налаштувати, і не чіпайте GRANT на схему.",[256,587,588,589,591],{},"Якщо помилка прийшла з міграції, дайте ",[14,590,348],{}," користувачеві міграцій і більше нікому.",[10,593,594,595,597],{},"Почніть із перевірочного запиту, бо один результат скаже вам, які ролі\nзастосунку втратили шлях усередину. А коли двері знову відчинені,\n",[94,596,492],{"href":491},", щоб побачити, що він віддає\nсторонньому.",{"title":30,"searchDepth":599,"depth":599,"links":600},3,[601,603,604,605,606,607,608,609,610,611],{"id":49,"depth":602,"text":50},2,{"id":135,"depth":602,"text":136},{"id":184,"depth":602,"text":185},{"id":218,"depth":602,"text":219},{"id":278,"depth":602,"text":279},{"id":303,"depth":602,"text":304},{"id":358,"depth":602,"text":359},{"id":448,"depth":602,"text":449},{"id":495,"depth":602,"text":496},{"id":555,"depth":602,"text":556},"Основи безпеки","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcover-1200x630.png","Обнесений стіною двір із таблицями бази даних, усі двері всередині відчинені й світяться, а вхідна брама зачинена, ґрати опущені.","Supabase \"permission denied for schema public\" означає, що бракує GRANT на схему. Що його прибрало і який рядок його повертає.",false,"md",[619,622,625,628,631],{"q":620,"a":621},"Що означає \"permission denied for schema public\" у Supabase?","Це означає, що роль, від якої прийшов запит, зазвичай anon або authenticated, не має права увійти до схеми public, тож Postgres відмовив ще до того, як подивився на будь-яку таблицю. Помилка має код 42501 і зазвичай доходить до застосунку як 401 або 403. Кожен проєкт Supabase стартує з цим правом, тож помилка означає, що хтось або щось його прибрало.",{"q":623,"a":624},"Чи безпечно надати usage на схему public?","Так. Кожен проєкт Supabase стартує саме з цим GRANT. Він лише пускає роль до таблиць схеми: кожній таблиці й далі потрібен власний GRANT, а Row Level Security і далі вирішує, які рядки отримає кожен відвідувач. Подивитися варто на таблиці за ним, бо таблиця з GRANT для anon і вимкненим Row Level Security віддає кожен рядок будь-кому, хто попросить.",{"q":626,"a":627},"Чим це відрізняється від \"permission denied for table\"?","Помилка схеми зупиняє запит ще до того, як він дістанеться будь-якої таблиці, тож усі таблиці схеми ламаються одночасно. Помилка таблиці стосується однієї таблиці, у якої немає GRANT для цієї ролі, а решта застосунку працює далі. Обидві мають код 42501, тож розрізнити їх можна лише за словами в повідомленні.",{"q":629,"a":630},"Чому мої таблиці працюють у SQL Editor Supabase, але не в застосунку?","Бо SQL Editor виконує ваші запити від ролі postgres, якій належать ваші таблиці і якій не потрібен GRANT, що його втратили ролі застосунку. Ваш застосунок використовує anon для відвідувачів, які не увійшли, і authenticated для тих, хто увійшов. Спитайте Postgres про ці дві ролі напряму, через has_schema_privilege, і побачите те, що бачить застосунок.",{"q":632,"a":633},"Що варто захищати замість GRANT на схему?","Таблиці. Дайте кожній таблиці GRANT лише для тих ролей, яким він потрібен, увімкніть Row Level Security з правилом на кожній таблиці й залиште нові таблиці без жодного доступу на старті. Саме цю останню частину Supabase робить типовою для наявних проєктів 30 жовтня 2026 року.","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",[16,636,637,638,639,640,641],"supabase permission denied for schema public","supabase permission denied for schema","grant usage on schema public","postgres 42501 schema public","drop schema public cascade supabase","supabase права ролі anon",{},true,"\u002Fblog\u002Fpermission-denied-for-schema-public","2026-10-18",{"title":5,"description":615},"blog\u002Fpermission-denied-for-schema-public",[649,650,651],"Supabase \"permission denied for schema public\" означає, що роль, від якої прийшов запит, не має права навіть увійти до схеми public, тож Postgres відмовив ще до того, як подивився бодай на одну таблицю.","Кожен проєкт Supabase стартує з цим правом для anon, authenticated і service_role. Якщо ваш застосунок отримує цю помилку, щось його прибрало: схему видалили й створили заново, або скрипт відкликав GRANT.","Повернути його можна одним рядком SQL. GRANT лише пускає роль до ваших таблиць, а які рядки отримає кожен відвідувач, і далі вирішує Row Level Security, тож перевірте ці правила, перш ніж вважати проблему розвʼязаною.","c93uO-IhMWWyYHf-8Ojj7fU6c8kyvNK9XwJf3hAU0Z0",[654,660,666,672,678,684,690,696,702,708,714,721,727,733,739,745,751,757,763,769,775,781,787,788,794,800,806,812,818,824,830,836,842,848,854,860,866,872,878,884,890,896,902,908,914,920,924,930,936,942,948,954,960,966,972,978,984,990,996,1002,1008,1014,1019,1025,1031,1037,1043,1049,1055,1061,1067,1073,1079,1085,1091,1097,1103,1109,1115,1121,1127,1133,1139,1145,1150,1156,1162,1168,1173,1179],{"path":655,"title":656,"description":657,"published":658,"category":612,"image":659,"draft":616},"\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":661,"title":662,"description":663,"published":664,"category":612,"image":665,"draft":616},"\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":667,"title":668,"description":669,"published":670,"category":612,"image":671,"draft":616},"\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":673,"title":674,"description":675,"published":676,"category":612,"image":677,"draft":616},"\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":679,"title":680,"description":681,"published":682,"category":612,"image":683,"draft":616},"\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":685,"title":686,"description":687,"published":688,"category":612,"image":689,"draft":616},"\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":691,"title":692,"description":693,"published":694,"category":612,"image":695,"draft":616},"\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":697,"title":698,"description":699,"published":700,"category":612,"image":701,"draft":616},"\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":703,"title":704,"description":705,"published":706,"category":612,"image":707,"draft":616},"\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":709,"title":710,"description":711,"published":712,"category":612,"image":713,"draft":616},"\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":715,"title":716,"description":717,"published":718,"category":719,"image":720,"draft":616},"\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":722,"title":723,"description":724,"published":725,"category":612,"image":726,"draft":616},"\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":728,"title":729,"description":730,"published":731,"category":612,"image":732,"draft":616},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" у Supabase: три причини","Supabase відповідає \"Invalid login credentials\" на неправильний пароль, невідому пошту й акаунт Google. Як зрозуміти, що саме.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":734,"title":735,"description":736,"published":737,"category":612,"image":738,"draft":616},"\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":740,"title":741,"description":742,"published":743,"category":612,"image":744,"draft":616},"\u002Fblog\u002Fcertificate-not-trusted","Сертифікат не довірений: три причини, крім закінчення строку","Сертифікат не довірений, хоча дата в порядку? Він називає іншу адресу, підписав сам себе або в його ланцюжку бракує ланки. Як зрозуміти, що саме.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":746,"title":747,"description":748,"published":749,"category":612,"image":750,"draft":616},"\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":752,"title":753,"description":754,"published":755,"category":612,"image":756,"draft":616},"\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":758,"title":759,"description":760,"published":761,"category":612,"image":762,"draft":616},"\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":764,"title":765,"description":766,"published":767,"category":612,"image":768,"draft":616},"\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":770,"title":771,"description":772,"published":773,"category":612,"image":774,"draft":616},"\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":776,"title":777,"description":778,"published":779,"category":612,"image":780,"draft":616},"\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":782,"title":783,"description":784,"published":785,"category":612,"image":786,"draft":616},"\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":644,"title":5,"description":615,"published":645,"category":612,"image":634,"draft":616},{"path":789,"title":790,"description":791,"published":792,"category":612,"image":793,"draft":616},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": три речі, які це може означати","Supabase \"Bucket not found\" означає одне з трьох: публічне посилання на приватний бакет, неточну назву або не той проєкт.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":795,"title":796,"description":797,"published":798,"category":612,"image":799,"draft":616},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: який ключ перестав працювати?","Помилка Supabase invalid JWT — це PGRST301: підписаний токен не пройшов перевірку. У новому проєкті йдеться про сесію, а не про ключ API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":801,"title":802,"description":803,"published":804,"category":612,"image":805,"draft":616},"\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":807,"title":808,"description":809,"published":810,"category":612,"image":811,"draft":616},"\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":813,"title":814,"description":815,"published":816,"category":612,"image":817,"draft":616},"\u002Fblog\u002Fwhat-is-supabase","Що таке Supabase? База даних, яку обрав ваш білдер","Що таке Supabase: база даних, вхід і сховище файлів за вашим застосунком. Supabase тримає сервери, а правила про те, хто читає ваші рядки, ваші.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":819,"title":820,"description":821,"published":822,"category":612,"image":823,"draft":616},"\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":825,"title":826,"description":827,"published":828,"category":612,"image":829,"draft":616},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"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":831,"title":832,"description":833,"published":834,"category":612,"image":835,"draft":616},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":837,"title":838,"description":839,"published":840,"category":612,"image":841,"draft":616},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":843,"title":844,"description":845,"published":846,"category":612,"image":847,"draft":616},"\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":849,"title":850,"description":851,"published":852,"category":612,"image":853,"draft":616},"\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":855,"title":856,"description":857,"published":858,"category":612,"image":859,"draft":616},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":861,"title":862,"description":863,"published":864,"category":612,"image":865,"draft":616},"\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":867,"title":868,"description":869,"published":870,"category":612,"image":871,"draft":616},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":873,"title":874,"description":875,"published":876,"category":612,"image":877,"draft":616},"\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":879,"title":880,"description":881,"published":882,"category":612,"image":883,"draft":616},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":885,"title":886,"description":887,"published":888,"category":612,"image":889,"draft":616},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":891,"title":892,"description":893,"published":894,"category":612,"image":895,"draft":616},"\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":897,"title":898,"description":899,"published":900,"category":612,"image":901,"draft":616},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":903,"title":904,"description":905,"published":906,"category":719,"image":907,"draft":616},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":909,"title":910,"description":911,"published":912,"category":719,"image":913,"draft":616},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":915,"title":916,"description":917,"published":918,"category":719,"image":919,"draft":616},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":106,"title":921,"description":922,"published":918,"category":612,"image":923,"draft":616},"Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":925,"title":926,"description":927,"published":928,"category":612,"image":929,"draft":616},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":931,"title":932,"description":933,"published":934,"category":612,"image":935,"draft":616},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":937,"title":938,"description":939,"published":940,"category":719,"image":941,"draft":616},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":943,"title":944,"description":945,"published":946,"category":612,"image":947,"draft":616},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":949,"title":950,"description":951,"published":952,"category":612,"image":953,"draft":616},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":955,"title":956,"description":957,"published":958,"category":612,"image":959,"draft":616},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":961,"title":962,"description":963,"published":964,"category":612,"image":965,"draft":616},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":967,"title":968,"description":969,"published":970,"category":612,"image":971,"draft":616},"\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":973,"title":974,"description":975,"published":976,"category":612,"image":977,"draft":616},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":979,"title":980,"description":981,"published":982,"category":612,"image":983,"draft":616},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":985,"title":986,"description":987,"published":988,"category":612,"image":989,"draft":616},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":991,"title":992,"description":993,"published":994,"category":719,"image":995,"draft":616},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":997,"title":998,"description":999,"published":1000,"category":719,"image":1001,"draft":616},"\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":1003,"title":1004,"description":1005,"published":1006,"category":719,"image":1007,"draft":616},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":1009,"title":1010,"description":1011,"published":1012,"category":612,"image":1013,"draft":616},"\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":472,"title":1015,"description":1016,"published":1017,"category":612,"image":1018,"draft":616},"Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":1020,"title":1021,"description":1022,"published":1023,"category":612,"image":1024,"draft":616},"\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":1026,"title":1027,"description":1028,"published":1029,"category":612,"image":1030,"draft":616},"\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":1032,"title":1033,"description":1034,"published":1035,"category":612,"image":1036,"draft":616},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Вісім інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":1038,"title":1039,"description":1040,"published":1041,"category":612,"image":1042,"draft":616},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":1044,"title":1045,"description":1046,"published":1047,"category":612,"image":1048,"draft":616},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":1050,"title":1051,"description":1052,"published":1053,"category":612,"image":1054,"draft":616},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":1056,"title":1057,"description":1058,"published":1059,"category":612,"image":1060,"draft":616},"\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":1062,"title":1063,"description":1064,"published":1065,"category":612,"image":1066,"draft":616},"\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":1068,"title":1069,"description":1070,"published":1071,"category":719,"image":1072,"draft":616},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":1074,"title":1075,"description":1076,"published":1077,"category":612,"image":1078,"draft":616},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":1080,"title":1081,"description":1082,"published":1083,"category":719,"image":1084,"draft":616},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":1086,"title":1087,"description":1088,"published":1089,"category":612,"image":1090,"draft":616},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":1092,"title":1093,"description":1094,"published":1095,"category":612,"image":1096,"draft":616},"\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":1098,"title":1099,"description":1100,"published":1101,"category":612,"image":1102,"draft":616},"\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":1104,"title":1105,"description":1106,"published":1107,"category":612,"image":1108,"draft":616},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":1110,"title":1111,"description":1112,"published":1113,"category":719,"image":1114,"draft":616},"\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":1116,"title":1117,"description":1118,"published":1119,"category":719,"image":1120,"draft":616},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1122,"title":1123,"description":1124,"published":1125,"category":612,"image":1126,"draft":616},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1128,"title":1129,"description":1130,"published":1131,"category":612,"image":1132,"draft":616},"\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":1134,"title":1135,"description":1136,"published":1137,"category":719,"image":1138,"draft":616},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1140,"title":1141,"description":1142,"published":1143,"category":612,"image":1144,"draft":616},"\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":1146,"title":1147,"description":1148,"published":1143,"category":612,"image":1149,"draft":616},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1151,"title":1152,"description":1153,"published":1154,"category":612,"image":1155,"draft":616},"\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":1157,"title":1158,"description":1159,"published":1160,"category":719,"image":1161,"draft":616},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1163,"title":1164,"description":1165,"published":1166,"category":612,"image":1167,"draft":616},"\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":1169,"title":1170,"description":1171,"published":1166,"category":719,"image":1172,"draft":616},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1174,"title":1175,"description":1176,"published":1177,"category":719,"image":1178,"draft":616},"\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":1180,"title":1181,"description":1182,"published":1177,"category":612,"image":1183,"draft":616},"\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",1794213654381]