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