運用と注意点
本番投入前に押さえるべきこと。スキーマ管理、環境分離、ホスティング統合、料金最適化、 セルフホスト、トラブルシュートまで。
環境分離(dev / staging / prod)
- ローカル CLI で開発:
supabase start - Staging プロジェクト: 本番に近い設定で動作確認
- 本番プロジェクト: ユーザ向け
- 環境変数で URL / KEY を切り替える
- マイグレーションは Git 管理して全環境で同じ SQL を流す
マイグレーション運用
- スキーマ変更は必ず
supabase migration newで SQL ファイル化 - Studio の GUI でいじったら
supabase db diffで差分を SQL 化 - CI で
supabase db pushを実行 → ステージングで検証 - 破壊的変更(DROP / 型変更)は段階的に(add → backfill → cut over → drop)
typical CI パイプライン
PR 作成 → preview 環境 (Vercel)
↓
ステージング DB に migration push (auto)
↓
e2e テスト
↓
main へ merge → 本番に migration push
型生成を CI で自動化
# GitHub Actions
- run: npx supabase gen types typescript \
--project-id $PROJECT_ID > lib/database.types.ts
- run: |
git diff --quiet || (git config user.name bot && \
git commit -am "chore: update db types" && git push)
シードデータ
-- supabase/seed.sql
insert into posts (title, content) values
('hello', 'world'),
('foo', 'bar');
supabase db reset で migrations + seed が流れる。
Vercel / Next.js での統合
- Vercel プロジェクトの環境変数に URL / anon / service_role を設定
- Preview / Production で違うプロジェクトを指す
- middleware.ts でセッションリフレッシュ
- Server Component で
createServerClient - Client Component で
createBrowserClient
環境変数の典型
# プレビュー(ステージング DB)
NEXT_PUBLIC_SUPABASE_URL=https://staging-xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=...
# 本番
NEXT_PUBLIC_SUPABASE_URL=https://prod-xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=...
# サーバ専用(Vercel の Environment Variables で「Hidden」に)
SUPABASE_SERVICE_ROLE_KEY=...
パフォーマンス
SELECT を絞る
select("*")ではなく必要な列だけ- JOIN(埋め込み構文)も列を指定
インデックス
- 頻出 WHERE / ORDER BY 列に必ず
- RLS で参照されるカラムも忘れずに
- Studio の Reports → Performance でスロークエリ確認
N+1 を避ける
- ループの中で supabase クエリを呼ばない
- 埋め込み構文 or RPC で 1 クエリにまとめる
Connection Pooler
- Serverless / Edge は:6543(Transaction mode)を使う
- 長時間接続には:5432(Session mode)
料金最適化
- Free プランの1 週間アイドル停止を避けるには Pro へ
- 巨大画像は外部 CDN(Cloudflare Images / R2)に逃がす
- Realtime 多用は同時接続上限に注意
- Egress(送信転送量)が意外に膨らむ — 必要な列だけ select
- Edge Function の実行時間 / 呼び出し回数を監視
監視・観測
- Dashboard → Reports でクエリ統計
- Logs Explorer でリアルタイムログ
- 外部に流すならLogflare(Supabase 内部で使用、設定可)
- アラートはまだ弱め — Datadog / Grafana に流すのが定石
バックアップ戦略
- Pro: 7 日間の自動バックアップ
- Team: PITR(任意の時刻に復元)
- 定期的に
pg_dumpで外部に保存 - マイグレーションは Git で履歴化
セルフホスト
OSS 版は完全無料。AWS / GCP / 自前サーバに Docker Compose で立てられる。
メリット
- 料金はインフラ代のみ
- データ主権 / プライバシー要件
- カスタマイズ可能
デメリット
- 運用 / バックアップ / 監視を全部自分で
- アップデート追従が大変
- Realtime / Storage のクラスタ化がやや手間
サードパーティ運用
- Coolify: 自前サーバに 1 クリックで Supabase
- Sliplane / Railway: マネージドな Supabase 自前ホスト
セキュリティ Tips の総まとめ
- すべての public スキーマのテーブルにRLS 有効化
- service_role キーは絶対にクライアントに出さない
- Auth: パスワード強度設定、漏洩済み拒否、Captcha 有効化
- Storage: 個人ファイルは Private + folder 分離
- Edge Function: API キーをハードコードしない、Secrets で管理
- レート制限: 公開エンドポイントは Cloudflare / WAF で保護
- 監査ログ: 重要操作はaudit テーブルに書き込む
監査ログの実装例
create table audit_log (
id bigserial primary key,
user_id uuid,
table_name text,
operation text,
old_data jsonb,
new_data jsonb,
at timestamptz default now()
);
create function log_change()
returns trigger as $$
begin
insert into audit_log (user_id, table_name, operation, old_data, new_data)
values (auth.uid(), tg_table_name, tg_op,
case when tg_op != 'INSERT' then to_jsonb(old) else null end,
case when tg_op != 'DELETE' then to_jsonb(new) else null end);
return coalesce(new, old);
end;
$$ language plpgsql security definer;
create trigger posts_audit
after insert or update or delete on posts
for each row execute function log_change();
商用採用例
- Mozilla(Firefox の Supabase 利用)
- 多数の SaaS スタートアップ(Cal.com、Scrimba、ChatGPT 系ツール)
- Vercel テンプレートの多くがデフォルト
他の選択肢との比較
| Supabase | Firebase | PocketBase | Hasura + DB | |
|---|---|---|---|---|
| DB | Postgres | Firestore | SQLite | 任意 |
| OSS | ○ | × | ○ Go 1 バイナリ | ○ |
| セルフホスト | ○ | × | ◎ 簡単 | ○ |
| Realtime | ○ | ○ | ○ | ○ GraphQL Subscription |
| 規模 | 中〜大 | 大 | 個人〜小 | 大 |
失敗事例から学ぶ
- RLS 忘れ → 全データ漏洩。「全テーブルチェック」を CI に組み込む
- service_role キー漏洩 → 即時ローテーション、過去のキーを失効
- 巨大トラフィック → Connection Pool、CDN、Cache 層を入れる
- マイグレーション順序ミス → ステージングで必ず流してから本番
- 料金爆発 → Egress / Realtime / Function の使用量監視を仕込む
関連リソース
本セクションの総括
- セットアップ でローカルと本番を分ける
- Database でスキーマと SQL を書く
- Auth でログインフロー
- RLS で必ず権限を定義
- Realtime / Storage / Edge Functions で機能拡張
- 本ページの運用を守る
最後に
Supabase は普通の Postgres + 周辺サービス。 BaaS を使っている自覚を持ちつつ、いざとなれば DB を持ち出して別環境で動かせる安心感が魅力。 まずローカルで触り、RLS の理解に時間をかけるのが本番化の近道。