[{"data":1,"prerenderedAt":925},["ShallowReactive",2],{"blog-uk-supabase-backup-auth-users":3,"blog-index-uk":576},{"id":4,"title":5,"body":6,"category":532,"cover":533,"coverAlt":534,"description":535,"draft":536,"extension":537,"faq":538,"image":555,"keywords":556,"meta":565,"navigation":566,"ogTitle":5,"path":567,"published":568,"seo":569,"stem":570,"tldr":571,"updated":568,"__hash__":575},"blog_uk\u002Fblog\u002Fsupabase-backup-auth-users.md","Чому у вашому дампі Supabase немає користувачів",{"type":7,"value":8,"toc":520},"minimark",[9,13,21,35,38,43,46,63,84,87,93,97,102,122,125,135,142,145,150,154,160,213,216,222,225,235,239,242,250,256,259,265,268,274,287,297,303,309,313,316,322,328,331,352,356,359,371,385,391,398,402,439,446,450,453,458,494,502,509],[10,11,12],"p",{},"Ви зробили відповідальну річ. Знайшли, як зробити резервну копію бази Supabase,\nзапустили команду, яку знайшли, і поклали файл у безпечне місце.",[10,14,15,16,20],{},"Потім одного дня він вам потрібен. Ви прокручуєте файл у свіжий проєкт, і\nвідновлення завершується без жодної помилки. Кожна таблиця, яку ви колись\nстворили, на місці, і кожна з них порожня. Вашим користувачам ще гірше:\nчастина бази, у якій вони живуть, схема на ім'я ",[17,18,19],"code",{},"auth",", взагалі не дійшла до\nфайла.",[10,22,23,24,31,32,34],{},"Ось частина, яку майже кожен посібник пропускає: ",[25,26,27,30],"strong",{},[17,28,29],{},"supabase db dump"," сам по\nсобі це не копія ваших даних."," Без інших прапорців він пише форму вашої бази і\nнічого з її вмісту, а ",[17,33,19],{}," лишає поза навіть цим. Supabase публікує резервну\nкопію як три команди, і ваші акаунти їдуть у третій.",[10,36,37],{},"Допомагає уявити готель. Ваші таблиці це номери й усе, що в них. Реєстр на\nстійці, той, де ім'я кожного гостя, належить готелю. А план поверхів показує\nкожен номер у будівлі, не поселивши туди жодного гостя.",[39,40,42],"h2",{"id":41},"чи-містить-резервна-копія-supabase-моїх-користувачів","Чи містить резервна копія Supabase моїх користувачів?",[10,44,45],{},"Залежить від того, яка команда написала файл, і команда, яку запускає\nбільшість, їх не містить.",[10,47,48,49,51,52,55,56,59,60,62],{},"Ваші користувачі це не рядки в одній із ваших власних таблиць. Supabase тримає\nїх в окремій шухляді тієї самої бази, схемі ",[17,50,19],{},", разом із їхніми хешованими\nпаролями, провайдерами, через яких вони входили, і сесіями, що в них відкриті.\nВаші власні таблиці сидять у шухляді на ім'я ",[17,53,54],{},"public",", і кожен стовпець\n",[17,57,58],{},"user_id"," у них це посилання туди, в ",[17,61,19],{},".",[10,64,65,66,68,69,71,72,75,76,83],{},"Схема це саме воно: іменована шухляда всередині однієї бази. ",[17,67,54],{}," ваша.\n",[17,70,19],{}," належить Supabase, і ",[17,73,74],{},"storage"," теж, бо там лежить рядок, що описує\nкожен завантажений файл. Власна документація Supabase називає їх керованими\nсхемами і каже, що їх\n",[77,78,82],"a",{"href":79,"rel":80},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Flocal-development\u002Fcli-workflows",[81],"nofollow","зазвичай не потрібно забирати, якщо ви їх не змінювали",",\nі саме тому інструменти поводяться з ними інакше, ніж із вашими таблицями.",[10,85,86],{},"Цей поділ і дозволяє одній команді народити два файли, схожі один на одного й\nнаповнені цілком різним.",[88,89],"diagram",{"alt":90,"caption":91,"src":92},"Файл дампа, стрілка від якого дістає суцільну панель із чотирма засвіченими таблицями, позначену галочкою. Друга стрілка спиняється біля пунктирної стіни перед пунктирною панеллю зі знаком Supabase, і ця панель містить розліновану картку з трьома людьми поруч із чотирма блідими зображеннями. На стіні стоїть хрестик.","Запущена сама по собі, команда дампа копіює форму вашої власної шухляди й спиняється на межі двох, якими керує Supabase.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fwhere-the-dump-stops-1600x620.png",[39,94,96],{"id":95},"що-команда-dump-пише-сама-по-собі","Що команда dump пише сама по собі",[10,98,99,100,62],{},"План поверхів. Жодного рядка і нічого з ",[17,101,19],{},[10,103,104,105,108,109,114,115,118,119,62],{},"Довідкова сторінка Supabase про цю команду каже це двома реченнями. Вона\nзапускає ",[17,106,107],{},"pg_dump"," із додатковими прапорцями, щоб виключити керовані Supabase\nсхеми, і серед ігнорованих\n",[77,110,113],{"href":111,"rel":112},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Freference\u002Fcli\u002Fsupabase-db-dump",[81],"є auth, storage і створені розширеннями",".\nТа сама сторінка далі каже, що типовий дамп не містить ані даних, ані власних\nролей, і що ви отримуєте їх, попросивши через ",[17,116,117],{},"--data-only"," і ",[17,120,121],{},"--role-only",[10,123,124],{},"Тож ось це, що ви найімовірніше й запускали:",[126,127,132],"pre",{"className":128,"code":130,"language":131},[129],"language-text","supabase db dump --db-url \"postgresql:\u002F\u002F…your connection string…\" -f backup.sql\n","text",[17,133,130],{"__ignoreMap":134},"",[10,136,137,138,141],{},"дає файл, повний інструкцій ",[17,139,140],{},"CREATE TABLE",". Кожен стовпець, кожен індекс, кожна\nполітика, яку ви написали на своїх таблицях, і жодного рядка чогось.",[10,143,144],{},"Причина, чому це гірше за очевидно порожній файл, у тому, що воно працює.\nМалим він теж не виглядає: кожне означення таблиці, кожен індекс і кожна\nполітика, яку ви колись написали, лежать усередині, а для справжнього\nзастосунку це чимало тексту. Порожня резервна копія оголошує себе сама. Ця\nвідновлюється чисто, і перше, що скаже вам інше, це сторінка входу, повз яку\nне проходить жоден акаунт.",[88,146],{"alt":147,"caption":148,"src":149},"Два файли поруч. Лівий пунктирний і містить дві порожні сітки таблиць поруч із порожнім контуром там, де мала б стояти картка, і він перекреслений. Правий містить ті самі дві таблиці із заповненими рядками, а на місці порожнього контуру розліновану картку з трьома людьми. Він позначений галочкою.","Та сама команда пише обидва. Який із них у вас у руках, вирішує прапорець, і обидва відновлюються без помилки.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fthe-plan-and-the-contents-1600x620.png",[39,151,153],{"id":152},"як-перевірити-дамп-який-у-мене-вже-є","Як перевірити дамп, який у мене вже є?",[10,155,156,157,159],{},"Відкрийте його в текстовому редакторі й пошукайте ",[17,158,19],{},". Те, що знайдеться,\nкладе ваш файл в одну з трьох груп.",[161,162,163,175,192],"ol",{},[164,165,166,169,170,172,173,62],"li",{},[25,167,168],{},"Жодного збігу."," Схеми ",[17,171,19],{}," немає в цьому файлі в жодному вигляді. Саме\nце пише голий ",[17,174,29],{},[164,176,177,191],{},[25,178,179,180,183,184,187,188,62],{},"Збіги, але лише в рядках, що починаються з ",[17,181,182],{},"CREATE",", ",[17,185,186],{},"ALTER"," або\n",[17,189,190],{},"GRANT"," У вас є креслення реєстру і нікого всередині.",[164,193,194,208,209,212],{},[25,195,196,197,200,201,204,205],{},"Рядок ",[17,198,199],{},"COPY \"auth\".\"users\""," або ",[17,202,203],{},"COPY auth.users",", під яким ідуть рядки\nданих до рядка з ",[17,206,207],{},"\\."," Або низка рядків, що починаються з\n",[17,210,211],{},"INSERT INTO \"auth\".\"users\"",". Ваші акаунти там.",[10,214,215],{},"Якщо вам зручніше в командному рядку, два grep відповідають на те саме:",[126,217,220],{"className":218,"code":219,"language":131},[129],"grep -c 'auth.*users' backup.sql\ngrep -n 'COPY .*auth.*users\\|INSERT INTO .*auth.*users' backup.sql\n",[17,221,219],{"__ignoreMap":134},[10,223,224],{},"Перший каже, чи дісталася схема до файла взагалі. Другий каже, чи дісталися\nлюди. Нуль від обох, на файлі, на який ви розраховували, краще виявити\nсьогодні, ніж того ранку, коли він знадобиться.",[10,226,227,228,230,231,62],{},"Пошукайте заодно й ",[17,229,74],{}," і уважно прочитайте, що знайдете. Ті рядки це\nперелік ваших завантажених файлів, а це інша річ, ніж самі файли, і\n",[77,232,234],{"href":233},"\u002Fblog\u002Fsupabase-storage-backup","жодна резервна копія бази на жодному плані їх не містить",[39,236,238],{"id":237},"як-експортувати-користувачів-auth-у-supabase","Як експортувати користувачів auth у Supabase?",[10,240,241],{},"Командою даних, яка є іншою командою, ніж та, що пише схему.",[10,243,244,249],{},[77,245,248],{"href":246,"rel":247},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fbackup-restore",[81],"Посібник Supabase із резервного копіювання та відновлення","\nпублікує копію як три файли, і їх варто побачити разом, бо ця форма і є\nвідповіддю:",[126,251,254],{"className":252,"code":253,"language":131},[129],"supabase db dump --db-url \"postgresql:\u002F\u002F…\" -f roles.sql --role-only\nsupabase db dump --db-url \"postgresql:\u002F\u002F…\" -f schema.sql\nsupabase db dump --db-url \"postgresql:\u002F\u002F…\" -f data.sql --use-copy --data-only \\\n  -x \"storage.buckets_vectors\" -x \"storage.vector_indexes\"\n",[17,255,253],{"__ignoreMap":134},[10,257,258],{},"Другий рядок це той, який запускають окремо. Третій це той, у якому ваші\nкористувачі.",[10,260,261,262,264],{},"Ці два факти виглядають як суперечність, і вони нею не є. Речення на довідковій\nсторінці Supabase про виключення ",[17,263,19],{}," описує дамп схеми, а дамп даних\nпроходить і цією схемою теж.",[10,266,267],{},"Якщо вам потрібні лише акаунти, назвіть схему і отримаєте саму цю шухляду:",[126,269,272],{"className":270,"code":271,"language":131},[129],"supabase db dump --db-url \"postgresql:\u002F\u002F…\" -f users.sql --data-only --use-copy --schema auth\n",[17,273,271],{"__ignoreMap":134},[10,275,276,283,284,286],{},[25,277,278,279,282],{},"Перш ніж покладатися на будь-яку з них, додайте ",[17,280,281],{},"--dry-run"," і прочитайте, що\nповернеться."," Вона друкує команду ",[17,285,107],{},", яку інструмент збирається\nзапустити, не запускаючи її, тож ви самі побачите, які схеми включені, а які\nвиключені у встановленій у вас версії. Прочитайте цей вивід один раз, і вам\nбільше ніколи не доведеться вірити ні цій статті, ні будь-якій іншій, а це\nважить, бо прапорці справді рухаються між випусками, і файл в обох випадках\nмає однаковий вигляд.",[10,288,289,290,296],{},"Є ще прямий шлях, і\n",[77,291,293,294],{"href":292},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","саме для нього існує звичайний ",[17,295,107],{},":\nназвіть шухляди, які вам потрібні, і він їх забере.",[126,298,301],{"className":299,"code":300,"language":131},[129],"pg_dump \"postgresql:\u002F\u002F…\" --schema public --schema auth --schema storage \\\n  --no-owner --file backup.sql\n",[17,302,300],{"__ignoreMap":134},[10,304,305,306,308],{},"Одна річ про файл схеми, бо вона пояснює, навіщо це взагалі розділено. Новий\nпроєкт Supabase приходить із уже побудованою схемою ",[17,307,19],{},", у тій версії, яку\nслужба входу крутить сьогодні. Накотити згори версію вашого старого проєкту\nозначало б покласти старіше креслення на те, що працює. Перенести ви хочете\nвміст реєстру, а його тримає файл даних.",[39,310,312],{"id":311},"що-ламається-коли-ви-повертаєте-користувачів","Що ламається, коли ви повертаєте користувачів",[10,314,315],{},"Дві речі, і Supabase документує обидві.",[10,317,318,321],{},[25,319,320],{},"Тригери, які здатні зашифрувати стовпець двічі."," Команда відновлення в\nпосібнику Supabase має посередині інструкцію, яку легко прочитати як шум:",[126,323,326],{"className":324,"code":325,"language":131},[129],"psql \\\n  --single-transaction \\\n  --variable ON_ERROR_STOP=1 \\\n  --file roles.sql \\\n  --file schema.sql \\\n  --command 'SET session_replication_role = replica' \\\n  --file data.sql \\\n  --dbname \"postgresql:\u002F\u002F…\"\n",[17,327,325],{"__ignoreMap":134},[10,329,330],{},"Цей середній рядок вимикає тригери на час операції, і посібник каже, що він\nтам, аби стовпці не шифрувалися вдруге на вході. Прокрутіть файл даних без\nнього, і паролі прибудуть уже переплутані процесом, який до них уже\nзастосовували, і ніщо потім цього не відмінить.",[10,332,333,336,337,340,341,344,345,340,348,351],{},[25,334,335],{},"Власність і права, які спинять прокручування."," Дамп, знятий із проєкту\nSupabase, несе рядки, що посилаються на ролі, до яких новий проєкт вас не\nпустить. Нотатки з усунення несправностей до того самого посібника кажуть\nзакоментувати будь-який рядок із ",[17,338,339],{},"ALTER ... OWNER TO \"supabase_admin\""," у\n",[17,342,343],{},"schema.sql"," і конкретний рядок ",[17,346,347],{},"GRANT \"postgres\" TO \"cli_login_postgres\"",[17,349,350],{},"roles.sql",". Обидва це текстова правка перед початком, і обидва спиняють\nпрокручування, надрукувавши на екрані рядок, на якому воно вдавилося.",[39,353,355],{"id":354},"чи-доведеться-моїм-користувачам-входити-знову","Чи доведеться моїм користувачам входити знову?",[10,357,358],{},"Їхні паролі переїжджають. Їхні сесії ні, якщо ви не візьмете з ними ще одну\nріч.",[10,360,361,362,364,365,370],{},"Supabase каже, що ви можете перенести кожну таблицю схеми ",[17,363,19],{},",\n",[77,366,369],{"href":367,"rel":368},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Fmigrating-auth-users-between-projects",[81],"разом із користувачами та їхніми хешованими паролями",",\nтож нікому не доведеться скидати пароль, який у нього вже був. Жоден пароль у\nжодній точці цього не читається; переїжджає його хеш.",[10,372,373,374,118,377,380,381,62],{},"Сесія це інша річ. Її доводить токен, підписаний власним секретом JWT вашого\nпроєкту, і в кожного проєкту він свій. Supabase каже, що якщо новий проєкт\nпідписує іншим секретом, кожен токен, який уже лежить у чиємусь браузері, стає\nнедійсним, і цю людину просять увійти знову. Цього можна уникнути, поставивши\nсекрет старого проєкту на новий, і ціна написана на тій самій сторінці: зміна\nсекрету JWT наново створює ключі ",[17,375,376],{},"anon",[17,378,379],{},"service_role"," того проєкту, тож\nвашому застосунку треба віддати нові, перш ніж він зможе з чимось говорити.\nЯкий ключ який, і якому з них узагалі місце у вашому застосунку, це\n",[77,382,384],{"href":383},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","те, у чому варто бути певним, перш ніж вставляти будь-який",[10,386,387,388,390],{},"Тож чесна версія така, що відновлення зазвичай просить усіх увійти один раз.\nЦе лист у підтримку. Це не втрачений акаунт, а різниця між цими двома в тому,\nчи була схема ",[17,389,19],{}," у вашому файлі.",[10,392,393,394,397],{},"Трьох речей у ньому однаково немає, хоч що ви робіть із прапорцями. Ваших\nзавантажених файлів, бо Storage тримає байти поза базою і\n",[77,395,396],{"href":233},"жоден дамп на жодному плані до них не дістає",".\nВаших edge-функцій, які є окремим завантаженням і чиї import maps, зазначає\nSupabase, не забираються автоматично. І налаштувань вашого проєкту, які є\nконфігурацією, а не даними, і вводяться руками наново.",[39,399,401],{"id":400},"що-зробити-цього-тижня","Що зробити цього тижня",[403,404,405],"key-takeaways",{},[406,407,408,414,423,429,436],"ul",{},[164,409,410,411,413],{},"Візьміть найсвіжіший файл резервної копії, який у вас є, і пошукайте в ньому ",[17,412,19],{},". Група один, два чи три з розділу вище, і ви знатимете за хвилину.",[164,415,416,417,118,419,422],{},"Якщо це група один або два, зніміть сьогодні дамп даних із ",[17,418,117],{},[17,420,421],{},"--use-copy"," і покладіть його поруч із файлом схеми, а не замість нього. Вам потрібні обидва.",[164,424,425,426,428],{},"Додайте ",[17,427,281],{}," до команди, на якій ви спинилися, і прочитайте вивід один раз, щоб знати, які шухляди забирає ваша версія інструмента.",[164,430,431,432,435],{},"Запишіть порядок відновлення там, де знайдете: roles, потім schema, потім ",[17,433,434],{},"SET session_replication_role = replica",", потім data.",[164,437,438],{},"Відновіть один раз у тимчасовий проєкт і потім спробуйте увійти справжнім користувачем. Це єдина перевірка, яка тестує те, про що ця стаття.",[10,440,441,442,445],{},"Зробити це один раз руками варто незалежно від того, як ви зрештою\nробитимете копії, бо доки ви не відкрили дамп, у вас було саме лише слово\n«резервна копія». Чи робити далі руками, це окреме питання, і\n",[77,443,444],{"href":292},"три шляхи та скільки коштує кожен","\nце місце, де на нього відповідають.",[39,447,449],{"id":448},"де-тут-місце-reeve-care","Де тут місце Reeve Care",[10,451,452],{},"Care знімає копію за розкладом, і реєстр у ній.",[88,454],{"alt":455,"caption":456,"src":457},"Панель Reeve Care з двома рядами. У першому пунктирний контур акаунта містить базу даних і реєстр людей, і обидва виходять із нього однією стрілкою у замкнений файл, який перечитують через лупу й позначають галочкою. У другому картка з кнопкою відправляє рядки бази назад в акаунт, тоді як реєстр усередині лишається засвіченим і недоторканим.","Копія тримає ваші таблиці й ваші акаунти. Кнопка відновлення повертає ваші таблиці й лишає акаунти там, де вони є.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcare-the-register-comes-too-1600x560.png",[406,459,460,472,482,488],{},[164,461,462,465,466,468,469,471],{},[25,463,464],{},"Ваші акаунти в копії."," Схема ",[17,467,19],{}," їде разом із вашими власними таблицями, бо копія застосунку на Supabase без його користувачів це копія половини. Рядки ",[17,470,74],{},", що описують ваші файли, теж приїжджають, і самі файли також, щойно ви під'єднаєте облікові дані Storage.",[164,473,474,477,478,481],{},[25,475,476],{},"Кнопка відновлення повертає ваші таблиці й лишає акаунти у спокої."," Прокрутити ",[17,479,480],{},"auth.users"," поверх живого проєкту означає вигнати всіх із системи й повернути акаунти, які хтось видалив навмисно, тож це лишається запитом, над яким є людина. Тож натиснути кнопку в паніці не вийде так, щоб вигнати клієнтів, яким ви намагалися допомогти.",[164,483,484,487],{},[25,485,486],{},"Копію перечитують, перш ніж вона зарахується як знята."," Дата у вашій панелі це останній раз, коли копію відкрили й перевірили, а не момент, коли стартувало завдання чи приземлився файл.",[164,489,490,493],{},[25,491,492],{},"Відновлення спершу робить знімок поточного стану",", тож у самого відновлення є скасування.",[10,495,496,497,501],{},"Care починається від $49 на місяць за один застосунок. Це прейскурантна ціна, і\n",[77,498,500],{"href":499},"\u002Fpricing","сторінка цін"," іноді нижча за цифру тут і ніколи не вища.",[10,503,504,505,62],{},"Як копію знімають, перевіряють і повертають, намальовано крок за кроком на\n",[77,506,508],{"href":507},"\u002Fsupabase-backups","сторінці резервних копій Supabase",[10,510,511,512,514,515,519],{},"Перш ніж закрити цю вкладку, відкрийте свій найсвіжіший дамп і пошукайте в\nньому ",[17,513,19],{},". Це найшвидший спосіб дізнатися, чи поверне вам ваших клієнтів те,\nщо ви називали резервною копією, і якщо відповідь ні,\n",[77,516,518],{"href":517},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","відновити її як належить"," це наступне\nдля читання.",{"title":134,"searchDepth":521,"depth":521,"links":522},3,[523,525,526,527,528,529,530,531],{"id":41,"depth":524,"text":42},2,{"id":95,"depth":524,"text":96},{"id":152,"depth":524,"text":153},{"id":237,"depth":524,"text":238},{"id":311,"depth":524,"text":312},{"id":354,"depth":524,"text":355},{"id":400,"depth":524,"text":401},{"id":448,"depth":524,"text":449},"Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcover-1200x630.png","Запечатаний архівний файл із трьома рядками даних, а поруч розлінований реєстр людей, що стоїть назовні й обрізаний краєм кадру.","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.",false,"md",[539,541,544,546,549,552],{"q":42,"a":540},"Залежить від того, яка команда написала файл. Ваші користувачі живуть у схемі auth, яка належить службі входу. Голий supabase db dump лишає auth осторонь і не містить жодного рядка чогось узагалі, бо типовий дамп це лише схема. Половина з даними, тобто друга команда з прапорцем --data-only, саме та, що несе ваших користувачів. Supabase публікує резервну копію як три команди саме через це.",{"q":542,"a":543},"Чому auth.users немає в моєму дампі?","Бо ви майже напевно запустили дамп схеми. Supabase документує, що команда виключає його керовані схеми, що серед ігнорованих є auth і storage, і що типовий дамп не містить даних узагалі. Це навмисно: новий проєкт приходить із власною схемою auth, уже побудованою службою входу, тож накотити згори старішу копію означало б замінити те, що працює. Перенести ви хочете вміст, а його несе дамп даних.",{"q":238,"a":545},"Командою даних, яка окрема від команди схеми. Запустіть supabase db dump з --data-only і --use-copy, щоб записати файл даних, і таблиці auth підуть разом. Якщо вам потрібні лише акаунти, додайте --schema auth і отримаєте файл лише з цією схемою. Перш ніж покладатися на будь-яку з них, додайте --dry-run: вона друкує команду pg_dump, яку CLI збирається запустити, не запускаючи її, тож ви прочитаєте, які схеми включені у вашій версії.",{"q":547,"a":548},"Чи переживають паролі відновлення Supabase?","Так, якщо схема auth була у файлі. Supabase каже, що ви можете перенести кожну таблицю схеми auth, разом із хешованими паролями, тож нікому не доведеться їх скидати чи створювати заново. Єдине, що здатне їх зіпсувати, це прокрутити дані, не вимкнувши спершу тригери, і саме тому Supabase ставить SET session_replication_role = replica посередині власної команди відновлення. Пропустіть цей рядок, і вже зашифрований стовпець зашифрується вдруге на вході.",{"q":550,"a":551},"Чи залишаться мої користувачі в системі після відновлення?","Ні, якщо новий проєкт підписує іншим секретом. Сесію доводить токен, підписаний секретом JWT проєкту, і Supabase каже, що новий секрет робить наявні токени недійсними, тож усіх попросять увійти знову. Ви можете перенести старий секрет і залишити всіх у системі, але Supabase також каже, що зміна секрету JWT наново створює ключі anon і service_role у тому проєкті, тож вашому застосунку потрібні нові.",{"q":553,"a":554},"Що ще лишає поза дампом Supabase?","Насамперед ваші завантажені файли. Storage тримає рядок у вашій базі для кожного файла, а сам файл в іншому місці, тож жоден дамп бази на жодному плані не містить байтів. Edge-функції це окреме завантаження, і Supabase зазначає, що import maps і файли deno.json не забираються автоматично. Налаштування проєкту, провайдери auth і секрети це конфігурація, а не дані, і живуть у панелі, тож у новому проєкті їх вводять руками наново.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",[557,558,559,560,561,562,563,564],"supabase backup auth users","експорт користувачів supabase","supabase db dump схема auth","міграція користувачів auth supabase","резервна копія supabase без користувачів","supabase auth.users export","відновити користувачів supabase","supabase dump виключає auth",{},true,"\u002Fblog\u002Fsupabase-backup-auth-users","2026-09-23",{"title":5,"description":535},"blog\u002Fsupabase-backup-auth-users",[572,573,574],"Supabase публікує свою резервну копію як три команди. Ту, яку ви найімовірніше запускали, це друга, а ваші користувачі у третій.","Запустіть supabase db dump без інших прапорців і отримаєте форму ваших таблиць і нічого з їхнього вмісту, а схема auth, у якій живуть користувачі, залишається поза навіть цим.","Один пошук у файлі, який у вас уже є, скаже, яку з трьох речей ви тримаєте.","ixvtpafntLlptxGx0wdPgYHHu_PTFzom_rlYd_UvM4E",[577,584,590,596,602,608,614,620,626,632,638,644,650,656,662,668,673,679,685,686,692,698,704,710,716,722,728,734,739,745,751,757,763,769,775,781,787,793,799,805,811,817,823,829,835,841,847,853,859,864,870,876,882,888,893,899,905,911,916,921],{"path":578,"title":579,"description":580,"published":581,"category":582,"image":583,"draft":536},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","Основи безпеки","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":585,"title":586,"description":587,"published":588,"category":582,"image":589,"draft":536},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":591,"title":592,"description":593,"published":594,"category":582,"image":595,"draft":536},"\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":597,"title":598,"description":599,"published":600,"category":582,"image":601,"draft":536},"\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":603,"title":604,"description":605,"published":606,"category":582,"image":607,"draft":536},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":582,"image":613,"draft":536},"\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":615,"title":616,"description":617,"published":618,"category":582,"image":619,"draft":536},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":621,"title":622,"description":623,"published":624,"category":582,"image":625,"draft":536},"\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":627,"title":628,"description":629,"published":630,"category":582,"image":631,"draft":536},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":633,"title":634,"description":635,"published":636,"category":582,"image":637,"draft":536},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":639,"title":640,"description":641,"published":642,"category":582,"image":643,"draft":536},"\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":645,"title":646,"description":647,"published":648,"category":582,"image":649,"draft":536},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":651,"title":652,"description":653,"published":654,"category":532,"image":655,"draft":536},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":657,"title":658,"description":659,"published":660,"category":532,"image":661,"draft":536},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":663,"title":664,"description":665,"published":666,"category":532,"image":667,"draft":536},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":669,"title":670,"description":671,"published":666,"category":582,"image":672,"draft":536},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":674,"title":675,"description":676,"published":677,"category":582,"image":678,"draft":536},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":680,"title":681,"description":682,"published":683,"category":582,"image":684,"draft":536},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":567,"title":5,"description":535,"published":568,"category":532,"image":555,"draft":536},{"path":687,"title":688,"description":689,"published":690,"category":582,"image":691,"draft":536},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":693,"title":694,"description":695,"published":696,"category":582,"image":697,"draft":536},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":699,"title":700,"description":701,"published":702,"category":582,"image":703,"draft":536},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":705,"title":706,"description":707,"published":708,"category":582,"image":709,"draft":536},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":711,"title":712,"description":713,"published":714,"category":582,"image":715,"draft":536},"\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":717,"title":718,"description":719,"published":720,"category":582,"image":721,"draft":536},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":723,"title":724,"description":725,"published":726,"category":582,"image":727,"draft":536},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":729,"title":730,"description":731,"published":732,"category":582,"image":733,"draft":536},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":233,"title":735,"description":736,"published":737,"category":532,"image":738,"draft":536},"Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":740,"title":741,"description":742,"published":743,"category":532,"image":744,"draft":536},"\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":746,"title":747,"description":748,"published":749,"category":532,"image":750,"draft":536},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":752,"title":753,"description":754,"published":755,"category":582,"image":756,"draft":536},"\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":758,"title":759,"description":760,"published":761,"category":582,"image":762,"draft":536},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":764,"title":765,"description":766,"published":767,"category":582,"image":768,"draft":536},"\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":770,"title":771,"description":772,"published":773,"category":582,"image":774,"draft":536},"\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":776,"title":777,"description":778,"published":779,"category":582,"image":780,"draft":536},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":782,"title":783,"description":784,"published":785,"category":582,"image":786,"draft":536},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":788,"title":789,"description":790,"published":791,"category":582,"image":792,"draft":536},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":794,"title":795,"description":796,"published":797,"category":582,"image":798,"draft":536},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":800,"title":801,"description":802,"published":803,"category":582,"image":804,"draft":536},"\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":806,"title":807,"description":808,"published":809,"category":582,"image":810,"draft":536},"\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":812,"title":813,"description":814,"published":815,"category":532,"image":816,"draft":536},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":818,"title":819,"description":820,"published":821,"category":582,"image":822,"draft":536},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":824,"title":825,"description":826,"published":827,"category":532,"image":828,"draft":536},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":830,"title":831,"description":832,"published":833,"category":582,"image":834,"draft":536},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":836,"title":837,"description":838,"published":839,"category":582,"image":840,"draft":536},"\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":842,"title":843,"description":844,"published":845,"category":582,"image":846,"draft":536},"\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":848,"title":849,"description":850,"published":851,"category":582,"image":852,"draft":536},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":854,"title":855,"description":856,"published":857,"category":532,"image":858,"draft":536},"\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":517,"title":860,"description":861,"published":862,"category":532,"image":863,"draft":536},"Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":865,"title":866,"description":867,"published":868,"category":582,"image":869,"draft":536},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":871,"title":872,"description":873,"published":874,"category":582,"image":875,"draft":536},"\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":877,"title":878,"description":879,"published":880,"category":532,"image":881,"draft":536},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":883,"title":884,"description":885,"published":886,"category":582,"image":887,"draft":536},"\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":889,"title":890,"description":891,"published":886,"category":582,"image":892,"draft":536},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":894,"title":895,"description":896,"published":897,"category":582,"image":898,"draft":536},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":900,"title":901,"description":902,"published":903,"category":532,"image":904,"draft":536},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":906,"title":907,"description":908,"published":909,"category":582,"image":910,"draft":536},"\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":912,"title":913,"description":914,"published":909,"category":532,"image":915,"draft":536},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":292,"title":917,"description":918,"published":919,"category":532,"image":920,"draft":536},"Три способи зробити резервну копію бази Supabase, і чого бракує","Панель, pg_dump і керований сервіс. Що насправді зберігає кожен спосіб, що тихо лишає осторонь і який із них переживе втрату акаунта.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":383,"title":922,"description":923,"published":919,"category":582,"image":924,"draft":536},"Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1791618974050]