85 lines
4.0 KiB
Markdown
85 lines
4.0 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) |
|
||
| `seed_004_dogfooding_kairo_jinkendo` | Python (dev) | Deprecated — Dogfooding-Visualisierung, **nicht** Produkt; nur Nicht-Prod |
|
||
|
||
Dev-Seeds (`.dev.*` im Dateinamen) laufen **nicht in Production** (`ENVIRONMENT=production`) und werden in Dev **bei jedem Backend-Start** erneut ausgeführt.
|
||
|
||
### Prod-taugliche Seeds (laufen auch auf main)
|
||
|
||
| Seed | Verhalten Prod |
|
||
|------|----------------|
|
||
| `seed_002_bootstrap_admin` | Legt Admin **nur** an, wenn DB leer **und** `KAIRO_BOOTSTRAP_*` in `.env` gesetzt |
|
||
|
||
### Code-Registry (kein Data-Seed — identisch Dev/Prod)
|
||
|
||
Beim Backend-Start (`entrypoint.sh`, überspringbar via `SKIP_REGISTRY_SYNC=1`):
|
||
|
||
- `sync_rights_registry.py` — Capabilities
|
||
- `sync_prompt_feature_config.py` — Features/Prompts
|
||
- `sync_entity_field_registry.py` — Archetypen + Felddefinitionen aus `entity_archetypes/registry.py`
|
||
|
||
Zusätzlich im Code (Deploy-Artifact, keine DB-Seed-Datei): `method_profiles/registry.py`, `steering/methods/registrations/*`, Starter-Kits in `archetype_starter_kit.py`.
|
||
|
||
## 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`).
|