コンテンツにスキップ

0002. バックエンドに Supabase (PostgreSQL + Auth + RLS) を採用

コンテキストと課題

約 100 社規模の B2B SaaS を少人数で開発・運用する。リレーショナルなドメイン (テナント・案件・ 車両・配車・計量・マニフェスト) を扱い、テナント間のデータ分離・認証・(将来の) ファイル保存が必要。 DB・認証・認可・ストレージを個別の自前基盤で構築・運用するコストは、この規模では見合わない。

決定

Supabase をバックエンド基盤として採用する。具体的には:

  • PostgreSQL 15 をデータストアとする (supabase/config.toml[db] major_version = 15)。
  • Supabase Auth を認証基盤とする ([auth] enabled = truejwt_expiry = 3600)。 認証情報は JWT に乗り、app_metadatatenant_id / tenant_type / role を後段の RLS とアプリが共通利用する (ADR 0003)。
  • 行レベルセキュリティ (RLS) をテナント分離・認可の主機構とする。最初のテーブル (manifests) から enable row level security 済みで、テナント単位ポリシーを張る。
  • Storage / Realtime / Edge Functions も有効化 しておく ([storage] file_size_limit = "50MiB"[realtime] enabled = true)。現時点の主用途は Postgres + Auth + RLS。
  • スキーマは supabase/migrations/** の SQL マイグレーション で管理し、冪等に書く (create table if not exists / create or replace function / drop policy if exists; create policy)。

クライアント (Web / Mobile) は Supabase クライアント SDK から直接 DB を読み書きし、アクセス可否は RLS が判定する。service_role を要する管理操作のみ API 層に寄せる (ADR 0009)。

影響 (Consequences)

良い点

  • DB・認証・認可・ストレージ・自動生成 API がワンストップで揃い、初期構築・運用コストが小さい。
  • RLS により 認可ロジックを DB に集約 でき、クライアントが直接 DB を叩いても越権アクセスが 起きない (アプリ層の実装漏れに強い)。
  • マイグレーションがリポジトリ内 SQL として版管理され、CI で環境へ適用できる (ADR 0010)。

トレードオフ / 注意点

  • RLS への強い依存は、ポリシー設計を誤ると越権/不可視のバグに直結する。permissive(OR) 評価の 落とし穴など、RLS 固有の難しさを抱える (ADR 0006)。
  • 認可の権威が JWT クレーム (app_metadata) にあるため、ロール/テナント変更を即時反映するには トークン再取得が要る。現状は Auth Hook を使わず app_metadata 経路で運用 (将来 membership テーブル設計時に再検討)。
  • Supabase / Postgres のマネージド前提に乗るため、特殊な拡張や極端なスケールでは制約を受け得る (現状の規模では問題にならない判断)。

根拠 (典拠)

  • supabase/config.toml[db] major_version = 15 / [auth] enabled = true, jwt_expiry = 3600, additional_redirect_urls = ["wastelink://"] / [auth.email] enable_confirmations = false / [storage] enabled = true, file_size_limit = "50MiB" / [realtime] enabled = true
  • supabase/migrations/00000000000000_manifests.sql:27-67create table ... public.manifests(tenant_id/image_url 等) と alter table public.manifests enable row level security
  • supabase/migrations/00000000000000_manifests.sql:70-76 — テナント単位の SELECT ポリシー例。
  • CONTRIBUTING.md:128-137 — マイグレーションは冪等に書く方針。
  • README.md:17 — Backend: Supabase (PostgreSQL / Auth / Storage / Realtime)。