ordinarthur 9c93e74318 replace Supabase with Postgres + Drizzle ORM
- Drop @supabase/supabase-js entirely; add drizzle-orm + postgres (porsager) driver
- New packages/db: schema (pgSchema ordinarthur_os), client factory, migrate runner, drizzle-kit config
- SQL migrations: 0000_init (pgcrypto + schema), 0001_jobs (jobs + job_search_criteria, no RLS)
- Rewrite apps/api db module with DI symbols DB/DB_HANDLE + @InjectDb() decorator
- Rewrite jobs.service.ts with Drizzle queries (upsert via onConflictDoUpdate, arrayOverlaps for stack filter)
- Replace SUPABASE_* env vars with DATABASE_URL in env config + .env.example
- Add docker-compose.yml (Postgres 16-alpine, dev only)
- Add deploy/k8s/postgres.yaml (StatefulSet + PVC), migrate.job.yaml, updated secrets.template.yaml
- Update all docs (README, PLAN, ARCHITECTURE, CLAUDE.md, AGENTS.md, packages/db/README.md)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 10:15:34 +02:00

47 lines
2.1 KiB
Markdown

# @ordinarthur-os/db
Schéma Postgres + migrations versionnées pour ordinarthur-os, via [Drizzle ORM](https://orm.drizzle.team).
La base tourne dans le cluster k3s d'Arthur (cf. [`deploy/k8s/postgres.yaml`](../../deploy/k8s/postgres.yaml)). Plus de Supabase — l'API NestJS parle directement à Postgres.
## Arbo
- `src/schema/` — définitions Drizzle (TypeScript). Une table = un fichier, réexporté depuis `schema/index.ts`.
- `src/client.ts` — factory `createDb(connectionString)` utilisée par l'API.
- `src/migrate.ts` — runner des migrations (consomme `DATABASE_URL`).
- `drizzle.config.ts` — config drizzle-kit.
- `migrations/` — SQL versionné (`0000_init.sql`, `0001_jobs.sql`, …) + `meta/_journal.json` exploité par le runner.
## Commandes
Depuis la racine du monorepo :
```bash
# 0. Lancer le Postgres de dev (cf. docker-compose.yml à la racine).
docker compose up -d
# 1. Générer un diff SQL à partir du schéma TS (nouvelle migration).
pnpm --filter @ordinarthur-os/db generate
# 2. Appliquer les migrations pendantes sur la base pointée par DATABASE_URL.
# Le .env de apps/api suffit : le script lit process.env.DATABASE_URL.
pnpm --filter @ordinarthur-os/db migrate
# 3. Ouvrir Drizzle Studio (inspection UI).
pnpm --filter @ordinarthur-os/db studio
```
## Convention migrations
- `0000_init.sql` — extension `pgcrypto` + création du schéma `ordinarthur_os`. Idempotent (à ne PAS régénérer via drizzle-kit).
- `0001_jobs.sql` — tables `jobs` + `job_search_criteria` (Phase 1).
- `0002_todos.sql``todos` + `client_mutations` (Phase 2).
- `0003_projects.sql``projects`, `project_steps`, `project_ideas` (Phase 3).
- `0004_agenda.sql``calendar_events`, `google_oauth_tokens` (Phase 4).
- `0005_ai.sql``ai_actions` (Phase 5).
- `0006_health.sql``daily_checkins` (Phase 7).
## Plus de RLS
Contrairement au setup Supabase initial, la DB n'est **pas** exposée publiquement : le seul consommateur est l'API NestJS, protégée par bearer token. On ne déploie donc aucune policy RLS — c'est du pur isolement réseau (service ClusterIP interne) + contrôle d'accès Postgres classique.