Some checks failed
deploy-site / deploy (push) Failing after 40s
Release notes for 1.1.0 were split between an Unreleased section and the version section, so the published notes would have omitted the update-feed and desktop changes. Everything shipping in this version now sits under one `## [1.1.0]` heading. `docs/map/` becomes the entry point for what infrastructure exists per platform and how far each feature is developed, with a documented update protocol so feature work and this map do not drift apart again. The release guide now states that installer binaries live in the update feed rather than the repository.
101 lines
6 KiB
Markdown
101 lines
6 KiB
Markdown
# 09 — Backend: Supabase + Cloudflare Map
|
|
|
|
> Surfaces: `server/supabase` (Postgres + Deno Edge Functions), `server/cloudflare-worker` (edge gateway)
|
|
> Role: canonical product data, auth, RLS, storage, AI proxies, billing, notifications
|
|
|
|
---
|
|
|
|
## 1. Supabase project (`server/supabase/`)
|
|
|
|
- `config.toml` — project_id `d3ro-voice`; local ports API 55321 / DB 55322 / Studio 55323 / Inbucket 55324; DB major v17; storage 50 MiB; auth `site_url` localhost:5173, redirects include `https://d3ro.chanpaca.net` and `d3ro-voice://auth-callback`; external providers Google/GitHub/Apple; per-function `verify_jwt` settings; analytics off.
|
|
- `seed.sql`, `migrations/` (63), `functions/` (~27), `functions/_shared/`, `tests/`, `deno.json`.
|
|
|
|
> Note: root `supabase/` contains only empty scaffolding (`.branches/`, `snippets/`). The real project lives under `server/supabase/`.
|
|
|
|
### 1.1 Migrations (62) — thematic groups
|
|
|
|
| Theme | Examples |
|
|
|---|---|
|
|
| Core schema + RLS + auth triggers | initial tables, profiles, triggers |
|
|
| Storage buckets | audio, meeting documents, exports |
|
|
| Teams | team invites, membership, roles, `team_activities` feed (`20260913000033`) |
|
|
| Knowledge / RAG | `knowledge_documents`, `knowledge_chunks`, pgvector |
|
|
| Notifications / push | push tokens, durable outbox |
|
|
| Billing | Payple, Stripe, subscriptions, payment provider events/operations |
|
|
| Admin | admin roles, audit log, atomic admin RPCs |
|
|
| Mobile platform | mobile platform/monetization/runtime integrity |
|
|
| Commands | atomic command reorder |
|
|
| Devices | device registration + revocation |
|
|
| Content reporting | report reasons, generation receipts |
|
|
| Meetings | meeting documents |
|
|
| STT quota | atomic quota reservations (00026) |
|
|
| Ads | ad reward receipt replay protection (00028) |
|
|
|
|
Migration numbering referenced in SSOT goes up to `00028`; CI verifies `migration-up` + shadow replay.
|
|
|
|
### 1.2 Edge Functions (~27)
|
|
|
|
| Function | Purpose |
|
|
|---|---|
|
|
| `stt-proxy` | User STT gateway: auth, atomic quota reservation/refund, provider fallback, fail-closed |
|
|
| `llm-proxy` | LLM gateway (Claude/OpenAI) |
|
|
| `realtime-token` | OpenAI Realtime ephemeral token (tier-gated, session quota) |
|
|
| `generate-meeting-document` | AI document generation (minutes/report/idea-note/mindmap) |
|
|
| `embed-chunks` / `search-knowledge` | RAG embeddings + semantic search |
|
|
| `content-report` | AI content reporting |
|
|
| `team-invite` / `team-accept` | Team invitations |
|
|
| `send-push` | Push delivery |
|
|
| `account-delete` | Account deletion cascade + provider unlink |
|
|
| `admin-users` / `admin-subscriptions` / `admin-payments` / `admin-audit-log` | Admin operations |
|
|
| `billing-catalog` | Server pricing catalog |
|
|
| `stripe-checkout` / `stripe-portal` / `stripe-webhook` | Stripe billing |
|
|
| `payple-checkout` / `payple-manage` / `payple-renew` / `payple-webhook` | Payple billing (Korea) |
|
|
| `iap-verify` | Google Play / App Store purchase verification |
|
|
| `admob-ssv` | AdMob server-side verification + reward ledger |
|
|
| `google-play-rtdn` | Play Real-time Developer Notifications |
|
|
|
|
Shared contracts in `functions/_shared/`: admin, auth, audit, cors, quota, payple, push, llm, stt, team, generation-receipt, google-play, pubsub, generative-ai-safety (+ `*.test.ts`).
|
|
|
|
### 1.3 Tests (`server/supabase/tests/`)
|
|
|
|
Integration/E2E: content-report red e2e, content-reporting (ps1/sql), mobile platform/recording/reward-race, payment provider, mobile release preflight, public mobile runtime, push claim/outbox, team push security, STT quota.
|
|
|
|
---
|
|
|
|
## 2. Cloudflare worker (`server/cloudflare-worker/`)
|
|
|
|
- `wrangler.toml` — worker `d3ro-voice-api`, compat 2024-04-01, `BACKEND_ORIGIN=http://192.168.0.39:5050`, optional custom domain route (commented).
|
|
- `src/index.ts` — CORS preflight, `/worker-health`, forwards to backend origin with `X-Forwarded-*` / `X-D3RO-Edge-Proxy` headers.
|
|
|
|
Cloudflare Tunnel `kd-nas` maps public hostnames to NAS services.
|
|
|
|
---
|
|
|
|
## 3. Data model (product tables, high level)
|
|
|
|
Canonical product data lives in Supabase Postgres with RLS:
|
|
|
|
- **Identity:** `auth.users` + `profiles`, roles/claims, identity links.
|
|
- **Content:** `history`, `meetings`, `meeting_memos`, `meeting_documents`, `memos`, `dictionary`, `commands`/instructions, `templates`.
|
|
- **Knowledge:** `knowledge_documents`, `knowledge_chunks` (pgvector).
|
|
- **Teams:** teams, members, invites, activity feed (`team_activities`, RPC-only writes, realtime-enabled).
|
|
- **Delivery:** `devices`, `push_tokens`, push outbox.
|
|
- **Monetization:** `subscriptions`, `payment_provider_events/operations`, `ad_reward_claims`, IAP receipts, generation receipts.
|
|
- **Ops:** `audit_log` + admin operation records.
|
|
- **Portability:** `portable_exports` (+ storage).
|
|
|
|
Shared TS types for these live in `packages/api-client` (SSOT).
|
|
|
|
---
|
|
|
|
## 4. Backend status summary
|
|
|
|
- Auth (email + Google/GitHub/Apple), RLS, storage, realtime: **implemented**; production Auth + Google provider entry verified GREEN; GitHub/Apple provider secrets and mobile consent callback pending (external).
|
|
- STT/LLM proxies: **implemented** and fail-closed (no synthetic transcripts); atomic quota reservations verified with 20-way concurrency.
|
|
- Billing (Stripe + Payple + IAP verify + webhooks/RTDN): **implemented**; live provider end-to-end and Payple webhook signature verification pending.
|
|
- Ads (AdMob SSV, rewarded ledger, replay protection): **implemented** (Edge v13 ACTIVE); production AdMob serving blocked externally (review/serving limits/store link/payment profile).
|
|
- Push: Supabase owns tokens/devices/outbox/retries. Transports implemented for **FCM, Web Push (VAPID + RFC 8291), and APNs (.p8 token)**; the Cloudflare Worker cron drains the outbox every minute. Android still requires FCM at the device. Details: `docs/deployment/push-transport-without-firebase.md`.
|
|
- Content safety: generation receipts + `content-report` **implemented**.
|
|
- Data portability (`account-delete`, export/restore): **implemented**.
|
|
|
|
External gates are enumerated in `docs/v3/MOBILE_APP_COMPLETION_SSOT.md` §0/§6 and mirrored in `11-gap-backlog.md` (`EXT-*`, `BE-*`).
|