0002. バックエンドに Supabase (PostgreSQL + Auth + RLS) を採用¶
- ステータス: Accepted(実装済み)
- 関連: 0003 マルチテナント分離を RLS で実現 / 0009 API を Cloudflare Workers で構築
コンテキストと課題¶
約 100 社規模の B2B SaaS を少人数で開発・運用する。リレーショナルなドメイン (テナント・案件・ 車両・配車・計量・マニフェスト) を扱い、テナント間のデータ分離・認証・(将来の) ファイル保存が必要。 DB・認証・認可・ストレージを個別の自前基盤で構築・運用するコストは、この規模では見合わない。
決定¶
Supabase をバックエンド基盤として採用する。具体的には:
- PostgreSQL 15 をデータストアとする (
supabase/config.tomlの[db] major_version = 15)。 - Supabase Auth を認証基盤とする (
[auth] enabled = true、jwt_expiry = 3600)。 認証情報は JWT に乗り、app_metadataのtenant_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-67—create 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)。