20 KiB
LeoCRM — Enterprise-Readiness Plan
Ziel: KI und Business-Plattform für kleine bis mittlere Firmen (max. 500 Mitarbeiter) Erstellt: 2026-08-20
1. RLS (Row Level Security)
20 Tabellen ohne RLS in Produktion — Klassifizierung
Absichtlich kein RLS (10 Tabellen — Auth/System-Tabellen): Diese Tabellen brauchen kein RLS weil sie vor der Tenant-Auflösung gebraucht werden oder global sind:
| Tabelle | Grund |
|---|---|
alembic_version |
Migration-Tracking, global |
notification_types |
Globale Type-Definitionen |
password_reset_tokens |
Auth vor Tenant-Context |
plugin_allowlist |
Globale Plugin-Konfiguration |
plugin_migrations |
Globale Plugin-Migration-Tracking |
plugins |
Globale Plugin-Registry |
sessions |
Auth vor Tenant-Context |
tenants |
Die Tenant-Tabelle selbst |
user_tenants |
Mapping Users ↔ Tenants |
users |
Auth vor Tenant-Context |
Brauchen RLS (10 Tabellen):
| Tabelle | Warum RLS nötig | Migration |
|---|---|---|
ai_decision_records |
Tenant-spezifische AI-Entscheidungen | 0129 |
approval_requests |
Tenant-spezifische Approvals | 0129 |
automation_agent_run_steps |
Tenant-spezifische Agent-Run-Steps | 0129 |
outbox_deliveries |
Tenant-spezifische Event-Zustellungen | 0129 |
roles |
Tenant-spezifische Rollen | 0129 |
sequences |
Tenant-spezifische Sequenzen | 0129 |
wiki_articles |
Tenant-spezifische Wiki-Artikel | 0129 |
wiki_article_versions |
Tenant-spezifische Wiki-Versionen | 0129 |
wiki_categories |
Tenant-spezifische Wiki-Kategorien | 0129 |
marketplace_listings |
Prüfen: Global oder per-Tenant? | 0129 |
Ablaufplan RLS:
- Migration 0129 erstellen:
ALTER TABLE ... ENABLE ROW LEVEL SECURITY+CREATE POLICY tenant_isolation ON ... - In Test-DB ausführen und verifizieren
- In Produktion deployen
- RLS-Tests schreiben: Cross-Tenant-Zugriff muss blockiert werden
- Verifizieren:
SELECT count(*) FILTER (WHERE rowsecurity=true) FROM pg_tables WHERE schemaname='public'→ muss 123 sein (133 - 10 system)
2. Security Audit & Penetration Test
Security Audit (Code-Level)
- SQL Injection — Alle Routes auf Raw-SQL prüfen (
grep -rn 'text(\|execute(\|raw' app/routes/) - XSS — Frontend auf
dangerouslySetInnerHTMLprüfen - CSRF — CSRF Middleware prüfen (vorhanden in
app/core/middleware.py) - Auth Bypass — Routes ohne
require_permissionoderget_current_useridentifizieren - Secret Exposure —
.env, API-Keys, Tokens im Code prüfen - Dependency Audit —
pip-audit(Python) +npm audit(Frontend) - Rate Limiting — Prüfen ob Rate-Limiting auf kritischen Routes aktiv ist
Penetration Test (Extern)
- OWASP Top 10 Checkliste abarbeiten
- Burp Suite / OWASP ZAP Scan gegen https://crm.media-on.de
- Auth Tests — Session-Hijacking, Cookie-Flags, Login-Brute-Force
- API Tests — Unautorisierte Zugriffe, IDOR (Insecure Direct Object Reference)
- Multi-Tenant Tests — Cross-Tenant Datenzugriff versuchen
Ablaufplan Security:
- Code-Level Security Audit (automatisiert, 1 Tag)
- Dependency Audit (pip-audit + npm audit, 0.5 Tage)
- Externer Pen-Test (manuell, 2 Tage)
- Findings dokumentieren und beheben
- Re-Test nach Fixes
3. Testing — 100% Abdeckung planen
Test-Strategie
Schicht 1: Unit-Tests (vorhanden, erweitern)
- Pure Funktionen, Utilities, Helper
- Keine DB, keine externen Services
- Ziel: 200+ Tests
Schicht 2: Integration-Tests (ausbauen)
- Echte DB (leocrm_test mit Alembic-Migrationen, nicht create_all)
- Echte Redis-Verbindung
- API-Tests über httpx AsyncClient
- LLM gemockt (llm_complete/llm_embed)
- Ziel: 300+ Tests
Schicht 3: Cross-Module Tests (neu)
- Plugin A → Contract → Plugin B
- Agent → Tool → DB → Audit
- Workflow → Step → External Service (gemockt)
- Event Bus → Outbox → Consumer
- Ziel: 50+ Tests
Schicht 4: E2E Tests (Playwright, erweitern)
- Login → Contact erstellen → Search → Edit → Delete
- Mail: Account → Folder → Message → Attachment
- Agent: Create → Run → Result → Approval
- Workflow: Create → Run → Step → Complete
- Ziel: 30+ Tests
Schicht 5: Performance Tests (neu)
- locust/k6: Login, Contact-List, Search unter Last
- 10, 50, 100 gleichzeitige User
- Response-Time < 500ms, Error-Rate < 1%
- Ziel: 10+ Test-Szenarien
Test-DB Fix (wichtig!)
- conftest.py umstellen: Alembic-Migrationen statt
Base.metadata.create_all() - RLS-Policies in Test-DB aktivieren
- Test-Isolation: Jeder Test bekommt clean Schema (TRUNCATE zwischen Tests)
- Test-Daten-Fixtures: Realistische Test-Daten (Contacts, Companies, Mail, etc.)
Ablaufplan Testing:
- Test-DB auf Alembic umstellen (1 Tag)
- Bestehende Mock-Tests zu Integration-Tests migrieren (3 Tage)
- Neue Cross-Module Tests schreiben (2 Tage)
- E2E Tests erweitern (2 Tage)
- Performance Tests einrichten (1 Tag)
- CI-Pipeline: Alle Tests müssen grün sein vor Deploy (0.5 Tage)
4. Monitoring — System Dashboard für Admins
Backend
-
Neue Route:
app/routes/system_dashboard.pyGET /api/v1/system-dashboard— Admin-only (require_permission("system:read"))- Sammelt: Health, DB-Stats, Redis-Stats, Worker-Queue, Active Users, Error-Rate, Response-Times
- Bei Problemen:
post_system_message()an internes Nachrichten-System
-
Monitoring Daten sammeln:
- DB: Connection-Pool-Stats, Query-Count, Slow-Queries
- Redis: Memory, Connections, PubSub Channels
- Worker: Queue-Length, Failed-Jobs, Running-Jobs
- App: Active Sessions, Request-Count, Error-Rate
- Plugins: Active-Status, Health pro Plugin
- LLM: Cost pro Tag/Agent/Workflow
-
Alerting:
- Wenn Health-Check failed → System-Message an Communication-System
- Wenn Error-Rate > 5% → System-Message
- Wenn Worker-Queue > 100 → System-Message
- Wenn DB-Disk > 80% → System-Message
- Wenn Redis-Memory > 80% → System-Message
Frontend
-
Neue Page:
frontend/src/pages/SystemDashboard.tsx- Nur für Admins sichtbar (
PermissionRoute permission="system:read") - Link im linken Menü (Sidebar) — nur für Admins
- Real-Time Updates (WebSocket oder 30s Polling)
- Cards: System Health, DB, Redis, Worker, Active Users, Errors, LLM Costs
- Charts: Response-Time-Trend, Error-Rate-Trend, Queue-Length
- Alert-Feed: System-Messages aus Communication-System
- Nur für Admins sichtbar (
-
Sidebar Eintrag:
{ to: '/system-dashboard', labelKey: 'nav.systemDashboard', icon: <Activity />, order: 95 }- Nur sichtbar wenn
is_system_admin === true
Ablaufplan Monitoring:
- Backend:
system_dashboard.pyRoute mit echten DB/Redis/Worker-Stats (1 Tag) - Backend: Alerting → System-Message bei Problemen (0.5 Tage)
- Frontend:
SystemDashboard.tsxmit Cards und Charts (2 Tage) - Frontend: Sidebar-Eintrag + Permission-Check (0.5 Tage)
- Tests: Integration-Test für Dashboard-Route (0.5 Tage)
5. Backup — Automatisiert über ARQ Scheduler
Vorhandene Infrastruktur
scripts/backup.py— Backup-Script (pg_dump + files)scripts/restore.py— Restore-Script- ARQ Worker mit cron-Scheduler (vorhanden)
scheduler_tickJob registriert
Plan
-
Backup ARQ Job registrieren:
register_job("auto_backup", auto_backup_job)- Cron-Schedule: Täglich um 03:00 Uhr (einstellbar)
- Ruft
scripts/backup.pyauf - Speichert Backup in
/backups/(oder S3/Nextcloud)
-
Settings-Erweiterung:
backup_enabled: bool = Truebackup_schedule: str = "0 3 * * *"(cron)backup_destination: str = "local"(local/s3/nextcloud)backup_retention_days: int = 7- In Settings-Page im Frontend einstellbar
-
Backup-Verifizierung:
- Nach jedem Backup: Manifest prüfen (Datei-Anzahl, Größe)
- Wöchentlich: Test-Restore in Test-DB + Row-Count-Validierung
- Bei Fehler: System-Message an Communication-System
-
Restore-Test:
scripts/restore_test.shexistiert bereits- Als ARQ-Cron-Job: Wöchentlich Restore in Test-DB, Schema validieren
Ablaufplan Backup:
auto_backup_jobinapp/core/jobs.pyregistrieren (0.5 Tage)- Settings-Schema erweitern + Frontend-UI (1 Tag)
- Backup-Verifizierung + Alerting (0.5 Tage)
- Restore-Test als Cron-Job (0.5 Tage)
- Tests: Backup erstellen → Restore → Validieren (1 Tag)
6. Multi-Tenant — RLS Lücken prüfen
Aktuell
- 113/133 Tabellen haben RLS in Produktion
- 10 Tabellen absichtlich ohne RLS (Auth/System)
- 10 Tabellen brauchen RLS (siehe Punkt 1)
Weitere Prüfung
- ORM Auto-Filter — Prüfen ob SQLAlchemy automatisch
tenant_idfiltert - Routes ohne Tenant-Check — Gibt es Routes die
tenant_idnicht prüfen? - Cross-Tenant Queries — Gibt es Queries die
tenant_idnicht filtern? - Plugin-Tables — Haben alle Plugin-Tables
tenant_id? - Admin-Bypass — Können Admins andere Tenants sehen? (Sollten sie nicht)
Ablaufplan Multi-Tenant:
- RLS für 10 fehlende Tabellen hinzufügen (Punkt 1) (0.5 Tage)
- ORM Auto-Filter verifizieren (0.5 Tage)
- Routes ohne Tenant-Check identifizieren und fixen (1 Tag)
- Cross-Tenant Integration-Tests schreiben (1 Tag)
7. Compliance — Geplant in Phase K
Phase K (EU Compliance) ist in der Roadmap geplant mit 6 Tasks:
- AI Use-Case Registry
- Processing Activities Register
- DSR Automation (Access/Erasure/Correction)
- DPIA (Data Protection Impact Assessment)
- AI Act Compliance
- Compliance Reports
Das ist geplant und muss implementiert werden wenn Phase I+J abgeschlossen sind.
8. Performance Tests
Plan
- locust/k6 Setup — Load-Testing-Tool installieren
- Test-Szenarien:
- Login (100 gleichzeitige User)
- Contact-List (50 User, paginated)
- Search (50 User, verschiedene Queries)
- Mail-List (30 User, IMAP-Sync)
- Agent-Run (10 User, gleichzeitige Agent-Runs)
- Metriken:
- Response-Time (P50, P95, P99)
- Error-Rate
- Throughput (Requests/sec)
- DB-Query-Count pro Request
- Redis-Hit-Rate
- Baseline messen — Aktuelle Performance aufzeichnen
- Optimierung — Bottlenecks identifizieren und beheben
Ablaufplan Performance:
- locust/k6 installieren + Test-Szenarien schreiben (1 Tag)
- Baseline messen (0.5 Tage)
- Bottlenecks identifizieren (0.5 Tage)
- Optimierung (N+1 Queries, Caching, Indexes) (2 Tage)
- Re-Test nach Optimierung (0.5 Tage)
9. Documentation — Anpassen an aktuellen und geplanten Stand
Was aktualisiert werden muss
- README.md — Aktualisiert ✅ (KI und Business-Plattform)
- docs/api-documentation.md — Alle 468 Routes dokumentieren (aktualisieren)
- docs/plugin-development-guide.md — 23 Plugins dokumentieren (aktualisieren)
- docs/infrastructure.md — Docker, PostgreSQL, Redis, ARQ (aktualisieren)
- docs/monitoring.md — System Dashboard, Alerting (neu schreiben)
- docs/security_kernel.md — RLS, ABAC, Audit, Pen-Test (aktualisieren)
- docs/admin-guide.md — Backup, Restore, Monitoring, Settings (aktualisieren)
- docs/deploy-guide.md — Deploy-Process, Coolify (aktualisieren)
- docs/test-strategy.md — Test-Schichten, Test-DB, CI (aktualisieren)
- docs/ui-design-guidelines.md — System Dashboard, neue Komponenten (aktualisieren)
- AGENTS.md — Build/Test-Commands, Konventionen (aktualisieren)
- PROGRESS.md — Aktueller Stand (aktualisiert ✅)
- PLATFORM_ROADMAP.md — Phasen-Status (aktualisiert ✅)
Ablaufplan Documentation:
- Alle Doku-Dateien durchgehen und veraltete Inhalte aktualisieren (2 Tage)
- Neue Doku für System Dashboard, Backup-Automation, Performance (1 Tag)
- API-Doku für neue Routes ergänzen (1 Tag)
10. HA/Scaling — Architektur-Prüfung
Aktuelle Architektur
- Single-Instance: 1x crm_app, 1x crm_worker, 1x postgres, 1x redis
- Docker-Compose auf einem Hetzner VPS
Kann die Architektur skalieren?
Ja, bedingt. Die Architektur unterstützt Horizontal-Scaling:
-
crm_app — Kann horizontal skalieren (stateless, Session in Redis)
- Mehrere Instanzen hinter Load Balancer (Coolify unterstützt das)
- WebSocket: Redis PubSub für Multi-Instance (bereits implementiert)
- Cron-Locks: Bereits implementiert (
_acquire_cron_lock)
-
crm_worker — Kann horizontal skalieren
- ARQ Worker sind stateless
- Redis als Queue (bereits implementiert)
- Cron-Locks verhindern doppelte Ausführung (bereits implementiert)
-
postgres — Vertikales Scaling (größerer Server)
- Für HA: Managed PostgreSQL (z.B. Hetzner Cloud DB, RDS)
- Read-Replicas für Search-Queries möglich
-
redis — Vertikales Scaling
- Für HA: Redis Sentinel oder Managed Redis
Was für HA noch fehlt
- Load Balancer (Coolify/Traefik kann das)
- Health-Checks für Auto-Restart (vorhanden)
- Graceful Shutdown (vorhanden)
- Session-Sharing über Redis (vorhanden)
Fazit: Die Architektur unterstützt HA/Scaling. Bei Bedarf können einfach mehr crm_app und crm_worker Instanzen hinzugefügt werden. PostgreSQL und Redis brauchen dann Managed Services.
Ablaufplan HA (bei Bedarf):
- 2-3 crm_app Instanzen hinter Traefik Load Balancer (Coolify)
- 2 crm_worker Instanzen
- Managed PostgreSQL (Hetzner Cloud DB oder extern)
- Managed Redis (oder Redis Sentinel)
- Keine Code-Änderungen nötig — nur Docker-Compose Anpassung
11. API Versioning
Aktuell
- Alle Routes unter
/api/v1/ - Kein automatisches Versioning
Plan
- Bei Breaking Changes: Neue Routes unter
/api/v2/ - Alte Routes bleiben verfügbar (Deprecation)
- Versionierung über URL-Präfix (nicht Header)
- Das ist ausreichend für KMU bis 500 Mitarbeiter
Fazit: v1 ist ausreichend. Bei v2 einfach neuen Prefix hinzufügen. Keine zusätzliche Infrastruktur nötig.
12. Rate Limiting — Erklärung
Was ist Rate Limiting? Rate Limiting begrenzt wie viele API-Anfragen ein User in einer bestimmten Zeit machen kann.
Beispiel: Ein User kann maximal 100 API-Anfragen pro Minute machen. Wenn er mehr macht, bekommt er einen 429 (Too Many Requests) Fehler.
Warum wichtig?
- Schutz vor Missbrauch (Brute-Force, DDoS)
- Faire Ressourcen-Verteilung (ein User kann nicht alle Ressourcen verbrauchen)
- Schutz vor Endlos-Schleifen (z.B. Agent der zu viele LLM-Calls macht)
Aktuell:
- Globales Rate-Limiting vorhanden (
GeneralRateLimitMiddlewareinapp/core/rate_limit.py) - LLM Cost-Protection vorhanden (Budget-Limits pro Tenant)
Was fehlt:
- Per-User Rate-Limiting (nicht nur global)
- Per-Tenant Rate-Limiting
- Spezifische Limits für kritische Endpoints (Login, Password-Reset, Agent-Run)
Ablaufplan Rate Limiting:
- Per-User und Per-Tenant Limits in
rate_limit.pyimplementieren (1 Tag) - Spezifische Limits für Login, Password-Reset, Agent-Run (0.5 Tage)
- Tests: Rate-Limit wird durchgesetzt (0.5 Tage)
13. Audit Log — Erklärung
Was ist Audit Log? Audit Log protokolliert jede Änderung am System: Wer hat was wann geändert.
Beispiel: "User admin@media-on.de hat Kontakt 'Max Mustermann' um 14:30 Uhr aktualisiert — Feld 'email' geändert von 'alt@example.com' zu 'neu@example.com'"
Warum wichtig?
- Nachvollziehbarkeit bei Fehlern
- Compliance (DSGVO fordert Protokollierung)
- Security (wer hat auf welche Daten zugegriffen?)
Aktuell:
app/models/audit.py— AuditLog Model vorhandenapp/routes/audit.py— Audit-Log API vorhandendo_action()feuert bei jeder Änderung- 81 do_action-Aufrufe im Code
Was fehlt:
- Retention Policy — Wie lange werden Audit-Logs aufbewahrt? (z.B. 90 Tage, 1 Jahr, 7 Jahre je nach Gesetz)
- Audit-Log-Export — Export für Compliance-Prüfung
- Tamper-Proof — Audit-Logs sollten nicht löschbar sein (außer durch Admin mit GDPR-Flag)
Ablaufplan Audit Log:
- Retention Policy in Settings konfigurierbar (0.5 Tage)
- ARQ-Cron-Job: Audit-Logs älter als Retention-Period archivieren (0.5 Tage)
- Audit-Log-Export als CSV/JSON (0.5 Tage)
- Tamper-Proof: DELETE auf AuditLog nur mit
?gdpr=trueund Admin-Permission (0.5 Tage)
14. Data Retention — Erklärung
Was ist Data Retention? Data Retention definiert wie lange Daten aufbewahrt werden und wann sie gelöscht werden.
Beispiel: "E-Mails werden 7 Jahre aufbewahrt (gesetzliche Pflicht), danach automatisch gelöscht. Gelöschte Kontakte werden 90 Tage im Trash behalten, danach endgültig gelöscht."
Warum wichtig?
- Gesetzliche Aufbewahrungspflichten (Handelsrecht, Steuerrecht, DSGVO)
- Speicherplatz-Management
- DSGVO: „Recht auf Vergessenwerden" — Daten müssen löschbar sein
Aktuell:
- Soft-Delete mit
deleted_atvorhanden (alle Entitäten) - Hard-Delete nur mit
?gdpr=true(vorhanden) - Entity History mit Restore vorhanden (Phase D)
- Keine automatische Retention/Löschung nach Zeit
Was fehlt:
- Konfigurierbare Retention-Policies pro Datentyp (z.B. Mail=7 Jahre, Contacts=90 Tage Trash)
- ARQ-Cron-Job der abgelaufene Daten archiviert/löscht
- DSGVO-Lösch-Workflow (Betroffenenrechts-Anfragen)
Ablaufplan Data Retention:
- Retention-Settings in
config.py+ Settings-Page (0.5 Tage) - ARQ-Cron-Job:
cleanup_expired_data(1 Tag) - DSGVO-Lösch-Workflow (in Phase K geplant)
- Tests: Daten werden nach Retention-Period gelöscht (0.5 Tage)
15. Incident Response — Erklärung
Was ist Incident Response? Incident Response ist der Plan was passiert wenn etwas schiefgeht (Server-Ausfall, Datenverlust, Security-Breach).
Beispiel: „Server ist down → 1. Admin bekommt Alert über System-Dashboard → 2. Backup wird restored → 3. User werden informiert → 4. Post-Mortem wird geschrieben"
Warum wichtig?
- Schnelle Reaktion bei Problemen
- Minimierung von Ausfallzeiten
- Dokumentation für Verbesserung
Aktuell:
- Health-Check vorhanden (
/api/v1/health) - Graceful Shutdown vorhanden
- Error-Logging vorhanden (structlog + trace_id)
- Kein automatisches Alerting
- Kein Runbook
Was fehlt:
- Runbook — Dokument mit Schritten bei verschiedenen Incident-Typen
- Alerting — Automatische Benachrichtigung bei Problemen (über System Dashboard → Communication-System)
- Post-Mortem Template — Vorlage für Incident-Dokumentation
Ablaufplan Incident Response:
- Runbook schreiben (Server-Ausfall, DB-Crash, Redis-Crash, Security-Breach) (1 Tag)
- Alerting im System Dashboard implementiert (siehe Punkt 4) (bereits geplant)
- Post-Mortem Template in
docs/incident-response.md(0.5 Tage) - Recovery-Test: Backup restore + App-Neustart (0.5 Tage)
Zusammenfassung — Alle Ablaufpläne
| # | Bereich | Aufwand | Priorität | Abhängigkeit |
|---|---|---|---|---|
| 1 | RLS für 10 Tabellen | 0.5 Tage | 🔴 Hoch | Keine |
| 2 | Security Audit + Pen-Test | 3.5 Tage | 🔴 Hoch | Nach RLS |
| 3 | Testing 100% | 9.5 Tage | 🔴 Hoch | Nach Test-DB Fix |
| 4 | Monitoring System Dashboard | 4.5 Tage | 🟡 Mittel | Keine |
| 5 | Backup Automation | 3.5 Tage | 🟡 Mittel | ARQ Scheduler |
| 6 | Multi-Tenant Prüfung | 3 Tage | 🔴 Hoch | Nach RLS |
| 7 | Compliance (Phase K) | Geplant | 🟡 Mittel | Nach Phase I+J |
| 8 | Performance Tests | 4.5 Tage | 🟡 Mittel | Nach Testing |
| 9 | Documentation | 4 Tage | 🟡 Mittel | Nach allen Änderungen |
| 10 | HA/Scaling | Bei Bedarf | 🟢 Low | Architektur unterstützt es |
| 11 | API Versioning | v1 ausreichend | 🟢 Low | Keine |
| 12 | Rate Limiting | 2 Tage | 🟡 Mittel | Keine |
| 13 | Audit Log | 2 Tage | 🟡 Mittel | Keine |
| 14 | Data Retention | 2.5 Tage | 🟡 Mittel | ARQ Scheduler |
| 15 | Incident Response | 2.5 Tage | 🟡 Mittel | Nach Monitoring |
Gesamtaufwand: ~45 Tage (ohne Compliance, HA, API Versioning)
Reihenfolge (empfohlen):
- RLS (Punkt 1) — 0.5 Tage
- Test-DB Fix (Teil von Punkt 3) — 1 Tag
- Multi-Tenant Prüfung (Punkt 6) — 3 Tage
- Security Audit (Punkt 2) — 3.5 Tage
- Monitoring (Punkt 4) — 4.5 Tage
- Testing (Punkt 3) — 9.5 Tage
- Backup (Punkt 5) — 3.5 Tage
- Rate Limiting (Punkt 12) — 2 Tage
- Audit Log (Punkt 13) — 2 Tage
- Data Retention (Punkt 14) — 2.5 Tage
- Performance (Punkt 8) — 4.5 Tage
- Incident Response (Punkt 15) — 2.5 Tage
- Documentation (Punkt 9) — 4 Tage
- Compliance (Phase K) — Geplant
- HA/Scaling (Punkt 10) — Bei Bedarf
Ende des Enterprise-Readiness Plans