diff --git a/SANIERUNGS_FORTSCHRITT.md b/SANIERUNGS_FORTSCHRITT.md new file mode 100644 index 0000000..ec30f67 --- /dev/null +++ b/SANIERUNGS_FORTSCHRITT.md @@ -0,0 +1,169 @@ +# LeoCRM Sanierungsfortschritt + +**Letztes Update:** 2026-08-02 +**Git-Commit:** dfd9e77 (main) +**Alembic-Head:** 0091 +**Produktion:** https://crm.media-on.de — healthy + +> Diese Datei ist der kompakte Fortschritts-Tracker für den Sanierungsplan. +> Der vollständige Sanierungsplan steht in `docs/ABSCHLUSSBERICHT_PHASE0_PHASE1.md`. +> Die Installationsanleitung steht in `docs/INSTALL.md`. + +--- + +## Phasen-Status + +| Phase | Status | Commit | Tests | Migration | +|-------|--------|--------|-------|----------| +| 0 — Ausgangsbasis | ✅ Abgeschlossen | v-phase0-baseline | — | — | +| 1 — Login, DB-Rollen, RLS | ✅ Abgeschlossen | 733fa1c | 35 Backend + 14 Plugin | 0085–0090 | +| 2 — Datenintegrität | ✅ Abgeschlossen | 745bc4f | FK-Tests auf Produktion | 0091 | +| 3 — Plugin-Lifecycle | ✅ Abgeschlossen | dfd9e77 | 14/14 pytest | — | +| 4 — KI-Delegation | ⏳ Nicht begonnen | — | — | — | +| 5 — Outbox | ⏳ Teilweise (Gate 5) | cea21ff | Worker healthy | — | +| 6 — Workspaces | ⏳ Nicht begonnen | — | — | — | +| 7 — DMS/Attachments | ⏳ Nicht begonnen | — | — | — | +| 8 — Sicherheitsreste | ⏳ Nicht begonnen | — | — | — | +| 9 — CI/Quality Gates | ⏳ Nicht begonnen | — | — | — | +| 10 — Backup/Monitoring/Pilot | ⏳ Nicht begonnen | — | — | — | + +--- + +## Abgenommene Gates (Phase 0+1) + +| Gate | Beschreibung | Status | +|------|-------------|--------| +| Gate 1 | Reproduzierbares Coolify-Deployment | ✅ | +| Gate 2 | Neuinstallation auf leerer Datenbank | ✅ | +| Gate 3 | Vollständiger Restore-Test | ✅ | +| Gate 4 | Passwort-Reset end-to-end | ✅ | +| Gate 5 | Worker und Eventhandler | ✅ | + +--- + +## Produktions-Setup + +### Coolify-Ressourcen + +| Ressource | UUID | Typ | +|-----------|------|------| +| API (crm.media-on.de) | stvabl4vaqru7jclx4ittzr3 | Application | +| Worker | asxqaq3566to108xordck0ff | Service | +| PostgreSQL | (Coolify Service) | Service | +| Redis | (Coolify Service) | Service | + +### Datenbankrollen + +| Rolle | Superuser | BYPASSRLS | Verwendung | +|-------|----------|-----------|------------| +| crm_user | Ja | Ja | Bootstrap (POSTGRES_USER) | +| crm_migration | Nein | Ja | Alembic + Plugin-Migrationen (DDL) | +| crm_auth | Nein | Nein | Login, Authentifizierung | +| crm_api | Nein | Nein | API-Abfragen | +| crm_worker | Nein | Nein | ARQ-Worker, Outbox | + +### Volumes + +| Volume | Verwendung | +|--------|------------| +| crm-postgres-data | PostgreSQL-Daten | +| crm-redis-data | Redis-Daten | +| stvabl4vaqru7jclx4ittzr3_storage | API + Worker Storage (geteilt) | + +### Deployment + +```bash +# Full deploy (API + Worker) über Coolify API +COOLIFY_API_TOKEN= python scripts/deploy.py + +# Nur Verifikation +COOLIFY_API_TOKEN= python scripts/deploy.py --verify-only + +# Nur Worker +COOLIFY_API_TOKEN= python scripts/deploy.py --worker-only +``` + +--- + +## Was erledigt ist + +### Phase 0+1 (Security & RLS) +- 5 DB-Rollen mit separaten Verbindungen +- RLS fail-closed auf 108 Tenant-Tabellen +- FORCE ROW LEVEL SECURITY aktiviert +- 0 legacy app.tenant_id Policies +- Plugin-Migrationen über crm_migration (DDL) +- Worker per-Tenant Outbox-Processing mit RLS-Kontext +- Event-Handler nur für aktive Plugins +- Passwort-Reset end-to-end mit SMTP getestet +- Leere DB-Installation ohne manuelle Eingriffe +- Restore + Upgrade verifiziert +- Coolify Redeploy/Stop/Start funktioniert ohne manuelles Eingreifen + +### Phase 2 (Datenintegrität) +- 74 FK-Constraints (tenant_id → tenants.id ON DELETE CASCADE) hinzugefügt +- 10 globale Tabellen ausgeschlossen +- Orphan-Cleanup durchgeführt +- FK-Tests auf Produktion: INSERT mit ungültiger tenant_id blockiert ✅ + +### Phase 3 (Plugin-Lifecycle) +- 14 Tests: Registry, Lifecycle, Idempotency, Dependencies, Core-Schutz +- Plugin-Lifecycle war bereits korrekt implementiert +- Tests bestätigen: activate → deactivate → reactivate funktioniert + +--- + +## Was als nächstes zu tun ist + +### Phase 5 (Outbox) — teilweise fertig +- Per-Tenant Outbox-Processing implementiert (Gate 5) +- Fehlt: Dead-Letter-Queue, Monitoring, Consumer-Registry +- Aufwand: 6–10h + +### Phase 7 (DMS/Attachments) — nicht begonnen +- Streaming Upload/Download +- Deduplikation tenantlokal +- Keine Cross-Tenant-Dateireferenzen +- Aufwand: 10–16h + +### Phase 4 (KI-Delegation) — nicht begonnen +- Delegation-Contract, Tenant-scoped Permissions +- Audit, Rollback, Approval +- Aufwand: 10–16h + +### Phase 6 (Workspaces) — nicht begonnen +- Größte Phase: 30–50h + +### Phase 8–10 — nicht begonnen +- Sicherheitsreste, CI, Backup/Monitoring +- Aufwand: 38–66h + +--- +## Wichtige Dateien + +| Datei | Inhalt | +|-------|--------| +| `docs/ABSCHLUSSBERICHT_PHASE0_PHASE1.md` | Vollständiger Abschlussbericht + Sanierungsplan | +| `docs/INSTALL.md` | Vollständige Installationsanleitung | +| `docs/phase0_phase1_acceptance_report.md` | Abnahmeprotokoll Phase 0+1 | +| `scripts/deploy.py` | Coolify API Deployment-Skript | +| `scripts/seed_admin.py` | Admin-User erstellen | +| `docker-compose.yml` | Referenz-Compose (API + Worker + DB + Redis) | +| `.env.docker.example` | ENV-Template | +| `prestart.sh` | Container-Entrypoint (Migrationen + Rollen) | +| `worker.sh` | Worker-Entrypoint | + +--- + +## Wichtige Regeln für den nächsten Agenten + +1. **Keine manuellen Docker-Befehle** — alles über Coolify API oder deploy.py +2. **Repo lesen bevor ändern** — docker-compose.yml und deploy.py beachten +3. **Migrationen sind Forward-Only** — keine alten Migrationen verändern +4. **RLS ist fail-closed** — kein Tenant-Kontext = kein Zugriff +5. **crm_api hat keine DDL-Rechte** — Plugin-Migrationen über get_migration_engine() +6. **Worker ist Coolify Service** — UUID asxqaq3566to108xordck0ff +7. **Alle DB-Passwörter sind identisch** — siehe .env.docker.example +8. **pgvector/pgvector:pg16** als DB-Image — nicht postgres:16-alpine +9. **Tests müssen mit echten unprivilegierten Rollen laufen** — nicht mit Superuser +10. **Jede Phase: analysieren → implementieren → migrieren → testen → dokumentieren**