Status: Accepted Datum: 2026-01-06 Entscheider: Entwicklungsteam Bezieht sich auf: ADR-015: Turso Database, ADR-027: Admin Bootstrap-Strategie
Kontext
Die Aquarius-Anwendung läuft auf fly.io mit einer Turso Cloud-Datenbank. Während der Entwicklung und bei Schema-Änderungen ist es notwendig, die Produktionsdatenbank zurückzusetzen und mit initialisierten Daten neu zu befüllen.
Herausforderungen:
- Produktionsdatenbank liegt in Turso Cloud (nicht lokal)
- Anwendung läuft in fly.io Container (kein direkter Dateisystem-Zugriff)
- Schema-Änderungen erfordern oft vollständigen Datenbank-Reset
- Seed-Daten müssen konsistent mit lokalem Development sein
Anforderungen:
- Sicherer und kontrollierter Reset der Produktionsdatenbank
- Wiederverwendung von bestehendem
seed_db.pyScript - Minimaler Aufwand für Entwickler
- Keine Notwendigkeit, neue Turso-Datenbank zu erstellen (Tokens bleiben gültig)
Entscheidung
Wir verwenden fly.io SSH + seed_db.py als primäre Strategie für Produktions-Datenbank-Resets.
Durchführung
# 1. SSH in den fly.io Container
flyctl ssh console
# 2. Im Container: Datenbank zurücksetzen und neu befüllen
python seed_db.py
# 3. Container verlassen
exit
Optionale Schritte (wenn Admin-User angepasst werden soll):
flyctl ssh console
python init_admin.py
exit
Begründung
Warum Option 1: fly.io SSH + seed_db.py?
Pro ✅
- Wiederverwendung: Nutzt bestehendes, getestetes
seed_db.pyScript - Konsistenz: Identische Daten wie in lokaler Entwicklung
- Einfachheit: Keine zusätzliche Infrastruktur oder Tools benötigt
- Sicher: Läuft direkt im Produktions-Container mit korrekten Credentials
- Atomisch:
seed_db.pyführtreset_database()→seed_data()in einem Durchlauf aus - Kein Token-Management: Turso-Auth-Token bleiben gültig (keine fly.io secrets update nötig)
- Reproduzierbar: Gleiche Seed-Daten in dev/staging/prod
Contra ⚠️
- Erfordert
flyctlCLI und Login - Produktions-Downtime während des Resets (kurz, ~10-30 Sekunden)
- Terminal-Zugang erforderlich (kein Web-Interface)
Alternativen (nicht gewählt)
Alternative 2: Turso-Datenbank neu erstellen
turso db destroy aquarius
turso db create aquarius --location fra
turso db tokens create aquarius --expiration none
flyctl secrets set DATABASE_URL='libsql://...'
flyctl deploy
Contra:
- ❌ Viel mehr Schritte
- ❌ Neue Auth-Tokens erforderlich
- ❌
flyctl secretsUpdate + Re-Deploy (langsamer) - ❌ Höheres Fehlerrisiko (mehrere manuelle Schritte)
Wann sinnvoll:
- Datenbank ist korrumpiert
- Turso-Region soll gewechselt werden
- Komplett neues Setup erforderlich
Alternative 3: SQL-Migration Scripts
flyctl ssh console -C "python -m alembic upgrade head"
Contra:
- ❌ Funktioniert nur für Schema-Updates, nicht für kompletten Reset
- ❌ Seed-Daten müssen separat eingefügt werden
- ❌ Migrations-History muss gepflegt werden
Wann sinnvoll:
- Produktionsdaten sollen erhalten bleiben
- Nur Schema-Änderungen notwendig (zukünftig, wenn echte Produktionsdaten existieren)
Konsequenzen
Positiv ✅
- Developer Experience: Ein einfacher Befehl (
flyctl ssh console+python seed_db.py) - Wartbarkeit:
seed_db.pybleibt Single Source of Truth für Initialdaten - Schnelligkeit: Reset dauert nur ~30 Sekunden
- Testbarkeit: Lokale Tests mit
make db-seedhaben identische Daten wie Produktion
Negativ ⚠️
- Produktionsdaten gehen verloren: Nur während Early Development akzeptabel
- Manueller Prozess: Kein Automation (aber für seltene Operation akzeptabel)
Risiko-Mitigation
Problem: Versehentlicher Reset mit Datenverlust
Mitigation (wenn Produktionsdaten wichtig werden):
- Vor jedem Reset:
make db-export-turso(Backup erstellen, siehe ADR-025) seed_db.pyfragt Bestätigung ab:if os.getenv("FLY_APP_NAME"): # Läuft auf fly.io confirm = input("⚠️ Production DB Reset! Continue? [yes/NO]: ") if confirm != "yes": sys.exit(1)- Später: Migration zu Alembic für Schema-Updates ohne Datenverlust
Workflows
Entwicklung (lokal)
cd web
make db-seed # Verwendet docker compose exec
Produktion (fly.io)
# Option A: SSH + manueller Befehl (empfohlen für volle Kontrolle)
flyctl ssh console
python seed_db.py
exit
# Option B: One-liner (schneller, aber weniger sichtbar)
flyctl ssh console -C "python seed_db.py"
Produktion-Reset mit Admin-Setup
flyctl ssh console
python seed_db.py # Reset + Seed mit Default-Admin
python init_admin.py # Interaktiv: Sicheres Admin-Passwort setzen
exit
Zukunft: Migration zu Alembic
Wenn Aquarius echte Produktionsdaten hat, muss diese Strategie abgelöst werden durch:
- Schema-Änderungen: Alembic Migrations (siehe ADR-007)
- Daten-Migrationen: Custom Python Scripts
- Seed-Daten: Nur für neue Installationen, nicht für Updates
Zeitpunkt: Wenn die erste echte Veranstaltung in Produktion stattfindet.
Referenzen
- ADR-007: Alembic Migrations
- ADR-015: Turso Database
- ADR-025: Database-Export Targets
- ADR-027: Admin Bootstrap-Strategie
/web/backend/seed_db.py- Implementierung/web/Makefile-db-seedTarget