本文へスキップ
開発日記読了 約4

Supabase 無料プランの自動一時停止で本番が落ちた話 — GitHub Actions keepalive 対策

Supabase 無料プランの自動一時停止で本番が落ちた話 — GitHub Actions keepalive 対策

JurisCode.AI の個人開発プロダクト Lifefolio で、ある朝突然ログインも同期もできなくなりました。原因は Supabase 無料プランの仕様——7日間アクセスがないとプロジェクトが自動一時停止される——です。この記事では、実際に起きた症状、数分で終わる復旧手順、そして GitHub Actions の cron で定期 ping を打つ keepalive の恒久対策(workflow 全文つき)をまとめます。

何が起きたか

Lifefolio は無料ベータとして公開しており、バックエンドに Supabase の Free プランを使っています。ある日ふと本番を開くと、ログインが失敗し、既存ユーザーのデータ同期も全滅していました。

ブラウザのコンソールを見ると、Supabase のホスト名の解決自体が失敗しています。ERR_NAME_NOT_RESOLVED、つまり NXDOMAIN です。サーバーがエラーを返しているのではなく、接続先そのものが消えている状態でした。アプリ側のコードは1行も変えていないのに、です。

なぜ起きるか: Free プランの仕様

Supabase の Free プランには「プロジェクトへのアクティビティが7日間ないと、プロジェクトを自動的に一時停止(pause)する」という仕様があります。一時停止されるとデータベースだけでなく API のエンドポイントごと止まるため、外から見るとホストが存在しない(NXDOMAIN)ように見えます。

Lifefolio はベータ公開直後でアクセスがまばらだったうえ、開発の主戦場が別プロダクトに移っていた時期でした。ダッシュボードすら1週間開かなければ、条件は簡単に満たされます。個人開発の「作った直後の静かな時期」こそ、いちばん踏みやすい罠だと思います。

復旧手順: 数分で戻る

復旧自体は簡単です。方法は2つあります。

  1. ダッシュボードから: 対象プロジェクトを開くと「Restore」ボタンが出ているので押すだけ。数分で復帰します
  2. Management API から: アクセストークンがあれば curl 一発で復旧をキックできます
curl -X POST "https://api.supabase.com/v1/projects/<project-ref>/restore" \
  -H "Authorization: Bearer <management-api-access-token>"

Lifefolio もダッシュボードの Restore から数分で全機能が復旧しました。データは消えていません。ただし「気づくまでの間ずっと落ちている」のが本当の被害です。

恒久対策: GitHub Actions で keepalive

「7日間アクセスなし」が条件なら、7日未満の間隔で機械的にアクセスすればいい。GitHub Actions の cron で3日ごとに Supabase の REST API を ping する workflow を組みました。全文はこれだけです。

name: Supabase keepalive

on:
  schedule:
    - cron: "17 20 */3 * *"
  workflow_dispatch:

jobs:
  ping:
    runs-on: ubuntu-latest
    steps:
      - name: Ping Supabase REST API
        run: |
          curl --fail -sS -o /dev/null \
            "${{ secrets.SUPABASE_URL }}/rest/v1/<table>?select=id&limit=1" \
            -H "apikey: ${{ secrets.SUPABASE_ANON_KEY }}" \
            -H "Authorization: Bearer ${{ secrets.SUPABASE_ANON_KEY }}"

ポイントは3つあります。

  • キーは anon(publishable)キーで十分。テーブルは RLS で保護されているので、読める行がなくてもリクエスト自体がアクティビティとして数えられます。service_role キーを CI に置く必要はありません
  • secrets に `SUPABASE_URL` と `SUPABASE_ANON_KEY` を登録し、workflow には値を直書きしない
  • cron の分は0分ちょうどを避ける。毎時0分は GitHub Actions 全体で混雑し、遅延やスキップが起きやすいため、17 20 */3 * * のように分をずらしておくと安定します

不安なら */3(3日ごと)を毎日にしても、無料枠のコストは誤差です。さらに Management API のアクセストークンを secrets に足せば、「ping が失敗したら restore を叩く」ところまで自動化できます。

まとめ: チェックリスト

Supabase 無料プランで本番を運用しているなら、次を確認しておくことをおすすめします。

  • Free プランは7日間アクセスなしで自動一時停止することを知っておく(症状は NXDOMAIN)
  • 落ちたらダッシュボードの Restore か Management API の POST /v1/projects/{ref}/restore で数分で復旧できる
  • GitHub Actions の cron で7日未満の間隔の keepalive ping を仕込む(anon キー + RLS で安全に)
  • cron の分は 17 などにずらして、0分の混雑を避ける

Lifefolio の開発では、こうした障害も含めて品質ゲートの運用に学びを還元しています。その開発体制自体の話は「Claude Code と多エージェントで6日間でプロダクトを作った開発体制の話」に書いたので、あわせてどうぞ。

#Supabase#GitHub Actions#個人開発