Für die öffentlich erreichbare Instanz (dev.openbureau.ch):
1. Reverse-Proxy nur /auth/* durchreichen — /rest, /storage, /realtime raus.
PostgREST /rest/v1/ gab die komplette DB-Schema-Beschreibung (OpenAPI) preis;
der Browser nutzt Supabase nur fürs Login, Daten laufen über /api/*.
(Caddy-Block in create-openbureau-lxc.sh + proxmox/README.md angepasst.)
2. GoTrue GOTRUE_RATE_LIMIT_TOKEN_REFRESH=100 — bremst Brute-Force aufs /token,
das public direkt gegen GoTrue läuft (nicht übers Node-Rate-Limit).
3. db/schema.sql: revoke all from anon/authenticated auf posts/comments/forums/
threads; grants nur noch service_role. RLS bleibt so auch bei künftigen
Policies dicht (Defense-in-Depth statt "RLS ohne Policy").
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- auth: Supabase-JWT lokal verifizieren (hono/jwt, HS256) statt GoTrue-
Roundtrip pro Request; JWT_SECRET in cms-env, Remote-Fallback wenn ungesetzt
- dialog: comment_stats-View (group by thread) ersetzt Full-Table-Scan +
JS-Aggregation bei jedem Forum-Aufruf
- ops: scripts/backup-db.sh (pg_dump, rotiert) + täglicher Cron im Proxmox-
Script — Dialog-Daten liegen nur in Postgres, nicht in Git
- security: Rate-Limit auf Schreib-Endpunkte (/api non-GET, 60/min je Nutzer)
- perf: Cache-Control (1 Woche) auf statische Assets, HTML bleibt frisch
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Problem: Init-Scripts (docker-entrypoint-initdb.d) laufen nur beim allerersten
DB-Start. Neue Tabellen aus schema.sql (forums/threads) landeten daher nicht in
einer bereits initialisierten Produktiv-DB → "relation public.forums does not
exist" auf der Dialog-Seite.
- docker-compose.yml: neuer einmaliger `migrate`-Service spielt das idempotente
schema.sql als supabase_admin (Superuser, keine Owner-Konflikte) bei jedem
`up` ein und lädt den PostgREST-Cache neu; cms wartet via
service_completed_successfully darauf.
- routes/dialog.js: fehlende Tabelle führt nicht mehr zu rohem SQL-Fehler —
leere Liste + server-seitiges Log statt 500 auf der Seite.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ADMIN_EMAILS (.env) = Admins, sehen/bearbeiten alles
- Autor:innen sehen nur Einträge mit ihrer Mail unter `authors:`; Ersteller wird
beim Anlegen automatisch Autor
- Kollaboration: Feld „Autor:innen" im Editor → mehrere Mails = gemeinsamer Zugriff
- API erzwingt Zugriff bei list/read/save (403 ohne Recht)
- ADMIN_EMAILS in compose + LXC-Script (fragt Admin-Mail ab)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>