まえがき
本テンプレートのコードは自由にご利用いただけます。
少しでもプラスになれば筆者もうれしいです。
テンプレート紹介
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リポジトリ
ローカルでの動作確認
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時間ごと)に実行されます。

