[{"data":1,"prerenderedAt":790},["ShallowReactive",2],{"blog-uk-supabase-storage-backup":3,"blog-index-uk":442},{"id":4,"title":5,"body":6,"category":397,"cover":398,"coverAlt":399,"description":400,"draft":401,"extension":402,"faq":403,"image":419,"keywords":420,"meta":430,"navigation":431,"ogTitle":432,"path":433,"published":434,"seo":435,"stem":436,"tldr":437,"updated":434,"__hash__":441},"blog_uk\u002Fblog\u002Fsupabase-storage-backup.md","Supabase storage backup: у копії бази даних немає жодного файлу",{"type":7,"value":8,"toc":385},"minimark",[9,13,21,24,29,45,53,61,65,68,82,88,91,95,98,107,110,116,124,137,141,144,147,166,176,193,206,213,217,220,226,238,243,246,268,274,278,281,287,290,294,318,322,325,330,362,370,377],[10,11,12],"p",{},"Ви налаштували резервні копії для свого застосунку на Lovable чи Bolt, або\nплатите за план Supabase, який їх робить, і слово зробило свою справу: ви\nперестали хвилюватися. Потім відновлення, або переїзд у новий проєкт, і\nзастосунок повертається зі зламаним зображенням там, де раніше було кожне фото\nпрофілю. Кожна таблиця і кожен рядок на місці. Фотографії зникли, а з ними\nкожен рахунок, кожен експорт і кожен вкладений файл, який будь-коли завантажив\nкористувач.",[10,14,15,16,20],{},"Ось та частина, яку слово «резервна копія» приховує: ",[17,18,19],"strong",{},"Supabase storage backup\nце окрема робота, бо резервна копія бази даних містить рядок для кожного\nфайлу, який завантажили ваші користувачі, і жодного з файлів."," Рядок лежить у\nвашій базі даних. Файл лежить у Storage, окремому сервісі, і жодна копія бази\nданих на жодному плані туди не сягає. Ця стаття пояснює, як зняти ту другу\nкопію, і в якому порядку обидві половини повертаються назад, бо саме на цьому\nвсе ламається навіть тоді, коли у вас є обидві.",[10,22,23],{},"Допомагає уявити бібліотеку. Каталог це шухляда з картками, по одній на кожну\nкнижку, і кожна картка каже, на якій полиці книжка стоїть. Книжки стоять на\nполицях. Резервна копія бази даних копіює шухляду.",[25,26,28],"h2",{"id":27},"чи-робить-supabase-резервні-копії-моїх-файлів-у-storage","Чи робить Supabase резервні копії моїх файлів у Storage?",[10,30,31,32,39,40,44],{},"Ні, на жодному плані.\n",[33,34,38],"a",{"href":35,"rel":36},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbackups",[37],"nofollow","Документація Supabase про резервні копії","\nкаже, що копії не містять файлів, збережених через Storage API, лише їхні\nметадані в базі даних, а\n",[33,41,43],{"href":42},"\u002Fblog\u002Fsupabase-point-in-time-recovery","point-in-time recovery"," це функція\nбази даних, тож те саме речення покриває і його.",[10,46,47,48,52],{},"Що кожна копія таки містить, так це список. Supabase тримає у вашій базі\nPostgres таблицю з назвою ",[49,50,51],"code",{},"storage.objects",", по одному рядку на файл у кожному\nбакеті: у якому бакеті він лежить, його шлях, хто його завантажив, який він\nзавбільшки і коли прибув. Ця таблиця копіюється разом з усім іншим, і саме тому\nвідновлений проєкт виглядає таким повним. Кожна картка в шухляді.",[10,54,55,56,60],{},"Байти кожного файлу деінде. Вони живуть в обʼєктному сховищі, окремому сервісі\nпоруч із вашою базою даних, і інструмент, який копіює базу даних, ніколи його\nне читає.\n",[33,57,59],{"href":58},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Безкоштовний план не робить жодних автоматичних копій",",\nтож там питання навіть не постає; від Pro і вище щоденна копія має ваші рядки і\nжодного з ваших завантажень.",[25,62,64],{"id":63},"де-supabase-зберігає-ваші-файли","Де Supabase зберігає ваші файли",[10,66,67],{},"У двох місцях, і резервна копія бази даних сягає одного з них.",[10,69,70,71,73,74,77,78,81],{},"Коли користувач завантажує аватар, ваш застосунок передає файл у Storage.\nStorage записує байти в обʼєктне сховище під назвою бакета і шляхом, і тією\nсамою операцією записує в ",[49,72,51],{}," рядок, який його описує. Ваш\nзастосунок потім тримає той шлях в одній зі своїх таблиць, скажімо в рядку\n",[49,75,76],{},"profiles"," зі стовпцем ",[49,79,80],{},"avatar_url",", і будує з нього посилання щоразу, коли\nзображення потрібне.",[10,83,84,85,87],{},"Отже, одне завантажене зображення це три речі: байти в обʼєктному сховищі,\nрядок у ",[49,86,51],{},", який веде Storage, і шлях у вашій власній таблиці.\nРезервна копія бази даних несе останні дві. Відновіть її, і ваш застосунок має\nкожен шлях, а Storage має кожен рядок, і посилання, яке вони разом будують,\nвказує на місце, де нічого немає.",[10,89,90],{},"Ось чому цей збій такий тихий. Кожен рядок узгоджується з кожним іншим, кожен\nпідрахунок сходиться, і кожна перевірка, яка читає базу даних, проходить,\nвключно з кроком верифікації у більшості інструментів резервного копіювання,\nбо файлів ніколи не було всередині того, що перевірялося.",[25,92,94],{"id":93},"як-виглядає-відновлення-лише-з-половиною","Як виглядає відновлення лише з половиною",[10,96,97],{},"Проєкт, який проходить кожну перевірку і показує зламане зображення всюди, де\nмав би зʼявитися файл.",[10,99,100,101,106],{},"Відновлення звітує про успіх, бо зробило те, про що його просили: таблиці на\nмісці, кількість рядків сходиться. Відкрийте панель, і Storage перелічує кожен\nбакет і кожен файл у ньому, з розмірами й датами, бо той перелік читається з\nтаблиці, яку відновлення щойно повернуло. Власний\n",[33,102,105],{"href":103,"rel":104},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fdashboard-restore",[37],"посібник Supabase про відновлення копії з панелі в новий проєкт","\nописує саме цей стан: бакети й метадані файлів зʼявляються, а обʼєктів за ними\nнемає.",[10,108,109],{},"Дізнаєтеся ви про це буденно. Сторінка команди показує ряд іконок зламаного\nзображення там, де були аватари. Клієнт відповідає на минуломісячний лист із\nрахунком, що посилання відкриває помилку. Хтось клацає файл у переглядачі\nStorage, і завантаження не вдається. Картка каже: полиця чотири, третя зліва,\nа полиця чотири порожня.",[111,112],"diagram",{"alt":113,"caption":114,"src":115},"Збережена копія вливається в пунктирний контур проєкту. Усередині таблиця з трьох засвічених рядків позначена галочкою, і кожен рядок зʼєднаний тонкою лінією з рамкою зображення, намальованою пунктиром і порожньою. Рамки перекреслені.","Відновлення повернуло кожен рядок, який описує файл. Файлів, які ці рядки описують, ніколи не було в копії.","\u002Fblog\u002Fsupabase-storage-backup\u002Fthe-list-came-back-1600x620.png",[10,117,118,119,123],{},"Ніщо не попереджає вас до цієї миті, бо кожне попередження, яке у вас є,\nпідʼєднане до бази даних.\n",[33,120,122],{"href":121},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase","\nпроходить пʼять способів, якими відновлення повертається зламаним, і файли це\nтой рядок у тій таблиці, для якого немає ради, якщо ви не зняли з них копію.",[10,125,126,127,131,132,136],{},"Поки сторінка Storage відкрита, варто знати, що вона показує сторонньому. Наше\nбезкоштовне сканування читає ваш живий застосунок ззовні і просить у кожного\nбакета його список файлів, використовуючи лише ключ, який і так лежить у коді\nвашого застосунку. У серпні 2026 року воно отримало список від 792 із 27 269\nзастосунків, які змогло перевірити, цифра з\n",[33,128,130],{"href":129},"\u002Fresearch\u002Fvibe-coded-app-security-2026","нашого власного дослідження",". Воно\nчитає назви і ніколи не завантажує файл, триває близько 20 секунд і не потребує\nоблікового запису: ",[33,133,135],{"href":134},"\u002Fsecurity-scanner","проскануйте свій застосунок",".",[25,138,140],{"id":139},"як-зробити-резервну-копію-бакета-supabase-storage","Як зробити резервну копію бакета Supabase Storage?",[10,142,143],{},"Через сумісний із S3 ендпоїнт, однією командою, яка копіює цілий бакет у теку,\nяку тримаєте ви.",[10,145,146],{},"Supabase Storage говорить протоколом S3, а це означає, що звичайні інструменти,\nзбудовані для сховища Amazon, працюють і з вашим. Це єдиний крок у цій статті,\nякий відбувається в командному рядку, і його варто зробити раз власноруч, щоб\nзнати, з чого складається копія.",[148,149,150,154,157],"ol",{},[151,152,153],"li",{},"У панелі Supabase відкрийте налаштування Storage і увімкніть протокол S3. На\nтій самій сторінці показано URL ендпоїнта і регіон вашого проєкту; скопіюйте\nобидва звідти, а не звідси.",[151,155,156],{},"На тій сторінці створіть пару ключів доступу S3. Секрет показують лише раз,\nтож покладіть його в менеджер паролів, перш ніж закрити діалог.",[151,158,159,160,165],{},"Встановіть ",[33,161,164],{"href":162,"rel":163},"https:\u002F\u002Faws.amazon.com\u002Fcli\u002F",[37],"командний рядок AWS",", дайте йому\nобидва ключі як профіль і запустіть по одній синхронізації на бакет:",[167,168,173],"pre",{"className":169,"code":171,"language":172},[170],"language-text","aws s3 sync s3:\u002F\u002Favatars .\u002Fsupabase-files\u002Favatars \\\n  --endpoint-url https:\u002F\u002F\u003Cproject-ref>.storage.supabase.co\u002Fstorage\u002Fv1\u002Fs3 \\\n  --region \u003Cregion>\n","text",[49,174,171],{"__ignoreMap":175},"",[10,177,178,179,182,183,188,189,192],{},"Запустіть її знову завтра, і вона скопіює лише те, що змінилося. ",[49,180,181],{},"rclone","\nробить ту саму роботу, якщо він вам ближчий; для великого бакета\n",[33,184,187],{"href":185,"rel":186},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Frclone-error-s3-protocol-error-received-listing-v1-with-istruncated-set-no-nextmarker-and-no-contents-e64d34",[37],"примітка Supabase з усунення проблем","\nрадить передати ",[49,190,191],{},"--s3-list-version 2",", інакше перелік може обірватися\nзарано.",[10,194,195,196,201,202,136],{},"Дві речі про цей ключ.\n",[33,197,200],{"href":198,"rel":199},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fstorage\u002Fs3\u002Fauthentication",[37],"Сторінка Supabase про автентифікацію S3","\nкаже, що ключ доступу S3 має повний доступ до кожного бакета і обходить Row\nLevel Security, тож його місце на сервері або на вашій власній машині, і ніколи\nу вашому застосунку. І він уміє не лише читати, а й писати, бо Supabase не видає\nдля Storage ключа лише на читання; хто його тримає, може видаляти файли так само\nлегко, як і копіювати. Поводьтеся з ним так, як поводилися б із\n",[33,203,205],{"href":204},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","ключем service_role",[10,207,208,209,212],{},"Потім покладіть теку кудись поза вашим акаунтом Supabase, з\n",[33,210,211],{"href":58},"тієї ж причини, з якої копія бази даних має жити поза ним",":\nпризупинений проєкт або втрачений вхід забирає з собою кожну копію, збережену\nвсередині того акаунта.",[25,214,216],{"id":215},"спочатку-файли-чи-спочатку-рядки","Спочатку файли чи спочатку рядки?",[10,218,219],{},"Спочатку база даних, потім файли, і файли повертаються через Storage, щоб рядки\nзаписав Storage.",[10,221,222,223,225],{},"Кожне завантаження, яке проходить через Storage, із вашого застосунку, через\nендпоїнт S3 чи через CLI Supabase, робить дві речі однією операцією: зберігає\nбайти і записує рядок ",[49,224,51],{},", який їх описує. Книжку ставлять на\nполицю, і картку пише та сама рука. Поверніть файли цим шляхом, і рядки прибудуть\nразом із ними, і ці двоє не зможуть розійтися.",[10,227,228,229,231,232,237],{},"Інший напрямок такого механізму не має. Копіювання рядків ",[49,230,51],{},"\nназад інструментом для бази даних пише картки і не ставить нічого на полиці.\nВоно ще й ускладнює наступний крок: за замовчуванням Storage відмовляє\nзавантаженню на шлях, який уже має рядок, з помилкою про те, що ресурс уже\nіснує, а\n",[33,233,236],{"href":234,"rel":235},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fstorage\u002Fuploads",[37],"посібник Supabase із завантажень","\nкаже, що це обходять, увімкнувши перезапис. Тож коли відновлення бази даних уже\nповернуло рядки, а саме це й пропонує зробити власний посібник Supabase з\nміграції, копіювання файлів, що йде після нього, мусить мати дозвіл на\nперезапис.",[111,239],{"alt":240,"caption":241,"src":242},"Дві смуги. У верхній збережена копія входить просто в базу даних і засвічує три рядки, тоді як контейнер, намальований під стрілкою, лишається пунктирним і порожнім, а смуга перекреслена. У нижній три зображення спершу входять у контейнер, стрілка веде далі від контейнера до бази даних, і ті самі три рядки засвічуються в міру того, як зображення прибувають. Нижня смуга позначена галочкою.","Файл, який прибуває через Storage, записує власний рядок. Рядок, який прибуває через базу даних, не приносить із собою жодного файлу.","\u002Fblog\u002Fsupabase-storage-backup\u002Fthrough-storage-or-around-it-1600x620.png",[10,244,245],{},"Отже, порядок:",[148,247,248,254,265],{},[151,249,250,251,136],{},"Відновіть базу даних так, як описує\n",[33,252,253],{"href":121},"та стаття",[151,255,256,257,260,261,264],{},"Скопіюйте файли назад через Storage, командою ",[49,258,259],{},"aws s3 sync"," у зворотному\nнапрямку (спочатку тека, потім бакет) або командою\n",[49,262,263],{},"supabase storage cp -r",", з увімкненим перезаписом. Бакет, якого більше\nнемає, треба створити заздалегідь, з тією самою назвою і тим самим\nналаштуванням публічності.",[151,266,267],{},"Відкрийте файл, а потім іще кілька.",[10,269,270,271,273],{},"Найчистіша версія цього взагалі пропускає відтворення ",[49,272,51],{}," на\nкроці бази даних і дає завантаженням записати кожен рядок наново, тож ніколи\nнічого не доводиться перезаписувати. Саме так робить наше власне відновлення.\nДля цього копію треба відфільтрувати перед відтворенням, а це крок для\nінструмента, який виконує відновлення.",[25,275,277],{"id":276},"як-перевірити-що-у-вас-є-обидві-половини","Як перевірити, що у вас є обидві половини",[10,279,280],{},"Відкриваючи файли, бо кожен список, який ви можете витягти, читається з\nтаблиці.",[10,282,283,284,286],{},"Переглядач файлів у панелі, запит до ",[49,285,51],{}," і кількість рядків у\nзвіті про резервну копію описують шухляду, і після відновлення лише бази даних\nшухляда бездоганна. Єдиний запит, який торкається полиці, це запит на сам\nфайл.",[10,288,289],{},"Тож після відновлення, і після першої копії, яку ви знімете, відкривайте файли.\nВізьміть жменю з кожного бакета, включно з найстарішими, і відкрийте їх через\nзастосунок так, як це зробив би користувач. Файл, який відкрився, повернувся.\nФайл, який дає помилку, ніколи там не був, хай що каже список.",[25,291,293],{"id":292},"що-зробити-цього-тижня","Що зробити цього тижня",[295,296,297],"key-takeaways",{},[298,299,300,303,309,312,315],"ul",{},[151,301,302],{},"Відкрийте Storage у панелі Supabase і запишіть кожен бакет і приблизно те, що в ньому лежить. Усе, що завантажив користувач, живе там і в жодній резервній копії бази даних.",[151,304,305,306,308],{},"Увімкніть протокол S3, створіть ключ доступу і запустіть по одному ",[49,307,259],{}," на бакет у теку поза вашим акаунтом Supabase. Тримайте секрет у менеджері паролів; він видаляє так само легко, як копіює.",[151,310,311],{},"Запускайте синхронізацію знову за розкладом, якого ви дотримаєтеся, чи то нагадування в календарі, чи завдання на сервері.",[151,313,314],{},"Запишіть порядок відновлення там, де знайдете: спочатку база даних, потім файли через Storage з увімкненим перезаписом.",[151,316,317],{},"Відновіть один раз у одноразовий проєкт і відкрийте десять файлів, щоб уперше дізнатися, чи працює копія, не під час збою.",[25,319,321],{"id":320},"де-тут-місце-reeve-care","Де тут місце Reeve Care",[10,323,324],{},"Care копіює файли разом із базою даних, у тому порядку, який описує ця стаття,\nі повертає їх тим самим шляхом.",[111,326],{"alt":327,"caption":328,"src":329},"Панель Reeve Care з двома рядами. У першому база даних і зображення стоять усередині пунктирного контуру акаунта. База даних виходить із нього як збережений файл, який замикають, перечитують через лупу і позначають галочкою, з номером один, і лише тоді зображення виходить як другий збережений файл, з номером два. У другому ряду картка з кнопкою надсилає одну копію назад в акаунт, з номером один, і другу копію вздовж стрілки, яка дорогою проходить через контейнер, з номером два.","Копію бази даних перечитують, і вона проходить перевірку, перш ніж копіюють файли. На зворотному шляху база даних іде першою, а файли повертаються через Storage.","\u002Fblog\u002Fsupabase-storage-backup\u002Fcare-database-then-files-1600x560.png",[298,331,332,338,344,350,356],{},[151,333,334,337],{},[17,335,336],{},"Файли, які завантажили ваші користувачі, теж копіюються",", щойно ви підключите бакети Storage свого застосунку на Supabase. Це другий ключ, який просять окремо, бо ключ, що його Supabase видає для Storage, уміє не лише читати, а й писати, і ми радше спитаємо, ніж складемо його в одне з ключем бази даних, який писати не вміє.",[151,339,340,343],{},[17,341,342],{},"Копіювання файлів іде після того, як копію бази даних перечитано і перевірено",", ніколи поруч, тож точка відновлення ніколи не приписує собі файлів, яких не скопіювала. Копія, якій забракло часу, позначається як часткова, зі справжніми числами.",[151,345,346,349],{},[17,347,348],{},"Кожна точка відновлення записує, який шлях тримав який файл."," База даних, повернута на вівторок, отримує файли вівторка, а файл, який і досі на місці, лишають у спокої.",[151,351,352,355],{},[17,353,354],{},"Відновлення повертає файли через Storage",", тож кожен рядок записує те завантаження, яке несе файл. Ніщо з того, що існує сьогодні, не перезаписується і не видаляється, а це означає, що натиснута в паніці кнопка не може знищити те, що ви намагалися врятувати.",[151,357,358,361],{},[17,359,360],{},"Відновлення це кнопка",", і перед стартом воно робить знімок поточного стану, тож навіть у відновлення є власне скасування.",[10,363,364,365,369],{},"Care починається з $49 на місяць за один застосунок. Це прайсова ціна, а\n",[33,366,368],{"href":367},"\u002Fpricing","сторінка цін"," іноді буває нижчою за цифру тут і ніколи вищою.",[10,371,372,373,136],{},"Як копію знімають, перевіряють і повертають, разом із файлами, крок за кроком\nнамальовано на\n",[33,374,376],{"href":375},"\u002Fsupabase-backups","сторінці про резервні копії Supabase",[10,378,379,380,384],{},"Перш ніж закрити цю вкладку, відкрийте Storage у своїй панелі й порахуйте\nбакети. Кожен із них це набір файлів, якого жодна копія, зроблена Supabase,\nніколи не міститиме, і команда синхронізації вище це все, що потрібно, щоб це\nзмінити. Якщо якийсь бакет до того ж виявився доступним для переліку,\n",[33,381,383],{"href":382},"\u002Fblog\u002Fsupabase-storage-bucket-public","що отримує сторонній з того списку"," це\nнаступне, що варто прочитати.",{"title":175,"searchDepth":386,"depth":386,"links":387},3,[388,390,391,392,393,394,395,396],{"id":27,"depth":389,"text":28},2,{"id":63,"depth":389,"text":64},{"id":93,"depth":389,"text":94},{"id":139,"depth":389,"text":140},{"id":215,"depth":389,"text":216},{"id":276,"depth":389,"text":277},{"id":292,"depth":389,"text":293},{"id":320,"depth":389,"text":321},"Backups","\u002Fblog\u002Fsupabase-storage-backup\u002Fcover-1200x630.png","База даних із трьома рядками, кожен зʼєднаний тонкою лінією із зображенням, що стоїть в окремому лотку поруч.","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.",false,"md",[404,407,410,413,416],{"q":405,"a":406},"Чи робить Supabase резервні копії моїх бакетів Storage?","Ні. Supabase пише це на власній сторінці про резервні копії: копії бази даних не містять файлів, збережених через Storage API, лише рядки бази даних, які їх описують. Це стосується щоденних копій на платних планах і point-in-time recovery. Безкоштовний план не робить жодних автоматичних копій, тож там питання й не постає. Вашим файлам потрібна власна копія на будь-якому плані.",{"q":408,"a":409},"Чи покриває point-in-time recovery Supabase Storage?","Ні. Point-in-time recovery відмотує базу даних, а Storage це окремий сервіс, до якого база тримає лише шляхи. Проєкт, відмотаний на вівторок, вказує на те, що лежить у бакетах сьогодні, і файл, видалений у середу, лишається видаленим після відновлення, яке спрацювало бездоганно.",{"q":411,"a":412},"Як завантажити всі файли з бакета Supabase?","Через сумісний із S3 ендпоїнт. Увімкніть протокол S3 у налаштуваннях Storage у своїй панелі, створіть пару ключів доступу і спрямуйте командний рядок AWS або rclone на ендпоїнт і регіон, надруковані на тій самій сторінці. Одна команда синхронізації копіює цілий бакет у теку, яку тримаєте ви. Панель завантажує по одному файлу за раз, чого вистачає для логотипа і зовсім не вистачає для бакета.",{"q":414,"a":415},"Що таке storage.objects?","Таблиця у вашій базі Postgres з одним рядком на кожен файл у кожному бакеті: у якому бакеті він лежить, його шлях, хто його завантажив, розмір і тип, і коли він прибув. Це покажчик. Байтів самого файлу в ній немає, і саме тому резервна копія бази даних може перелічити кожен ваш файл, не містячи жодного з них.",{"q":417,"a":418},"Якщо я відновлю базу даних, чи повернуться мої файли?","Ні. Відновлення повертає рядки storage.objects, тож панель перелічує кожен файл і ваш застосунок малює кожне посилання, і кожне з них відкривається помилкою, бо файлу за ним ніколи не було в копії. Файли треба повертати окремо, через Storage, з копії, яку ви з них зняли.","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",[421,422,423,424,425,426,427,428,429],"supabase storage backup","резервна копія бакета supabase storage","чи робить supabase резервні копії storage","supabase storage objects backup","резервна копія файлів supabase","відновити supabase storage","supabase s3 storage backup","завантажити всі файли з бакета supabase","supabase storage disaster recovery",{},true,"Supabase storage backup: у вашій копії немає жодного файлу","\u002Fblog\u002Fsupabase-storage-backup","2026-09-14",{"title":5,"description":400},"blog\u002Fsupabase-storage-backup",[438,439,440],"Supabase storage backup це окрема робота, відділена від резервної копії бази даних. Кожна копія, яку робить Supabase, на будь-якому плані, містить рядок, що описує кожен завантажений файл, і жодного з самих файлів.","Відновіть лише базу даних, і ви отримаєте робочий застосунок, у якому кожен аватар, кожен рахунок і кожне завантаження відкривається помилкою, бо файл, на який вони вказують, ніколи не був у копії.","Сумісний із S3 ендпоїнт це спосіб скопіювати файли назовні. Шлях назад лежить через сам Storage, який записує відповідний рядок, щойно прибуває кожен файл, тож список і файли не можуть розійтися.","n4Rif2bCZLGas9aUOOS5la9wklNiZjLoVYzG_YuEBu8",[443,450,456,462,468,474,480,486,492,498,504,510,516,522,528,534,539,545,551,557,563,569,575,581,587,593,599,605,606,611,617,623,629,635,641,647,653,659,665,671,677,683,689,695,701,707,713,719,725,730,735,741,747,753,758,764,769,775,780,786],{"path":444,"title":445,"description":446,"published":447,"category":448,"image":449,"draft":401},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","Основи безпеки","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":451,"title":452,"description":453,"published":454,"category":448,"image":455,"draft":401},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":457,"title":458,"description":459,"published":460,"category":448,"image":461,"draft":401},"\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":463,"title":464,"description":465,"published":466,"category":448,"image":467,"draft":401},"\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":469,"title":470,"description":471,"published":472,"category":448,"image":473,"draft":401},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":475,"title":476,"description":477,"published":478,"category":448,"image":479,"draft":401},"\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":481,"title":482,"description":483,"published":484,"category":448,"image":485,"draft":401},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":487,"title":488,"description":489,"published":490,"category":448,"image":491,"draft":401},"\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":493,"title":494,"description":495,"published":496,"category":448,"image":497,"draft":401},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":499,"title":500,"description":501,"published":502,"category":448,"image":503,"draft":401},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":505,"title":506,"description":507,"published":508,"category":448,"image":509,"draft":401},"\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":511,"title":512,"description":513,"published":514,"category":448,"image":515,"draft":401},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":517,"title":518,"description":519,"published":520,"category":397,"image":521,"draft":401},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":523,"title":524,"description":525,"published":526,"category":397,"image":527,"draft":401},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":529,"title":530,"description":531,"published":532,"category":397,"image":533,"draft":401},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":535,"title":536,"description":537,"published":532,"category":448,"image":538,"draft":401},"\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":540,"title":541,"description":542,"published":543,"category":448,"image":544,"draft":401},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":546,"title":547,"description":548,"published":549,"category":448,"image":550,"draft":401},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":552,"title":553,"description":554,"published":555,"category":397,"image":556,"draft":401},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":558,"title":559,"description":560,"published":561,"category":448,"image":562,"draft":401},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":564,"title":565,"description":566,"published":567,"category":448,"image":568,"draft":401},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":570,"title":571,"description":572,"published":573,"category":448,"image":574,"draft":401},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":576,"title":577,"description":578,"published":579,"category":448,"image":580,"draft":401},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":582,"title":583,"description":584,"published":585,"category":448,"image":586,"draft":401},"\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":588,"title":589,"description":590,"published":591,"category":448,"image":592,"draft":401},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":594,"title":595,"description":596,"published":597,"category":448,"image":598,"draft":401},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":600,"title":601,"description":602,"published":603,"category":448,"image":604,"draft":401},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":433,"title":5,"description":400,"published":434,"category":397,"image":419,"draft":401},{"path":42,"title":607,"description":608,"published":609,"category":397,"image":610,"draft":401},"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":612,"title":613,"description":614,"published":615,"category":397,"image":616,"draft":401},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":618,"title":619,"description":620,"published":621,"category":448,"image":622,"draft":401},"\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":624,"title":625,"description":626,"published":627,"category":448,"image":628,"draft":401},"\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":630,"title":631,"description":632,"published":633,"category":448,"image":634,"draft":401},"\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":636,"title":637,"description":638,"published":639,"category":448,"image":640,"draft":401},"\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":642,"title":643,"description":644,"published":645,"category":448,"image":646,"draft":401},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":448,"image":652,"draft":401},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":448,"image":658,"draft":401},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":448,"image":664,"draft":401},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":448,"image":670,"draft":401},"\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":672,"title":673,"description":674,"published":675,"category":448,"image":676,"draft":401},"\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":678,"title":679,"description":680,"published":681,"category":397,"image":682,"draft":401},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":448,"image":688,"draft":401},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":693,"category":397,"image":694,"draft":401},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":699,"category":448,"image":700,"draft":401},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":702,"title":703,"description":704,"published":705,"category":448,"image":706,"draft":401},"\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":708,"title":709,"description":710,"published":711,"category":448,"image":712,"draft":401},"\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":714,"title":715,"description":716,"published":717,"category":448,"image":718,"draft":401},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":720,"title":721,"description":722,"published":723,"category":397,"image":724,"draft":401},"\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":121,"title":726,"description":727,"published":728,"category":397,"image":729,"draft":401},"Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":382,"title":731,"description":732,"published":733,"category":448,"image":734,"draft":401},"Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":736,"title":737,"description":738,"published":739,"category":448,"image":740,"draft":401},"\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":742,"title":743,"description":744,"published":745,"category":397,"image":746,"draft":401},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":748,"title":749,"description":750,"published":751,"category":448,"image":752,"draft":401},"\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":754,"title":755,"description":756,"published":751,"category":448,"image":757,"draft":401},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":759,"title":760,"description":761,"published":762,"category":448,"image":763,"draft":401},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":58,"title":765,"description":766,"published":767,"category":397,"image":768,"draft":401},"Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":770,"title":771,"description":772,"published":773,"category":448,"image":774,"draft":401},"\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":776,"title":777,"description":778,"published":773,"category":397,"image":779,"draft":401},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":781,"title":782,"description":783,"published":784,"category":397,"image":785,"draft":401},"\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":204,"title":787,"description":788,"published":784,"category":448,"image":789,"draft":401},"Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1791618975599]