Supabase FreeプランをスリープさせないためのKeep-Alive実装 ― TypeScript単体 × Cloudflare Workers

テンプレート

まえがき

本テンプレートのコードは自由にご利用いただけます。

少しでもプラスになれば筆者もうれしいです。


テンプレート紹介

SupabaseのFreeプランでは、一定期間アクセスがないプロジェクトは自動的に一時停止されます。検証用途や個人開発では十分ですが、永続的に使用したい場合には不向きです。

そこで本テンプレートでは、SupabaseがFreeプランのままスリープしないよう定期的にアクセスを発生させるというシンプルな仕組みを実装しています。


アプローチ概要

Cloudflare Workersを利用

Keep-Aliveで行う処理は単純です。
Supabaseの特定URLに対して定期的に HTTPリクエスト を送信するだけであり、フレームワークは使用しません。
この要件を満たすため、Cloudflare Workers を利用して TypeScript を定期実行する構成としました。

なぜCloudflare Workersを選んだのか

Cloudflare Workersの選定理由は次の2点です。

1. 純粋な TypeScript をそのまま実行できる

Cloudflare Workers は、フレームワークを前提とせず、TypeScript をそのまま実行できます。
今回のようにHTTP リクエスト送信のみといったシンプルな機能でも利用可能です。

2. 定期実行を公式にサポートしている

Cloudflare Workers(処理の定義)は、Cron Triggers (定期実行の仕組み)を使ってTypeScriptの処理を定期実行できます。

補足. GitHub連携も可能

Cloudflare WorkersはGitHub連携による自動デプロイにも対応しています。
本記事では最小構成を優先していますが必要に応じて CI/CD を構成できます。

技術スタック

  • TypeScript

GitHubリポジトリ

GitHub - xpendev/supabase-keepalive
Contribute to xpendev/supabase-keepalive development by creating an account on GitHub.

ローカルでの動作確認

npm run dev

$ npm run dev

> supabase-keepalive@1.0.0 dev
> wrangler dev


 ⛅️ wrangler 4.53.0 (update available 4.54.0)
─────────────────────────────────────────────
Using vars defined in .env.local
Your Worker has access to the following bindings:
Binding                                      Resource                  Mode
env.SUPABASE_KEEPALIVE_URL ("(hidden)")      Environment Variable      local
env.SUPABASE_ANON_KEY ("(hidden)")           Environment Variable      local

╭──────────────────────────────────────────────────────────────────────╮
│  [b] open a browser [d] open devtools [c] clear console [x] to exit  │
╰──────────────────────────────────────────────────────────────────────╯
▲ [WARNING] Scheduled Workers are not automatically triggered during local development.

  To manually trigger a scheduled event, run:
    curl "http://127.0.0.1:undefined/cdn-cgi/handler/scheduled"
  For more details, see
  https://developers.cloudflare.com/workers/configuration/cron-triggers/#test-cron-triggers-locally


⎔ Starting local server...
[wrangler:info] Ready on http://127.0.0.1:8787

To manually trigger a scheduled event, run:
curl “http://127.0.0.1:undefined/cdn-cgi/handler/scheduled”とあるのでこれを別ターミナルから実行する

別ターミナルでcURL実行

$ curl "http://127.0.0.1:8787/cdn-cgi/handler/scheduled"
ok

サーバーターミナルでログ出力される

⎔ Starting local server...
[wrangler:info] Ready on http://127.0.0.1:8787
Ping status: 200

Cloudflare Workers へのデプロイ方法

デプロイと環境変数設定はWrangler(CLI)から行います。
(事前にSupabaseとCloudflare Workersのアカウント登録が必要です)

デプロイ(npm run deploy)

$ npm run deploy

> supabase-keepalive@1.0.0 deploy
> wrangler deploy


 ⛅️ wrangler 4.53.0 (update available 4.54.0)
─────────────────────────────────────────────
Attempting to login via OAuth...
Opening a link in your default browser: https://dash.cloudflare.com/oauth2/auth?response_type=code&client_id=54d11594-84e4-41aa-b438-e81b8fa78ee7&redirect_uri=http%3A%2F%2Flocalhost%3A8976%2Foauth%2Fcallback&scope=account%3Aread%20user%3Aread%20workers%3Awrite%20workers_kv%3Awrite%20workers_routes%3Awrite%20workers_scripts%3Awrite%20workers_tail%3Aread%20d1%3Awrite%20pages%3Awrite%20zone%3Aread%20ssl_certs%3Awrite%20ai%3Awrite%20queues%3Awrite%20pipelines%3Awrite%20secrets_store%3Awrite%20containers%3Awrite%20cloudchamber%3Awrite%20connectivity%3Aadmin%20offline_access&state=7WcBMpwx_uQjJIy1l9FtYPqIXDiertr~&code_challenge=542Hu5cc6kykhFYXGaxZ6DSfP9GYybpQmgeroSVCKpY&code_challenge_method=S256

ブラウザが起動する
(Cloudflareへのアクセス許可が求めらる)

Allowボタンを押下する

$ npm run deploy
中略
Successfully logged in.
Total Upload: 0.71 KiB / gzip: 0.37 KiB
Uploaded supabase-keepalive (4.51 sec)
Deployed supabase-keepalive triggers (1.94 sec)
  https://supabase-keepalive.xpen913.workers.dev
  schedule: 0 * * * *
Current Version ID: e901b7a8-55d1-47d0-a411-20993cf31e24

※二回目以降はログインなしでデプロイ可能

環境変数設定(npx wrangler secret put 環境変数)

SupabaseのプロジェクトURL

プロジェクトURLの確認方法
Supabaseダッシュボード – Project Settings – Data Api – Project URL
(画像は割愛しているが”https://ランダム文字列.supabase.co/rest/v1/ping_log”形式)

コマンド実行結果

$ npx wrangler secret put SUPABASE_KEEPALIVE_URL

 ⛅️ wrangler 4.53.0 (update available 4.54.0)
─────────────────────────────────────────────
√ Enter a secret value: ... ****************************************
🌀 Creating the secret for the Worker "supabase-keepalive"
✨ Success! Uploaded secret SUPABASE_KEEPALIVE_URL
Supabaseの公開可能キー

公開可能キーの確認方法
Supabaseダッシュボード – Project Settings – API Keys – Publishable key
(画像は割愛しているが”sb_publishable_ランダム文字列”の形式)

コマンド実行結果

$ npx wrangler secret put SUPABASE_ANON_KEY

 ⛅️ wrangler 4.53.0 (update available 4.54.0)
─────────────────────────────────────────────
√ Enter a secret value: ... **********************************************
🌀 Creating the secret for the Worker "supabase-keepalive"
✨ Success! Uploaded secret SUPABASE_ANON_KEY

Cloudflare Workersダッシュボードで設定内容確認

デプロイ確認

Cloudflare Workersダッシュボードにアクセス

Cron確認

環境変数確認

Supabaseダッシュボードでログ確認

Supabaseダッシュボードにアクセス

Supabaseダッシュボード – Logs – API Gateway


実装ポイント

scheduled() 関数の実装

Cron Triggersの呼び出し先はscheduled()関数であるため、その実装が必須となります。

async scheduled(_event: ScheduledEvent, env: Env, _ctx: ExecutionContext) {

wrangler.tomlの設定方法

[triggers]
crons = ["0 * * * *"]

Cron式:左から分 時 日 月 曜日の順であり、例は分が0なので毎時00分(1時間ごと)に実行されます。

参考リンク


タイトルとURLをコピーしました