[{"data":1,"prerenderedAt":1381},["ShallowReactive",2],{"blog-uk-supabase-relation-does-not-exist":3,"blog-index-uk":855},{"id":4,"title":5,"body":6,"category":811,"cover":812,"coverAlt":813,"description":814,"draft":815,"extension":816,"faq":817,"image":833,"keywords":834,"meta":844,"navigation":845,"ogTitle":5,"path":846,"published":847,"seo":848,"stem":849,"tldr":850,"updated":847,"__hash__":854},"blog_uk\u002Fblog\u002Fsupabase-relation-does-not-exist.md","Supabase \"relation does not exist\", хоча таблиця на місці",{"type":7,"value":8,"toc":798},"minimark",[9,18,28,35,38,43,61,72,75,148,180,191,195,198,206,243,300,312,315,323,334,338,351,354,401,417,423,436,441,447,451,454,461,467,481,488,491,497,514,517,523,531,536,540,546,549,555,562,577,581,593,605,608,614,621,639,644,648,651,662,671,675,678,688,711,720,738,742,791],[10,11,12,13,17],"p",{},"Ваш білдер додав таблицю ",[14,15,16],"code",{},"invoices",". Ви бачите її в Table Editor, разом із рядками,\nа сторінка, яка мала б їх показати, лишається порожньою. Консоль браузера показує\nось це:",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","{\n  \"code\": \"PGRST205\",\n  \"details\": null,\n  \"hint\": \"Perhaps you meant the table 'public.Invoices'\",\n  \"message\": \"Could not find the table 'public.invoices' in the schema cache\"\n}\n","text",[14,26,23],{"__ignoreMap":27},"",[10,29,30,31,34],{},"Supabase \"relation does not exist\" означає, що Postgres не знайшов жодної таблиці\nчи view саме з такою назвою в схемах, які переглянув запит. PGRST205 дає ту саму\nвідповідь, але від PostgREST, частини Supabase, яка перетворює виклики\n",[14,32,33],{},"supabase.from(...)"," вашого застосунку на запити до бази, ще до того, як запит\nдійде до Postgres.",[10,36,37],{},"Порада, яку для цієї помилки передають з рук у руки, звучить так: додати схему в\nExposed schemas у налаштуваннях проєкту. Вона виправляє одну з чотирьох причин\nнижче. А ще вона відкриває кожну таблицю цієї схеми будь-кому, хто має публічний\nключ вашого застосунку, тож прочитайте, що саме вона відкриває, перш ніж її\nвмикати.",[39,40,42],"h2",{"id":41},"що-означає-relation-does-not-exist-у-supabase","Що означає \"relation does not exist\" у Supabase?",[10,44,45,46,49,50,60],{},"База шукала таблицю саме з такою назвою в схемах, які їй сказали переглянути, і не\nзнайшла жодної. \"Relation\" у Postgres позначає все, з чого виходять рядки, тобто\nтаблицю або view. Код помилки ",[14,47,48],{},"42P01",", і\n",[51,52,56,57],"a",{"href":53,"rel":54},"https:\u002F\u002Fgithub.com\u002Fpostgres\u002Fpostgres\u002Fblob\u002Fmaster\u002Fsrc\u002Fbackend\u002Futils\u002Ferrcodes.txt",[55],"nofollow","Postgres називає його ",[14,58,59],{},"undefined_table",".",[10,62,63,64,67,68,71],{},"Уявіть свою базу як будинок. У ньому кожна схема займає окремий поверх: ",[14,65,66],{},"public","\nна першому поверсі, а ",[14,69,70],{},"auth",", де Supabase тримає ваших користувачів, на іншому.\nКожна таблиця схожа на кімнату з назвою на дверях. Запит, який називає лише кімнату,\nшукає її на поверхах зі свого шляху пошуку. Запити вашого застосунку їдуть ліфтом,\nа ліфт зупиняється лише на поверхах, які відкриває ваш проєкт. Помилка означає, що\nна перевірених поверхах ніхто не знайшов дверей із такою назвою.",[10,73,74],{},"Яке формулювання ви побачите, залежить від того, де виконувався запит:",[76,77,78,91],"table",{},[79,80,81],"thead",{},[82,83,84,88],"tr",{},[85,86,87],"th",{},"Де виконувався запит",[85,89,90],{},"Що повертається",[92,93,94,108,122,134],"tbody",{},[82,95,96,100],{},[97,98,99],"td",{},"SQL Editor, міграція, функція або тригер",[97,101,102,105,106],{},[14,103,104],{},"relation \"invoices\" does not exist",", код ",[14,107,48],{},[82,109,110,113],{},[97,111,112],{},"Ваш застосунок, PostgREST 13 або новіший",[97,114,115,105,118,121],{},[14,116,117],{},"Could not find the table 'public.invoices' in the schema cache",[14,119,120],{},"PGRST205",", HTTP 404",[82,123,124,127],{},[97,125,126],{},"Ваш застосунок, старіший PostgREST",[97,128,129,130,133],{},"читання отримує ",[14,131,132],{},"relation \"public.invoices\" does not exist",", HTTP 404, а insert отримує порожню помилку",[82,135,136,139],{},[97,137,138],{},"Ваш застосунок просить схему, яку проєкт не відкриває",[97,140,141,105,144,147],{},[14,142,143],{},"Invalid schema: billing",[14,145,146],{},"PGRST106",", HTTP 406",[10,149,150,155,156,158,159,164,165,167,168,173,174,179],{},[51,151,154],{"href":152,"rel":153},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fmain\u002FCHANGELOG.md",[55],"Changelog PostgREST","\nдатує нове формулювання версією 13.0.0, що вийшла 8 травня 2025 року: \"Querying\nnon-existent table now returns ",[14,157,120],{}," error\". До того, як\n",[51,160,163],{"href":161,"rel":162},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fissues\u002F3697",[55],"пояснив один із його мейнтейнерів у issue #3697",",\nчитання йшло в Postgres без перевірки й поверталося як ",[14,166,48],{},".\n",[51,169,172],{"href":170,"rel":171},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Fhardening-data-api",[55],"Посібник Supabase про захист Data API","\nкаже, що версію PostgREST свого проєкту можна перевірити в Dashboard.\n",[51,175,178],{"href":176,"rel":177},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fmain\u002Fsrc\u002Flibrary\u002FPostgREST\u002FError.hs",[55],"Власний код PostgREST","\nвизначає решту: підказка PGRST205, якщо вона є, називає найближчу таблицю, яку\nPostgREST знає на тому самому поверсі.",[10,181,182,183,186,187,60],{},"Якщо ж у повідомленні стоїть ",[14,184,185],{},"permission denied for table",", таблицю знайшли, а\nваш застосунок зупинили біля дверей. Для цього випадку є\n",[51,188,190],{"href":189},"\u002Fblog\u002Fsupabase-permission-denied-for-table","інше виправлення",[39,192,194],{"id":193},"причина-1-назва-на-дверях-має-велику-літеру","Причина 1: назва на дверях має велику літеру",[10,196,197],{},"Назва має збігатися точно, разом із великими літерами, і два з інструментів, якими\nви користуєтеся, поводяться з великими літерами не так, як третій.",[10,199,200,205],{},[51,201,204],{"href":202,"rel":203},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fsql-syntax-lexical.html",[55],"Документація Postgres","\nвміщує правило в одне речення: \"Quoting an identifier also makes it\ncase-sensitive, whereas unquoted names are always folded to lower case.\" Два інші\nзберігають те, що ви набрали:",[207,208,209,225],"ul",{},[210,211,212,213,218,219,222,223],"li",{},"Table Editor у Supabase створює таблицю саме з тією назвою, яку ви їй дали.\n",[51,214,217],{"href":215,"rel":216},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fsupabase\u002Fblob\u002Fmaster\u002Fpackages\u002Fpg-meta\u002Fsrc\u002Fpg-meta-tables.ts",[55],"Його код","\nбере назву в лапки, коли їх потрібно, тож ",[14,220,221],{},"Invoices"," лишається ",[14,224,221],{},[210,226,227,228,235,236,239,240,242],{},"PostgREST бере в подвійні лапки кожну назву, яку надсилає ваш застосунок\n(",[51,229,232],{"href":230,"rel":231},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fmain\u002Fsrc\u002Flibrary\u002FPostgREST\u002FQuery\u002FSqlFragment.hs",[55],[14,233,234],{},"pgFmtIdent","),\nтож ",[14,237,238],{},".from('invoices')"," просить ",[14,241,16],{}," і нічого іншого",[76,244,245,258],{},[79,246,247],{},[82,248,249,252,255],{},[85,250,251],{},"Як створили таблицю",[85,253,254],{},"У SQL пишіть",[85,256,257],{},"У застосунку пишіть",[92,259,260,279],{},[82,261,262,271,275],{},[97,263,264,267,268,270],{},[14,265,266],{},"create table invoices"," або ",[14,269,221],{},", набране в SQL без лапок",[97,272,273],{},[14,274,16],{},[97,276,277],{},[14,278,238],{},[82,280,281,289,295],{},[97,282,283,267,286,288],{},[14,284,285],{},"create table \"Invoices\"",[14,287,221],{},", набране в Table Editor",[97,290,291,294],{},[14,292,293],{},"\"Invoices\"",", разом із лапками",[97,296,297],{},[14,298,299],{},".from('Invoices')",[10,301,302,303,305,306,308,309,311],{},"Другий рядок дає цю помилку з обох боків. Ваш застосунок викликає\n",[14,304,238],{}," і отримує PGRST205 зі справжньою назвою в підказці, як у\nповідомленні на початку цієї сторінки. Або застосунок працює, а функція чи\npolicy, що називає ",[14,307,221],{}," без лапок, падає з\n",[14,310,104],{},", бо Postgres перевів назву в малі літери ще\nдо пошуку.",[10,313,314],{},"Щоб побачити кожну таблицю з такою назвою, на будь-якому поверсі й з будь-якими\nвеликими літерами, виконайте це в SQL Editor:",[19,316,321],{"className":317,"code":319,"language":320,"meta":27},[318],"language-sql","select table_schema, table_name\nfrom information_schema.tables\nwhere table_name ilike 'invoices';\n","sql",[14,322,319],{"__ignoreMap":27},[10,324,325,326,328,329,333],{},"Виправлення, яке нічого не змінює у ваших даних, лежить у коді: пишіть\n",[14,327,293],{}," з лапками в SQL і точні великі літери в застосунку. Якщо натомість\nперейменувати таблицю, зламається кожен екран, що досі використовує стару назву.\n",[51,330,332],{"href":331},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Версія цієї помилки для колонок"," має ту\nсаму пастку з назвами колонок.",[39,335,337],{"id":336},"причина-2-таблиця-на-іншому-поверсі","Причина 2: таблиця на іншому поверсі",[10,339,340,341,343,344,347,348,350],{},"Ваш застосунок шукає в ",[14,342,66],{},", якщо йому не сказати інакше, тож таблиці в будь-якій\nіншій схемі для нього немає. Тому повідомлення й каже ",[14,345,346],{},"public.invoices",": ",[14,349,66],{},"\nозначає поверх, куди поїхав ліфт.",[10,352,353],{},"Таке буває трьома способами:",[207,355,356,369,378],{},[210,357,358,359,362,363,366,367],{},"ваш білдер створив таблицю у власній схемі, як-от ",[14,360,361],{},"billing"," чи ",[14,364,365],{},"private",", а\nзастосунок викликає звичайне ",[14,368,238],{},[210,370,371,372,375,376],{},"схема записана в самій назві, як ",[14,373,374],{},".from('billing.invoices')",". PostgREST читає\nвесь рядок як одну назву таблиці й шукає її в ",[14,377,66],{},[210,379,380,381,167,384,389,390,392,393,396,397],{},"таблиця називається ",[14,382,383],{},"auth.users",[51,385,388],{"href":386,"rel":387},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fmanaging-user-data",[55],"Посібник Supabase про дані користувачів","\nкаже: \"For security, the Auth schema is not exposed in the auto-generated API.\"\nЙого відповідь полягає у власній таблиці в ",[14,391,66],{},", у його прикладі\n",[14,394,395],{},"profiles",", яку заповнює тригер, коли хтось реєструється, і\n",[51,398,400],{"href":399},"\u002Fblog\u002Fdatabase-error-saving-new-user","цей тригер може падати по-своєму",[10,402,403,404,407,408,413,414,416],{},"Таблицю на іншому поверсі читають через ",[14,405,406],{},".schema('billing').from('invoices')",", і ця\nсхема має бути в списку Exposed schemas у налаштуваннях API проєкту, як показує\n",[51,409,412],{"href":410,"rel":411},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fusing-custom-schemas",[55],"посібник Supabase про власні схеми",".\nДоти відповідь змінюється на ",[14,415,146],{},":",[19,418,421],{"className":419,"code":420,"language":24},[22],"{\n  \"code\": \"PGRST106\",\n  \"details\": null,\n  \"hint\": \"Only the following schemas are exposed: public, graphql_public\",\n  \"message\": \"Invalid schema: billing\"\n}\n",[14,422,420],{"__ignoreMap":27},[10,424,425,426,429,430,435],{},"Підказка перелічує поверхи, на яких ліфт таки зупиняється. PostgREST 12 формулює\nту саму помилку інакше, зі списком просто в повідомленні:\n",[14,427,428],{},"The schema must be one of the following: public, graphql_public",". Саме такий\nтекст дає ",[51,431,434],{"href":432,"rel":433},"https:\u002F\u002Fgithub.com\u002FPostgREST\u002Fpostgrest\u002Fblob\u002Fv12.2.12\u002Fsrc\u002FPostgREST\u002FError.hs",[55],"його код для цієї версії",",\nа changelog переніс назву схеми в повідомлення у 13.0.7.",[10,437,438,439,60],{},"Ваш секретний ключ їде тим самим ліфтом. Відкриття схеми належить до налаштувань\nAPI, тож серверний код, що використовує supabase-js із цим ключем, отримує той\nсамий ",[14,440,146],{},[442,443],"diagram",{"alt":444,"caption":445,"src":446},"Будинок у розрізі з трьома поверхами: public унизу, billing посередині й auth угорі, а праворуч шахта ліфта. Ліфт зупиняється на public, де двері invoices намальовані порожнім пунктирним місцем, від якого лінія йде до таблички з PGRST205 і 404. Його зупинка на billing, де стоять двері invoices, намальована пунктирним бурштиновим отвором, від якого лінія йде до таблички з PGRST106 і 406. Поверх auth не має зупинки взагалі.","Ліфт зупиняється лише на відкритих поверхах. Таблиці з іншого поверху немає в public, а прохання про цей поверх за назвою відхиляють, поки його не відкриють.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fthe-lift-stops-at-public-1600x760.png",[39,448,450],{"id":449},"що-відкриває-відкрита-схема","Що відкриває відкрита схема?",[10,452,453],{},"Ліфт починає зупинятися на цьому поверсі, а з дозволами з посібника Supabase кожен\nвідвідувач отримує ключ до кожної кімнати там. Row Level Security тоді лишається\nєдиним, що вирішує, що кожен із них може прочитати чи змінити.",[10,455,456,460],{},[51,457,459],{"href":410,"rel":458},[55],"Посібник про власні схеми","\nмає два кроки. Перший полягає в налаштуванні Exposed schemas. Другий складається з\nблоку SQL, і ось його перші два рядки:",[19,462,465],{"className":463,"code":464,"language":320,"meta":27},[318],"GRANT USAGE ON SCHEMA myschema TO anon, authenticated, service_role;\nGRANT ALL ON ALL TABLES IN SCHEMA myschema TO anon, authenticated, service_role;\n",[14,466,464],{"__ignoreMap":27},[10,468,469,472,473,476,477,480],{},[14,470,471],{},"anon"," стоїть за кожним запитом від того, хто не ввійшов. ",[14,474,475],{},"ALL"," означає читати,\nдодавати, змінювати й видаляти. Далі блок продовжується через\n",[14,478,479],{},"ALTER DEFAULT PRIVILEGES",", що дає такий самий доступ кожній таблиці, створеній на\nцьому поверсі пізніше.",[10,482,483,484,487],{},"Це безпечно там, де Row Level Security, правила для кожного рядка, які Supabase\nперевіряє на кожному запиті, увімкнена й написана для кожної таблиці.\n",[51,485,172],{"href":170,"rel":486},[55],"\nкаже: \"Tables created through the Supabase Dashboard have RLS enabled by default.\nEnable RLS explicitly for tables created in the SQL Editor or through another\ntool.\" Схема, яку ваш білдер налаштував у SQL, може містити таблиці без неї.\nВідкрита з такими дозволами, така таблиця віддає кожен рядок будь-кому з вашим\nпублічним ключем і приймає ще й його зміни.",[10,489,490],{},"Перевірте перед відкриттям:",[19,492,495],{"className":493,"code":494,"language":320,"meta":27},[318],"select tablename, rowsecurity\nfrom pg_tables\nwhere schemaname = 'billing';\n",[14,496,494],{"__ignoreMap":27},[10,498,499,500,503,504,508,509,513],{},"Кожен рядок зі значенням ",[14,501,502],{},"false"," позначає таблицю зовсім без правил.\n",[51,505,507],{"href":506},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкнути Row Level Security на кожній таблиці","\nпояснює, як її ввімкнути й написати перше правило, а\n",[51,510,512],{"href":511},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","\"RLS disabled in public\""," пояснює відкрите\nправило читання, з яким таблиця лишається так само досяжною навіть із увімкненою\nRow Level Security.",[10,515,516],{},"Можна дати й менше дозволів, ніж у посібнику. Поверху з однією таблицею, яку\nчитають лише користувачі після входу, вистачить двох рядків:",[19,518,521],{"className":519,"code":520,"language":320,"meta":27},[318],"grant usage on schema billing to authenticated;\ngrant select on billing.invoices to authenticated;\n",[14,522,520],{"__ignoreMap":27},[10,524,525,526,530],{},"Чи відповідають ваші таблиці незнайомцю, можна перевірити ззовні. Наше\n",[51,527,529],{"href":528},"\u002Fsecurity-scanner","безкоштовне сканування"," читає ваш робочий застосунок тим\nсамим публічним ключем, який отримує відвідувач, показує, які таблиці віддають\nрядки, і не потребує облікового запису.",[442,532],{"alt":533,"caption":534,"src":535},"Поверх billing намальований двічі. Ліворуч ліфт там не зупиняється, і троє дверей зачинені. Праворуч ліфт там зупиняється, і всі троє дверей відчинені: дві кімнати мають замок над своїми рядками, а третя не має жодного, і її рядки бурштинові.","Поверх, відкритий із дозволами з посібника, отримує відчинені всі двері. Row Level Security працює як замок у кожній кімнаті, а кімната без замка відкрита будь-кому з вашим публічним ключем.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fexposing-opens-every-room-1600x700.png",[39,537,539],{"id":538},"відкрити-схему-чи-перенести-таблицю","Відкрити схему чи перенести таблицю?",[10,541,542,543,545],{},"Вирішуйте за тим, хто читає таблицю. Таблиці, яку ваш застосунок читає з\nбраузера, потрібен дозвіл для ролі, що її читає, і Row Level Security з правилом,\nде б вона не лежала. Тож перенесення в ",[14,544,66],{}," заощадить вам лише крок із\nвідкриттям схеми.",[10,547,548],{},"Якщо переносите:",[19,550,553],{"className":551,"code":552,"language":320,"meta":27},[318],"alter table billing.invoices set schema public;\n",[14,554,552],{"__ignoreMap":27},[10,556,557,558,561],{},"Таблиця зберігає свої дозволи й правила. Функція, у тілі якої названо\n",[14,559,560],{},"billing.invoices",", після цього падає з тією самою помилкою, бо тіло зберігає назву\nтакою, якою її написали.",[10,563,564,565,567,568,572,573,576],{},"Таблиця, потрібна лише серверному коду, може лишитися на поверсі, куди ліфт ніколи\nне їздить. Функція в ",[14,566,66],{}," може зробити з нею ту одну дію, яка потрібна вашому\nзастосунку, а\n",[51,569,571],{"href":570},"\u002Fblog\u002Fsupabase-function-not-found","виклик функції Supabase"," пояснює, як забрати\n",[14,574,575],{},"execute"," у відвідувачів без входу.",[39,578,580],{"id":579},"причина-3-функція-з-порожнім-шляхом-пошуку","Причина 3: функція з порожнім шляхом пошуку",[10,582,583,584,587,588,590,591,60],{},"Функція з ",[14,585,586],{},"search_path = ''"," не переглядає жодного поверху, тож кожна таблиця в\nній потребує схеми попереду: ",[14,589,346],{},", ніколи не просто ",[14,592,16],{},[10,594,595,596,604],{},"Security Advisor у Supabase просить саме такого налаштування. Його\n",[51,597,600,601],{"href":598,"rel":599},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fsplinter\u002Fblob\u002Fmain\u002Fdocs\u002F0011_function_search_path_mutable.md",[55],"попередження ",[14,602,603],{},"function_search_path_mutable","\nкаже: \"We recommend pinning functions' search_path to an empty string\". Та сама\nсторінка закінчується словами: \"once you set the search_path = '' all references\nto tables\u002Ffunctions\u002Fviews\u002Fetc in your function's body must be qualified with a\nschema name.\"",[10,606,607],{},"Отже, попередження виправляють одним рядком, а функція після цього падає на першій\nназві таблиці без схеми:",[19,609,612],{"className":610,"code":611,"language":320,"meta":27},[318],"create or replace function public.count_invoices()\nreturns bigint\nlanguage plpgsql\nset search_path = ''\nas $$\nbegin\n  return (select count(*) from invoices);  -- relation \"invoices\" does not exist\nend;\n$$;\n",[14,613,611],{"__ignoreMap":27},[10,615,616,617,620],{},"Напишіть ",[14,618,619],{},"from public.invoices",", і вона знову запрацює. Залиште налаштування: воно\nне дає тому, хто викликає функцію, спрямувати назву без схеми на власну таблицю.",[10,622,623,624,627,628,630,631,635,636,60],{},"Коли функцію викликають із застосунку через ",[14,625,626],{},".rpc()",", помилка проходить крізь\nPostgREST як ",[14,629,48],{}," з HTTP 404, тим статусом, який\n",[51,632,634],{"href":176,"rel":633},[55],"код PostgREST","\nдає невідомій таблиці. Тригер на нових реєстраціях, що падає так само, видно як\n",[51,637,638],{"href":399},"\"Database error saving new user\"",[442,640],{"alt":641,"caption":642,"src":643},"Два пошуки зсередини функції з позначкою search_path = ''. Верхній просить invoices без поверху, знаходить порожній список поверхів і закінчується на табличці з 42P01. Нижній просить public.invoices, іде прямо до дверей invoices на поверсі public і позначений галочкою.","З порожнім шляхом пошуку немає жодного поверху, який можна переглянути, тож кімнату знаходить лише повна адреса.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fan-empty-search-path-1600x620.png",[39,645,647],{"id":646},"причина-4-таблиці-ще-немає-в-цьому-проєкті","Причина 4: таблиці ще немає в цьому проєкті",[10,649,650],{},"Таблиця існує в іншій базі або лише у вашому коді.",[10,652,653,654,658,659,661],{},"Один обліковий запис Supabase може мати кілька проєктів, а\n",[51,655,657],{"href":656},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","гілка є окремим проєктом"," із власною\nбазою. Таблиця, створена в SQL Editor не того проєкту, це кімната в іншому\nбудинку.\n",[51,660,332],{"href":331},"\nпоказує, як порівняти посилання на проєкт в адресі Supabase вашого застосунку з\nтим, що в dashboard.",[10,663,664,665,670],{},"Якщо ви будуєте з Lovable, перегляньте чат у пошуках SQL, який вас просили\nсхвалити.\n",[51,666,669],{"href":667,"rel":668},"https:\u002F\u002Fdocs.lovable.dev\u002Fintegrations\u002Fsupabase",[55],"Документація Lovable про Supabase","\nкаже, що він \"writes the SQL, shows it to you, and asks for your approval in the\nproject chat before running it\". Поки ви не схвалили, таблиця існує лише в коді,\nякий її читає.",[39,672,674],{"id":673},"перенесення-таблиці-від-якої-залежить-ваш-застосунок","Перенесення таблиці, від якої залежить ваш застосунок",[10,676,677],{},"Збережіть копію бази з часу до перенесення й дізнавайтеся, коли змінюється щось,\nщо відкриває ваш застосунок.",[10,679,680],{},[681,682,683,687],"strong",{},[51,684,686],{"href":685},"\u002Fsupabase-backups","Reeve Care"," зберігає копію вашої бази даних Supabase:",[207,689,690,693,699,702,705,708],{},[210,691,692],{},"зашифрована копія за розкладом, у власному сховищі Reeve в ЄС, поза вашим обліковим записом Supabase",[210,694,695,696,698],{},"кожна схема, яку ви створили, ",[14,697,66],{}," та інші, з їхніми таблицями й рядками такими, якими вони були до вашої зміни",[210,700,701],{},"кожна копія перевірена, перш ніж її зараховують, підрахунком рядків у кожній таблиці",[210,703,704],{},"ваші завантажені файли теж, щойно ви підключите облікові дані Storage",[210,706,707],{},"відновлення одним кліком, перед яким береться страхувальна копія поточного стану",[210,709,710],{},"усе, що робить Monitor",[10,712,713],{},[681,714,715,719],{},[51,716,718],{"href":717},"\u002Fwebsite-monitoring","Reeve Monitor"," і далі перевіряє ззовні:",[207,721,722,725,728,735],{},[210,723,724],{},"чи доступний ваш застосунок, з перевіркою щохвилини",[210,726,727],{},"повна перевірка безпеки щогодини, до трьох застосунків",[210,729,730,731,734],{},"повідомлення, коли результат ",[681,732,733],{},"змінюється",", тож деплой, який змінює те, що відкриває ваш застосунок, дійде до вас, і вам не доведеться йти дивитися",[210,736,737],{},"щомісячний звіт простою мовою про те, що він побачив",[39,739,741],{"id":740},"що-зробити-зараз","Що зробити зараз",[743,744,745],"key-takeaways",{},[207,746,747,754,757,770,779,788],{},[210,748,749,750,753],{},"Прочитайте повідомлення: назва в лапках показує, що саме просили, а ",[14,751,752],{},"public."," перед нею показує, яку схему переглянули.",[210,755,756],{},"Порівняйте назву з Table Editor, разом із великими літерами. Таблиця з великою літерою в назві потребує подвійних лапок у SQL.",[210,758,759,760,763,764,766,767,60],{},"Знайдіть, у якій схемі лежить таблиця, запитом до ",[14,761,762],{},"information_schema.tables"," і викликайте таблицю поза ",[14,765,66],{}," через ",[14,768,769],{},".schema('назва').from(...)",[210,771,772,773,776,777,60],{},"Перш ніж відкривати схему, виконайте запит до ",[14,774,775],{},"pg_tables"," і ввімкніть Row Level Security на кожній таблиці зі значенням ",[14,778,502],{},[210,780,781,782,784,785,60],{},"Усередині функції з ",[14,783,586],{}," пишіть кожну таблицю як ",[14,786,787],{},"public.назва",[210,789,790],{},"Перевірте, що проєкт, який викликає ваш застосунок, той самий, де ви створили таблицю.",[10,792,793,794,797],{},"Почніть із двох назв у повідомленні, таблиці та схеми перед нею, бо вони точно\nкажуть, які двері просили і на якому поверсі. Перш ніж переносити, перейменовувати\nабо відкривати щось, чим користуються люди,\n",[51,795,796],{"href":685},"збережіть копію бази"," з часу до зміни.",{"title":27,"searchDepth":799,"depth":799,"links":800},3,[801,803,804,805,806,807,808,809,810],{"id":41,"depth":802,"text":42},2,{"id":193,"depth":802,"text":194},{"id":336,"depth":802,"text":337},{"id":449,"depth":802,"text":450},{"id":538,"depth":802,"text":539},{"id":579,"depth":802,"text":580},{"id":646,"depth":802,"text":647},{"id":673,"depth":802,"text":674},{"id":740,"depth":802,"text":741},"Основи безпеки","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcover-1200x630.png","Будинок у розрізі поруч із шахтою ліфта. Ліфт стоїть на першому поверсі, а його зупинка поверхом вище намальована пунктирним бурштиновим отвором.","Supabase \"relation does not exist\" або PGRST205: жодна таблиця не має такої назви в цій схемі. Чотири перевірки, і на що зважити, відкриваючи схему.",false,"md",[818,821,824,827,830],{"q":819,"a":820},"Чому Supabase каже, що моєї таблиці не існує?","Бо в схемі, яку переглянув запит, немає таблиці саме з такою назвою. Перевірте чотири речі по черзі: великі літери в назві, схему, у якій лежить таблиця (ваш застосунок шукає в public, якщо йому не сказати інакше), проєкт, з яким говорить ваш застосунок, і чи виконується запит усередині функції з порожнім search_path, де кожна таблиця потребує схеми попереду.",{"q":822,"a":823},"Що означає \"the schema must be one of the following\"?","Так звучить помилка PGRST106 у старіших версіях PostgREST. Ваш застосунок попросив схему, яку проєкт не відкриває, наприклад через .schema('назва'), а список після цих слів перелічує відкриті схеми. Новіші версії кажуть \"Invalid schema: назва\" і кладуть той самий список у підказку. Відкрита схема виправляє помилку, і це варто вирішувати свідомо.",{"q":825,"a":826},"Чи безпечно відкривати схему в Supabase?","Лише тоді, коли кожна таблиця в ній має ввімкнену Row Level Security і написане правило. Посібник Supabase про власні схеми дає anon, ролі кожного відвідувача без входу, повний доступ до кожної таблиці схеми, зокрема до тих, що з'являться там пізніше. Його посібник з безпеки додає, що таблиці, створені в SQL Editor, не отримують Row Level Security за замовчуванням.",{"q":828,"a":829},"Чи мають значення великі літери в назві таблиці Supabase?","Так. Назва, написана в SQL без подвійних лапок, переводиться в малі літери, а Table Editor і supabase-js зберігають великі літери саме так, як їх написали. Таблицю, створену як Invoices, у SQL пишуть \"Invoices\", у лапках, а у вашому застосунку .from('Invoices').",{"q":831,"a":832},"Може, краще перенести таблицю в public?","Перенесення виправляє ту половину помилки, що стосується схеми, і нічого не дає безпеці: таблиці, яку ваш застосунок читає з браузера, потрібен дозвіл для ролі, що її читає, і Row Level Security з правилом, де б вона не лежала. Таблиця, потрібна лише серверному коду, може лишитися в закритій схемі, а до неї дістанеться функція в public, що робить одну потрібну вашому застосунку дію.","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",[835,836,837,838,839,840,841,842,843],"relation does not exist supabase","supabase relation does not exist","could not find the table in the schema cache","pgrst205","42p01","the schema must be one of the following","pgrst106","supabase схема не відкрита","supabase таблицю не знайдено api",{},true,"\u002Fblog\u002Fsupabase-relation-does-not-exist","2026-10-23",{"title":5,"description":814},"blog\u002Fsupabase-relation-does-not-exist",[851,852,853],"Supabase \"relation does not exist\" (код Postgres 42P01) означає, що в схемах, які переглянув запит, немає жодної таблиці чи view саме з такою назвою. У вашому застосунку на сучасному проєкті та сама проблема читається як \"Could not find the table in the schema cache\" (PGRST205).","Спершу перевірте назву літера за літерою, разом із великими літерами, потім схему, потім проєкт. Усередині функції з порожнім search_path кожна таблиця потребує схеми попереду: public.invoices.","Відкрита схема прибирає помилку й дає API доступ до кожної таблиці в ній, тож перевірте Row Level Security на кожній із цих таблиць, перш ніж її відкривати.","V2i3TfC-TZmjm_QzhAK0K7CnIAhuwA2emDbKMJWk9BE",[856,862,868,874,880,886,892,898,904,910,916,923,929,935,941,947,953,959,960,965,970,976,982,988,994,1000,1006,1011,1017,1023,1029,1035,1041,1047,1053,1059,1065,1071,1077,1083,1089,1095,1101,1107,1113,1119,1123,1129,1135,1141,1147,1153,1159,1165,1171,1177,1183,1189,1195,1201,1207,1213,1218,1223,1229,1235,1241,1247,1253,1259,1265,1271,1277,1283,1289,1295,1301,1307,1312,1318,1324,1330,1336,1342,1347,1353,1359,1365,1370,1376],{"path":857,"title":858,"description":859,"published":860,"category":811,"image":861,"draft":815},"\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":863,"title":864,"description":865,"published":866,"category":811,"image":867,"draft":815},"\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":869,"title":870,"description":871,"published":872,"category":811,"image":873,"draft":815},"\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":875,"title":876,"description":877,"published":878,"category":811,"image":879,"draft":815},"\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":881,"title":882,"description":883,"published":884,"category":811,"image":885,"draft":815},"\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":887,"title":888,"description":889,"published":890,"category":811,"image":891,"draft":815},"\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":893,"title":894,"description":895,"published":896,"category":811,"image":897,"draft":815},"\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":899,"title":900,"description":901,"published":902,"category":811,"image":903,"draft":815},"\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":905,"title":906,"description":907,"published":908,"category":811,"image":909,"draft":815},"\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":911,"title":912,"description":913,"published":914,"category":811,"image":915,"draft":815},"\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":917,"title":918,"description":919,"published":920,"category":921,"image":922,"draft":815},"\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":924,"title":925,"description":926,"published":927,"category":811,"image":928,"draft":815},"\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":930,"title":931,"description":932,"published":933,"category":811,"image":934,"draft":815},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" у Supabase: три причини","Supabase відповідає \"Invalid login credentials\" на неправильний пароль, невідому пошту й акаунт Google. Як зрозуміти, що саме.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":936,"title":937,"description":938,"published":939,"category":811,"image":940,"draft":815},"\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":942,"title":943,"description":944,"published":945,"category":811,"image":946,"draft":815},"\u002Fblog\u002Fcertificate-not-trusted","Сертифікат не довірений: три причини, крім закінчення строку","Сертифікат не довірений, хоча дата в порядку? Він називає іншу адресу, підписав сам себе або в його ланцюжку бракує ланки. Як зрозуміти, що саме.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":948,"title":949,"description":950,"published":951,"category":811,"image":952,"draft":815},"\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":954,"title":955,"description":956,"published":957,"category":811,"image":958,"draft":815},"\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":846,"title":5,"description":814,"published":847,"category":811,"image":833,"draft":815},{"path":570,"title":961,"description":962,"published":963,"category":811,"image":964,"draft":815},"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":331,"title":966,"description":967,"published":968,"category":811,"image":969,"draft":815},"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":971,"title":972,"description":973,"published":974,"category":811,"image":975,"draft":815},"\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":977,"title":978,"description":979,"published":980,"category":811,"image":981,"draft":815},"\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":983,"title":984,"description":985,"published":986,"category":811,"image":987,"draft":815},"\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":989,"title":990,"description":991,"published":992,"category":811,"image":993,"draft":815},"\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":995,"title":996,"description":997,"published":998,"category":811,"image":999,"draft":815},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: який ключ перестав працювати?","Помилка Supabase invalid JWT — це PGRST301: підписаний токен не пройшов перевірку. У новому проєкті йдеться про сесію, а не про ключ API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":1001,"title":1002,"description":1003,"published":1004,"category":811,"image":1005,"draft":815},"\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":399,"title":1007,"description":1008,"published":1009,"category":811,"image":1010,"draft":815},"\"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":1012,"title":1013,"description":1014,"published":1015,"category":811,"image":1016,"draft":815},"\u002Fblog\u002Fwhat-is-supabase","Що таке Supabase? База даних, яку обрав ваш білдер","Що таке Supabase: база даних, вхід і сховище файлів за вашим застосунком. Supabase тримає сервери, а правила про те, хто читає ваші рядки, ваші.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":1018,"title":1019,"description":1020,"published":1021,"category":811,"image":1022,"draft":815},"\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":1024,"title":1025,"description":1026,"published":1027,"category":811,"image":1028,"draft":815},"\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":1030,"title":1031,"description":1032,"published":1033,"category":811,"image":1034,"draft":815},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":1036,"title":1037,"description":1038,"published":1039,"category":811,"image":1040,"draft":815},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":1042,"title":1043,"description":1044,"published":1045,"category":811,"image":1046,"draft":815},"\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":1048,"title":1049,"description":1050,"published":1051,"category":811,"image":1052,"draft":815},"\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":1054,"title":1055,"description":1056,"published":1057,"category":811,"image":1058,"draft":815},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":1060,"title":1061,"description":1062,"published":1063,"category":811,"image":1064,"draft":815},"\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":1066,"title":1067,"description":1068,"published":1069,"category":811,"image":1070,"draft":815},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":1072,"title":1073,"description":1074,"published":1075,"category":811,"image":1076,"draft":815},"\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":1078,"title":1079,"description":1080,"published":1081,"category":811,"image":1082,"draft":815},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":1084,"title":1085,"description":1086,"published":1087,"category":811,"image":1088,"draft":815},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":1090,"title":1091,"description":1092,"published":1093,"category":811,"image":1094,"draft":815},"\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":1096,"title":1097,"description":1098,"published":1099,"category":811,"image":1100,"draft":815},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":1102,"title":1103,"description":1104,"published":1105,"category":921,"image":1106,"draft":815},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":1108,"title":1109,"description":1110,"published":1111,"category":921,"image":1112,"draft":815},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":1114,"title":1115,"description":1116,"published":1117,"category":921,"image":1118,"draft":815},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":189,"title":1120,"description":1121,"published":1117,"category":811,"image":1122,"draft":815},"Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":1124,"title":1125,"description":1126,"published":1127,"category":811,"image":1128,"draft":815},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":1130,"title":1131,"description":1132,"published":1133,"category":811,"image":1134,"draft":815},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":1136,"title":1137,"description":1138,"published":1139,"category":921,"image":1140,"draft":815},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":1142,"title":1143,"description":1144,"published":1145,"category":811,"image":1146,"draft":815},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":1148,"title":1149,"description":1150,"published":1151,"category":811,"image":1152,"draft":815},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":1154,"title":1155,"description":1156,"published":1157,"category":811,"image":1158,"draft":815},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":1160,"title":1161,"description":1162,"published":1163,"category":811,"image":1164,"draft":815},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":1166,"title":1167,"description":1168,"published":1169,"category":811,"image":1170,"draft":815},"\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":1172,"title":1173,"description":1174,"published":1175,"category":811,"image":1176,"draft":815},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":1178,"title":1179,"description":1180,"published":1181,"category":811,"image":1182,"draft":815},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":1184,"title":1185,"description":1186,"published":1187,"category":811,"image":1188,"draft":815},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":1190,"title":1191,"description":1192,"published":1193,"category":921,"image":1194,"draft":815},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":1196,"title":1197,"description":1198,"published":1199,"category":921,"image":1200,"draft":815},"\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":1202,"title":1203,"description":1204,"published":1205,"category":921,"image":1206,"draft":815},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":1208,"title":1209,"description":1210,"published":1211,"category":811,"image":1212,"draft":815},"\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":506,"title":1214,"description":1215,"published":1216,"category":811,"image":1217,"draft":815},"Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":511,"title":1219,"description":1220,"published":1221,"category":811,"image":1222,"draft":815},"Supabase \"RLS disabled in public\": чого не бачить попередження","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":1224,"title":1225,"description":1226,"published":1227,"category":811,"image":1228,"draft":815},"\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":1230,"title":1231,"description":1232,"published":1233,"category":811,"image":1234,"draft":815},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Вісім інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":1236,"title":1237,"description":1238,"published":1239,"category":811,"image":1240,"draft":815},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":1242,"title":1243,"description":1244,"published":1245,"category":811,"image":1246,"draft":815},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":1248,"title":1249,"description":1250,"published":1251,"category":811,"image":1252,"draft":815},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":1254,"title":1255,"description":1256,"published":1257,"category":811,"image":1258,"draft":815},"\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":1260,"title":1261,"description":1262,"published":1263,"category":811,"image":1264,"draft":815},"\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":1266,"title":1267,"description":1268,"published":1269,"category":921,"image":1270,"draft":815},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":1272,"title":1273,"description":1274,"published":1275,"category":811,"image":1276,"draft":815},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":1278,"title":1279,"description":1280,"published":1281,"category":921,"image":1282,"draft":815},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":1284,"title":1285,"description":1286,"published":1287,"category":811,"image":1288,"draft":815},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":1290,"title":1291,"description":1292,"published":1293,"category":811,"image":1294,"draft":815},"\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":1296,"title":1297,"description":1298,"published":1299,"category":811,"image":1300,"draft":815},"\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":1302,"title":1303,"description":1304,"published":1305,"category":811,"image":1306,"draft":815},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":656,"title":1308,"description":1309,"published":1310,"category":921,"image":1311,"draft":815},"Branching у Supabase це не бекап. Він іде тільки вперед.","Чому branching у Supabase це не бекап: гілка стартує без ваших даних, а мердж переносить саму лише схему. Для чого він потрібен і що брати замість нього.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":1313,"title":1314,"description":1315,"published":1316,"category":921,"image":1317,"draft":815},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1319,"title":1320,"description":1321,"published":1322,"category":811,"image":1323,"draft":815},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1325,"title":1326,"description":1327,"published":1328,"category":811,"image":1329,"draft":815},"\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":1331,"title":1332,"description":1333,"published":1334,"category":921,"image":1335,"draft":815},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1337,"title":1338,"description":1339,"published":1340,"category":811,"image":1341,"draft":815},"\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":1343,"title":1344,"description":1345,"published":1340,"category":811,"image":1346,"draft":815},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1348,"title":1349,"description":1350,"published":1351,"category":811,"image":1352,"draft":815},"\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":1354,"title":1355,"description":1356,"published":1357,"category":921,"image":1358,"draft":815},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1360,"title":1361,"description":1362,"published":1363,"category":811,"image":1364,"draft":815},"\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":1366,"title":1367,"description":1368,"published":1363,"category":921,"image":1369,"draft":815},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1371,"title":1372,"description":1373,"published":1374,"category":921,"image":1375,"draft":815},"\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":1377,"title":1378,"description":1379,"published":1374,"category":811,"image":1380,"draft":815},"\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",1794213654344]