{
"event": "PreToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "\/root\/.claude\/plans\/enchanted-mixing-parasol.md",
"old_string": "- rsync excludes: .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, demo.karlkratz.de\/\n- Benachrichtigung: i@karlkratz.de\n- \/var\/www\/videos (110GB) WIRD mitgesichert\n- \/var\/www\/demo.karlkratz.de (54GB) wird EXCLUDED",
"new_string": "- rsync excludes: .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, demo.karlkratz.de\/, logs\/, *.log\n- tar excludes: logs\/, *.log\n- Benachrichtigung: i@karlkratz.de\n- \/var\/www\/videos (110GB) WIRD mitgesichert\n- \/var\/www\/demo.karlkratz.de (54GB) wird EXCLUDED\n- Ollama Modelle: EXCLUDED (koennen jederzeit neu heruntergeladen werden)\n- Logs: EXCLUDED (ueberall)",
"replace_all": false
}
}
{
"tool_response": {
"filePath": "\/root\/.claude\/plans\/enchanted-mixing-parasol.md",
"oldString": "- rsync excludes: .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, demo.karlkratz.de\/\n- Benachrichtigung: i@karlkratz.de\n- \/var\/www\/videos (110GB) WIRD mitgesichert\n- \/var\/www\/demo.karlkratz.de (54GB) wird EXCLUDED",
"newString": "- rsync excludes: .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, demo.karlkratz.de\/, logs\/, *.log\n- tar excludes: logs\/, *.log\n- Benachrichtigung: i@karlkratz.de\n- \/var\/www\/videos (110GB) WIRD mitgesichert\n- \/var\/www\/demo.karlkratz.de (54GB) wird EXCLUDED\n- Ollama Modelle: EXCLUDED (koennen jederzeit neu heruntergeladen werden)\n- Logs: EXCLUDED (ueberall)",
"originalFile": "# Plan: Datensicherung prod.karlkratz.com → ki\/st (88.198.50.199)\n\n## Kontext\n\nprod.karlkratz.com hat **kein automatisiertes System-Backup**. Bei Ausfall waeren 45 Datenbanken, 81 Websites, E-Mail-Daten, Credentials, Qdrant-Collections und alle Konfigurationen verloren. Der ki\/st-Server (88.198.50.199) hat 1.1TB frei und ist ideal als Backup-Ziel. SSH-Keys existieren bereits in beide Richtungen.\n\n## Phase 1: Aufraeumen\n\n### Auf prod (148.251.182.181)\n- `\/var\/backup\/www` (3.4GB stale Copy) loeschen\n- `\/var\/backup\/nextcloud_contacts_backup_20251111.sql` (5.2MB) loeschen\n- `\/var\/backup\/` bleibt als Staging-Verzeichnis fuer das neue Script\n\n### Auf ki (88.198.50.199)\n- Bestehende lokale Backups (`\/backup\/2026-02-*`) nach `\/backup\/ki\/` verschieben\n- Lokales backup.sh anpassen: `BACKUP_DIR=\"\/backup\/ki\"` statt `\/backup`\n- `\/backup\/prod\/` Struktur anlegen\n\n## Phase 2: Backup-Script auf prod erstellen\n\n**Datei:** `\/var\/www\/scripts\/backup-prod-to-ki.sh` (chmod 700)\n\n### Gesicherte Komponenten\n\n| # | Komponente | Quelle | Methode | Frequenz |\n|---|-----------|--------|---------|----------|\n| 1 | MariaDB (45 DBs) | Unix Socket Auth | mysqldump --single-transaction + gzip, je DB einzeln | taeglich |\n| 2 | Redis (128k Keys) | BGSAVE → \/var\/lib\/redis\/dump.rdb | Kopie + gzip | taeglich |\n| 3 | Qdrant (82 Collections) | API localhost:6333 | Snapshot pro Collection via API | taeglich |\n| 4 | ArangoDB | \/var\/lib\/arangodb3 | arangodump --compress-output | taeglich |\n| 5 | ChromaDB | \/var\/www\/chromadb | tar + gzip | taeglich |\n| 6 | E-Mail | \/var\/vmail (3.5G) + \/var\/mail | tar + gzip | taeglich |\n| 7 | Credentials | .env-Dateien, JSON-Keys, Stripe, etc. | tar + gzip + GPG AES-256 | taeglich |\n| 8 | Configs | 16 \/etc\/-Verzeichnisse (apache2, php, mysql, redis, postfix, dovecot, opendkim, rspamd, fail2ban, nftables, monit, ipset, cron.d, letsencrypt, nats, qdrant) + custom systemd units | tar + gzip | taeglich |\n| 9 | \/var\/www\/ (414GB, 81 Sites) | rsync incremental | rsync --delete (nur Deltas) | taeglich |\n| ~~10~~ | ~~Ollama Modelle~~ | EXCLUDED | - | - |\n| 11 | Metadaten | Checksummen, dpkg-selections, df, Services | Textdateien | taeglich |\n\n### Script-Ablauf (9 Phasen)\n1. Lock + Staging vorbereiten\n2. DB-Dumps (MariaDB einzeln, Redis, Qdrant-Snapshots, ArangoDB, ChromaDB)\n3. Mail-Archive (vmail + mail)\n4. Config-Archive (16 Dienste)\n5. Credentials sammeln + GPG-verschluesseln\n6. Transfer Staging → ki (rsync via SSH)\n7. \/var\/www\/ inkrementell rsync → ki\n8. Metadaten + Checksummen, Retention (7 Tage), Cleanup\n\n### Fehlerbehandlung\n- Einzelfehler brechen Script NICHT ab (Fehler werden gesammelt)\n- Lock-File verhindert parallele Laeufe\n- E-Mail an i@karlkratz.de bei Fehlern sofort, Erfolg woechentlich Mo\n\n## Phase 3: Verzeichnisstruktur auf ki\n\n```\n\/backup\/\n├── prod\/ # NEU: Prod-Backups\n│ ├── daily\/YYYY-MM-DD\/ # 7-Tage-Rotation\n│ │ ├── databases\/mariadb\/ # 45 einzelne .sql.gz\n│ │ ├── databases\/redis\/ # dump.rdb.gz\n│ │ ├── databases\/qdrant\/ # Collection-Snapshots\n│ │ ├── databases\/arangodb\/ # arangodump\n│ │ ├── databases\/chromadb\/ # tar.gz\n│ │ ├── mail\/ # vmail.tar.gz + mail.tar.gz\n│ │ ├── configs\/ # 16x tar.gz\n│ │ ├── credentials\/ # credentials.tar.gz.gpg\n│ │ └── meta\/ # checksums, logs, system-info\n│ ├── incremental\/\n│ │ └── www\/ # rsync-Spiegel von \/var\/www\/ (414GB)\n└── ki\/ # Bestehende lokale ki-Backups (umgezogen)\n```\n\n## Phase 4: Automation + Monitoring\n\n### Auf prod\n- **Cron:** `\/etc\/cron.d\/backup-prod-to-ki` → taeglich 02:00\n- **Logrotate:** `\/etc\/logrotate.d\/backup-prod-to-ki`\n- **Monit:** `\/etc\/monit\/conf.d\/backup-prod-to-ki` (prueft Log-Aktualitaet)\n\n### Auf ki\n- **Verifikations-Script:** `\/var\/www\/scripts\/verify-prod-backup.sh` (prueft Vollstaendigkeit)\n- **Cron:** taeglich 08:00 Verifikation\n- **Lokales Backup-Script anpassen:** `\/var\/www\/scripts\/backup.sh` → BACKUP_DIR=\"\/backup\/ki\"\n\n## Phase 5: Prozess-Dokumentation\n\n**Datei:** `\/var\/www\/prozesse\/datensicherung-prod-ki\/prozess.md` auf prod\n\nInhalt (deutsch):\n- Uebersichtstabelle (Server, Zeiten, Pfade)\n- Vollstaendige Liste aller 45 DBs\n- Alle 16 Config-Verzeichnisse mit Beschreibung\n- Alle 4 Mail-Domains\n- Verzeichnisstruktur auf ki\n- Sicherheitskonzept (GPG, SSH, Zugriff)\n- Restore-Anleitungen (DB, Config, Mail, Redis, Qdrant, Credentials)\n- Speicherplatz-Planung (~650-700GB von 1.1TB)\n- Wartungshinweise (neue DB hinzufuegen, Log pruefen, etc.)\n\n## Phase 6: GPG-Setup fuer Credentials\n\n- `openssl rand -base64 32 > \/root\/.backup-gpg-passphrase` auf prod (chmod 600)\n- Kopie nach ki fuer Restore-Fall\n- Offline-Sicherung empfehlen\n\n## Reihenfolge der Umsetzung\n\n1. Aufraeumen prod + ki\n2. GPG-Passphrase erstellen\n3. Verzeichnisse auf ki anlegen\n4. Ki lokales Backup-Script anpassen (BACKUP_DIR)\n5. Backup-Script auf prod erstellen\n6. Prozess-Dokumentation auf prod erstellen\n7. Erster manueller Testlauf\n8. Ergebnis auf ki pruefen\n9. Cron + Logrotate + Monit auf prod deployen\n10. Verifikations-Script + Cron auf ki deployen\n\n## Verifizierung\n\n- Manueller Testlauf des Scripts\n- Pruefen ob alle 45 DB-Dumps auf ki angekommen sind\n- Pruefen ob Configs, Mail, Credentials vorhanden\n- Checksummen-Verifikation\n- rsync \/var\/www\/ laeuft (erster Lauf wird lange dauern ~414GB)\n\n## Wichtige technische Details\n\n- MariaDB: Unix Socket Auth als root, kein .my.cnf noetig → `mysqldump` direkt\n- Qdrant: Storage unter `\/var\/lib\/qdrant` (1.1GB), API auf localhost:6333\n- ChromaDB: Daten unter `\/var\/www\/chromadb`, Binary unter `\/opt\/chromadb`\n- ArangoDB: Daten unter `\/var\/lib\/arangodb3` (345MB)\n- Ollama: Modelle unter `\/usr\/share\/ollama\/.ollama\/models`\n- rsync excludes: .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, demo.karlkratz.de\/\n- Benachrichtigung: i@karlkratz.de\n- \/var\/www\/videos (110GB) WIRD mitgesichert\n- \/var\/www\/demo.karlkratz.de (54GB) wird EXCLUDED\n- Erster \/var\/www\/ rsync: ~414GB, danach nur Deltas (wenige GB)\n",
"structuredPatch": [
{
"oldStart": 132,
"oldLines": 8,
"newStart": 132,
"newLines": 11,
"lines": [
" - ChromaDB: Daten unter `\/var\/www\/chromadb`, Binary unter `\/opt\/chromadb`",
" - ArangoDB: Daten unter `\/var\/lib\/arangodb3` (345MB)",
" - Ollama: Modelle unter `\/usr\/share\/ollama\/.ollama\/models`",
"-- rsync excludes: .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, demo.karlkratz.de\/",
"+- rsync excludes: .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, demo.karlkratz.de\/, logs\/, *.log",
"+- tar excludes: logs\/, *.log",
" - Benachrichtigung: i@karlkratz.de",
" - \/var\/www\/videos (110GB) WIRD mitgesichert",
" - \/var\/www\/demo.karlkratz.de (54GB) wird EXCLUDED",
"+- Ollama Modelle: EXCLUDED (koennen jederzeit neu heruntergeladen werden)",
"+- Logs: EXCLUDED (ueberall)",
" - Erster \/var\/www\/ rsync: ~414GB, danach nur Deltas (wenige GB)"
]
}
],
"userModified": false,
"replaceAll": false
}
}