All checks were successful
Deploy Development / deploy (push) Successful in 33s
Test Suite / pytest-backend (push) Successful in 29s
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Test Suite / k6 /api/health Baseline (push) Successful in 18s
Test Suite / playwright-smoke (push) Successful in 12s
68 lines
3.1 KiB
Markdown
68 lines
3.1 KiB
Markdown
# Migrationen & Data-Seeds
|
||
|
||
Kairo trennt **Schema-Migrationen** (einmalig) von **Data-Seeds** (idempotent, bei Änderung erneut ausführbar).
|
||
|
||
## Schema-Migrationen
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Pfad** | `backend/migrations/NNN_beschreibung.sql` |
|
||
| **Tracking** | Tabelle `schema_migrations` |
|
||
| **Ausführung** | Beim Backend-Start (`run_migrations.py`), überspringbar via `SKIP_DB_MIGRATE=1` |
|
||
| **Regel** | Jede Datei wird **genau einmal** angewendet. Änderungen → neue nummerierte Datei. |
|
||
|
||
### Aktuelle Schema-Migrationen
|
||
|
||
| Nr. | Datei | AP | Inhalt |
|
||
|-----|-------|-----|--------|
|
||
| 001 | `001_init_core.sql` | AP0.1 | `kairo_app_meta` |
|
||
| 002 | `002_auth_identity_tenant_actor.sql` | AP0.2 | User, Tenant, Actor, Session, `audit_log` |
|
||
| 003 | `003_data_seeds_tracking.sql` | AP0.2+ | `data_seeds` |
|
||
| 004 | `004_capabilities_registry.sql` | AP0.3 | `capabilities`, `role_capability_grants` |
|
||
| 005 | `005_prompt_feature_config_registry.sql` | AP0.4 | Feature/Prompt/Placeholder/Config |
|
||
| 006 | `006_initiatives_actions.sql` | AP0.5 | `initiatives`, `actions`, `action_assignments` |
|
||
|
||
Aktuelle Schema-Version: **`006`** (`backend/version.py` → `DB_SCHEMA_VERSION`).
|
||
|
||
## Data-Seeds
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Pfad** | `backend/seeds/seed_NNN_beschreibung.sql` oder `.py` |
|
||
| **Tracking** | Tabelle `data_seeds` (Name + SHA256-Checksum) |
|
||
| **Ausführung** | Nach Schema-Migrationen (`run_seeds.py`), überspringbar via `SKIP_SEEDS=1` |
|
||
| **Regel** | Seed läuft erneut, wenn die Datei **geändert** wurde (Checksum abweicht) oder `--force` gesetzt ist. |
|
||
|
||
### Umgebungsfilter
|
||
|
||
Dateien mit **`.dev.`** im Namen (z. B. `seed_001_….dev.sql`) laufen **nicht in Production** (`ENVIRONMENT=production`).
|
||
|
||
### Seeds manuell ausführen
|
||
|
||
```bash
|
||
docker compose -f docker-compose.dev-env.yml exec backend python run_seeds.py
|
||
docker compose -f docker-compose.dev-env.yml exec backend python run_seeds.py --only seed_001_cleanup_pytest_artifacts --force
|
||
```
|
||
|
||
## Aktuelle Seeds
|
||
|
||
| Seed | Typ | Zweck |
|
||
|------|-----|--------|
|
||
| `seed_001_cleanup_pytest_artifacts` | SQL (dev) | Entfernt pytest/CI-User (`*@example.com`), verwaiste Test-Tenants; löscht zuerst Initiatives (AP0.5 FK) |
|
||
| `seed_002_bootstrap_admin` | Python | Legt Systemadmin aus `KAIRO_BOOTSTRAP_*` an, wenn noch kein User existiert |
|
||
| `seed_003_ensure_dev_admin` | Python (dev) | Entfernt fremde Dev-User, stellt `lars@stommer.com` als Portal-Admin sicher (jeder Start) |
|
||
|
||
Dev-Seeds (`.dev.*`) werden in Nicht-Prod-Umgebungen **bei jedem Backend-Start** erneut ausgeführt.
|
||
|
||
## Neuen Seed anlegen
|
||
|
||
1. Datei `backend/seeds/seed_NNN_kurzname.sql` oder `.py` anlegen (Python: `def run() -> None:`).
|
||
2. SQL idempotent halten (`DELETE … WHERE …`, `INSERT … ON CONFLICT`, etc.).
|
||
3. Nur Dev/CI: `.dev.sql` / `.dev.py` Suffix verwenden.
|
||
4. Nach Deploy prüfen: `python run_seeds.py` — bei geänderter Datei wird der Seed automatisch erneut ausgeführt.
|
||
|
||
## Tests & CI
|
||
|
||
- pytest setzt `SKIP_SEEDS=1` beim App-Import; Cleanup läuft über Fixture + nach CI-pytest.
|
||
- Geteilte Dev-DB wird nach jedem Test-Lauf bereinigt (`run_seeds.py --only seed_001_cleanup_pytest_artifacts --force`).
|