Files
crm-system/docs/audits/06d-backup-audit.md
T

44 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 06d Backup-/Recovery-Audit (Security & Data-Engineering)
**Projekt:** CRM System v1.0
**Datum:** 2026-06-04
**Auditor:** Security Data Engineer (Phase 6)
**Repository:** `Leopoldadmin/crm-system`, Branch `main`
**Scope:** DB-Backup-Strategie, Coolify-Backup-Konfiguration, Wiederherstellungs-Test, Disaster-Recovery-Plan, RTO/RPO
---
## Findings
| ID | Severity | Kategorie | Beschreibung | Empfehlung |
|----|----------|-----------|-------------|------------|
| BKP-01 | **WARN** | Backup-Strategie | NFR-6 fordert tägliches PostgreSQL-Dump-Backup via Coolify mit 7 Tagen Retention. In `COOLIFY_SETUP.md` und `docker-compose.yml` ist keine Backup-Konfiguration dokumentiert. Coolify bietet native Database-Backups (S3-kompatibler Storage), aber diese sind weder eingerichtet noch dokumentiert. | **Vor Production:** Coolify-Database-Backup-Schedule konfigurieren (täglicher Dump, 7d Retention, Storage-Backend definieren). Backup-Konfiguration als Code dokumentieren (z.B. Coolify-API-Script in `/scripts/backup-setup.sh`). |
| BKP-02 | **WARN** | Restore-Runbook | NFR-6 fordert ein Restore-Runbook unter `docs/runbook-backup-restore.md`. Diese Datei existiert nicht im Repository (`ls docs/runbook-backup-restore.md` → nicht vorhanden). | **Vor Production:** Runbook erstellen mit Schritt-für-Schritt-Anleitung: 1) Coolify-Backup auswählen, 2) PostgreSQL-Restore-Kommando, 3) App-Neustart, 4) Smoke-Test. |
| BKP-03 | **WARN** | Wiederherstellungs-Test | Kein dokumentierter Backup-Restore-Test durchgeführt. Ohne Test kann nicht garantiert werden, dass Backups im Ernstfall wiederherstellbar sind. | **Vor Production:** Restore-Drill durchführen: Backup aus Coolify herunterladen, in lokales PostgreSQL einspielen, App starten, Healthcheck + Login-Smoke-Test. Ergebnis dokumentieren. |
| BKP-04 | **INFO** | RTO 4h / RPO 24h | Requirements (NFR-6) definieren Recovery-Time-Objective ≤ 4h und Recovery-Point-Objective ≤ 24h. Diese Ziele sind mit täglichem Coolify-Backup + manuellem Restore erreichbar, aber nicht formal verifiziert. | RTO/RPO in Runbook verankern und im Restore-Drill messen. Coolify-Restore-Zeit für PostgreSQL 16 (Alpine) typischerweise < 30 min innerhalb 4h. |
| BKP-05 | **INFO** | Backup-Dokumentation | `COOLIFY_SETUP.md` erwähnt keine Backups. `README.md` und `docker-compose.yml` enthalten keine Backup-Referenzen. Einziger Anhaltspunkt: NFR-6 in `01-requirements.md`. | Backup-Dokumentation in Coolify-Setup integrieren oder als separates `docs/backup-strategy.md` führen. |
| BKP-06 | **PASS** | Datenbank-Volume | `docker-compose.yml` definiert benanntes Volume `pgdata` für PostgreSQL-Daten (`pgdata:/var/lib/postgresql/data`). Volumes sind persistent und können unabhängig vom Container gesichert werden. | Docker-Volume-Backup (z.B. `docker run --rm -v crm_pgdata:/data -v $(pwd):/backup alpine tar czf /backup/pgdata-backup.tar.gz -C /data .`) als Fallback für Coolify-Backup dokumentieren. |
| BKP-07 | **PASS** | Pre-Start-Migration | `prestart.sh` führt `alembic upgrade head` aus idempotente Migration vor jedem App-Start. Dies stellt sicher, dass ein Restore aus einem älteren Backup funktioniert, solange das DB-Schema kompatibel ist. | Alembic-Migrationen sind Forward-kompatibel. Backup-Restore + `alembic upgrade head` ist ein gültiger Recovery-Pfad. |
| BKP-08 | **INFO** | Diskrepanz PostgreSQL vs. SQLite | Entwicklung nutzt SQLite (`dev.db`), Produktion PostgreSQL. Backups sind nur für PostgreSQL relevant, aber SQLite-DB könnte Entwicklerdaten enthalten, die gesichert werden müssen (z.B. vor Branch-Wechsel oder DB-Reset). | Entwickler-Backup-Strategie dokumentieren: `sqlite3 dev.db ".backup dev-backup-$(date +%Y%m%d).db"` oder Migration zu PostgreSQL auch in Dev. |
---
## Summary: **WARN** ⚠️
Die Backup-Strategie ist **nicht produktionsreif**. Während die technischen Voraussetzungen (PostgreSQL-Volume, Alembic-Migrationen, Coolify-Database-Backup-Feature) gegeben sind, fehlen die konkrete Konfiguration, das Restore-Runbook und ein verifizierter Wiederherstellungs-Test.
**Kritisch vor Production-Go-Live:**
1. Coolify-Backup-Schedule konfigurieren (BKP-01)
2. Restore-Runbook erstellen (BKP-02)
3. Restore-Drill durchführen (BKP-03)
---
## Empfehlungen für Phase 7 (Quality-Reviewer)
1. **Backup-Konfiguration prüfen** Ist der Coolify-Backup-Schedule aktiv und getestet? Existiert ein Storage-Backend (S3, SFTP, oder lokaler Pfad)?
2. **Runbook-Review** Runbook auf Vollständigkeit prüfen: Deckt es alle Fehlerszenarien ab (Datenbank-Korruption, versehentliches Löschen, Coolify-Ausfall)?
3. **RTO/RPO-Messung** Im Restore-Drill die tatsächliche Recovery-Zeit messen und mit den 4h-RTO abgleichen. Wenn nicht erreichbar: Automatisierte Restore-Prozedur implementieren.
4. **Backup-Monitoring** Healthcheck-Endpoint (`/health`) sollte DB-Connectivity prüfen, aber nicht Backup-Status. Optional: Coolify-Health-Webhook, der Backup-Erfolg meldet.
5. **Release-Readiness-Entscheidung** Ohne konfiguriertes Backup und Restore-Runbook ist das Deployment gemäß Requirements (NFR-6) nicht freigabefähig. Phase 7 muss dies als Blocker behandeln.