diff --git a/docs/incident-response-runbook.md b/docs/incident-response-runbook.md new file mode 100644 index 0000000..d45345e --- /dev/null +++ b/docs/incident-response-runbook.md @@ -0,0 +1,127 @@ +# Incident Response Runbook — LeoCRM + +## Schnellreferenz + +| Szenario | Erste Maßnahme | Escalation | +|----------|---------------|------------| +| Server offline | Coolify Dashboard prüfen | SSH: root@46.225.91.159 | +| DB offline | `docker exec postgres-* psql -U crm_user -d crm_db -c "SELECT 1"` | Backup restore prüfen | +| Redis offline | `docker exec redis-* redis-cli ping` | Worker neustarten | +| App 500 Errors | `docker logs crm_app-* --tail 100` | Logs in Coolify prüfen | +| Worker hängt | `docker logs crm_worker-* --tail 100` | ARQ Queue in Redis prüfen | +| Disk full | `df -h` + `docker system prune` | Alte Backups löschen | +| Deploy failed | Coolify Deploy Logs | Git Status prüfen | + +## 1. Server offline + +### Symptome +- https://crm.media-on.de nicht erreichbar +- Coolify (https://server.media-on.de) nicht erreichbar + +### Maßnahmen +1. SSH versuchen: `ssh root@46.225.91.159` +2. Wenn SSH geht: `docker ps` — welche Container laufen? +3. Coolify neustarten: `docker restart coolify` +4. Traefik prüfen: `docker logs coolify-proxy --tail 50` +5. Wenn Hetzner VPS offline: Hetzner Console (https://console.hetzner.cloud) → Server neustarten + +## 2. Datenbank offline + +### Symptome +- Health Check: `database: down` +- App: 500 Errors auf allen API-Routen +- Frontend: "Verbindung fehlgeschlagen" + +### Maßnahmen +1. Container prüfen: `docker ps | grep postgres` +2. Logs: `docker logs postgres-xf7smknlger3hvkrsb910tui-* --tail 100` +3. Verbindung testen: `docker exec postgres-* psql -U crm_user -d crm_db -c "SELECT 1"` +4. Wenn DB nicht startet: Disk voll? `df -h` +5. Wenn DB korrupt: Backup restore mit `python scripts/restore.py` +6. Benachrichtigung: System Dashboard → Alerts → Notification an Admin + +## 3. Redis offline + +### Symptome +- Sessions funktionieren nicht (Login loop) +- Worker-Jobs werden nicht ausgeführt +- WebSocket-Chat funktioniert nicht + +### Maßnahmen +1. Container prüfen: `docker ps | grep redis` +2. Logs: `docker logs redis-xf7smknlger3hvkrsb910tui-* --tail 50` +3. Neustart: `docker restart redis-xf7smknlger3hvkrsb910tui-*` +4. Wenn Redis korrupt: `docker exec redis-* redis-cli FLUSHALL` (Achtung: löscht Sessions!) +5. Worker neustarten: `docker restart crm_worker-xf7smknlger3hvkrsb910tui-*` + +## 4. App 500 Errors + +### Symptome +- API-Routen returnieren 500 +- Frontend zeigt Fehlermeldungen + +### Maßnahmen +1. Logs: `docker logs crm_app-xf7smknlger3hvkrsb910tui-* --tail 100` +2. Health Check: `curl https://crm.media-on.de/api/v1/health` +3. Wenn Migration fehlt: `docker exec crm_app-* python -m alembic upgrade head` +4. Wenn Plugin fehlerhaft: Plugin in Settings deaktivieren +5. Wenn Code-Bug: Fix committen + pushen + `bash scripts/fast-deploy.sh full` + +## 5. Worker hängt + +### Symptome +- Background-Jobs werden nicht ausgeführt (Mail-Sync, Backups, Search-Index) +- ARQ Queue wächst + +### Maßnahmen +1. Logs: `docker logs crm_worker-xf7smknlger3hvkrsb910tui-* --tail 100` +2. Redis Queue prüfen: `docker exec redis-* redis-cli LLEN arq:queue` +3. Worker neustarten: `docker restart crm_worker-xf7smknlger3hvkrsb910tui-*` +4. Wenn Queue voll: `docker exec redis-* redis-cli DEL arq:queue` (Achtung: löscht ausstehende Jobs!) + +## 6. Disk full + +### Symptome +- DB kann nicht schreiben +- Uploads schlagen fehl +- Backups schlagen fehl + +### Maßnahmen +1. Disk prüfen: `df -h` +2. Docker cleanup: `docker system prune -a --volumes` (Achtung: nur ungenutzte Container/Images) +3. Alte Backups löschen: `ls /backups/ | head -20` + `rm -rf /backups/leocrm_backup_oldest` +4. Logs löschen: `docker logs crm_app-* --tail 0 2>&1 | wc -l` + `truncate -s 0 $(docker inspect --format='{{.LogPath}}' crm_app-*)` +5. Temp-Dateien: `rm -rf /tmp/leocrm_*` + +## 7. Deploy failed + +### Symptome +- Coolify zeigt Deploy Status: `failed` +- App läuft noch mit altem Code + +### Maßnahmen +1. Coolify Deploy Logs prüfen (https://server.media-on.de) +2. Git Status: `git status && git log --oneline -5` +3. Lokal bauen: `cd frontend && npm run build` — tsc errors? +4. Backend import testen: `/opt/venv/bin/python -c "import app.main"` +5. Fix committen + pushen + neu deployen + +## Post-Mortem Template + +```markdown +## Incident: [Titel] +- **Datum**: YYYY-MM-DD HH:MM +- **Dauer**: X Minuten/Stunden +- **Auswirkung**: [Welche User/Funktionen betroffen] +- **Ursache**: [Root Cause] +- **Lösung**: [Was wurde getan] +- **Lessons Learned**: [Was können wir besser machen] +- **Action Items**: [Konkrete Aufgaben um Wiederholung zu verhindern] +``` + +## Kontakt + +- Server: root@46.225.91.159 (SSH Key: ~/.ssh/id_ed25519) +- Coolify: https://server.media-on.de +- Forgejo: https://forgejo.media-on.de/Leopoldadmin/leocrm +- App: https://crm.media-on.de