{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/tmp\/prozess.md",
"content": "# Datensicherung: prod.karlkratz.com → ki\/st Server\n\n## Uebersicht\n\n| Eigenschaft | Wert |\n|---------------------|-------------------------------------------|\n| Quell-Server | prod.karlkratz.com (148.251.182.181) |\n| Ziel-Server | ki\/st (88.198.50.199) |\n| Backup-Script | \/var\/www\/scripts\/backup-prod-to-ki.sh |\n| Cron-Job | \/etc\/cron.d\/backup-prod-to-ki |\n| Ausfuehrungszeit | Taeglich 02:00 Uhr |\n| Aufbewahrung | 7 Tage (taeglich), fortlaufend (inkr.) |\n| Log-Datei | \/var\/log\/backup-prod-to-ki.log |\n| Lock-Datei | \/var\/run\/backup-prod-to-ki.lock |\n| Benachrichtigung | i@karlkratz.de (Fehler sofort, OK montags)|\n\n## Gesicherte Komponenten\n\n### Taeglich: Datenbanken (komprimiert, einzeln)\n\n| Datenbank | Methode |\n|-----------|---------|\n| admin, admin_auth, agent, anachroma_pipeline, apache_log_db | mysqldump + gzip |\n| backup_restore, bic, claudia_grajek_de, code_documentation, code_intelligence | mysqldump + gzip |\n| codequality, content_pipeline, doc2vector, freund | mysqldump + gzip |\n| freund_lexoffice_369wohlbefinden, freund_lexoffice_karlscore, freund_pipeline | mysqldump + gzip |\n| karlkratz_de, karlkratz_de_dev, karlkratz_semantic, karlscore_net | mysqldump + gzip |\n| ki_db, ki_protocol, kiebook, kigem_rag, kigemeinschaft, kiglove, kiseminar | mysqldump + gzip |\n| lisa_sundermeyer_de, nevoteam, nextcloud, ocr_rechnung, payment_system | mysqldump + gzip |\n| pdf_import, ragdemo, ragdemo1, raum_events, sprechstunde_physio | mysqldump + gzip |\n| system_karlkratz_de, t_anachroma, telegram_bot_karlkratz, tracking, vmail | mysqldump + gzip |\n| _grants (alle DB-Benutzer und Rechte) | mysql + gzip |\n\n**Gesamt: 45 Datenbanken + Grants**\n\n### Taeglich: Weitere Datenbanken\n\n| Dienst | Daten | Methode |\n|--------|-------|---------|\n| Redis | db0 (128k+ Keys) | BGSAVE + Kopie dump.rdb + gzip |\n| Qdrant | 82 Collections (Vektordaten) | API-Snapshot pro Collection |\n| ArangoDB | Graph-Daten | arangodump --compress-output |\n| ChromaDB | Vektordaten (\/var\/www\/chromadb) | tar + gzip |\n\n### Taeglich: E-Mail\n\n| Verzeichnis | Inhalt | Groesse |\n|-------------|--------|---------|\n| \/var\/vmail\/ | Virtuelle Mailboxen (karlkratz.de, raum.events, sprechstunde.physio, tcc.gmbh) | ~3.5 GB |\n| \/var\/mail\/ | System-Mail | minimal |\n\n### Taeglich: Konfigurationen (16 Dienste)\n\n| Dienst | Pfad | Inhalt |\n|--------|------|--------|\n| Apache2 | \/etc\/apache2\/ | VHost-Konfigurationen aller Sites |\n| PHP | \/etc\/php\/ | php.ini, FPM-Pools |\n| MariaDB | \/etc\/mysql\/ | Server-Konfiguration |\n| Redis | \/etc\/redis\/ | Redis-Konfiguration |\n| Postfix | \/etc\/postfix\/ | MTA-Konfig, MySQL-Maps, Virtual-Maps, Transport |\n| Dovecot | \/etc\/dovecot\/ | IMAP-Server-Konfiguration |\n| OpenDKIM | \/etc\/opendkim\/ | DKIM-Schluessel |\n| Rspamd | \/etc\/rspamd\/ | Spam-Filter-Konfiguration |\n| Fail2ban | \/etc\/fail2ban\/ | Jail-Konfigurationen |\n| nftables | \/etc\/nftables\/ | Firewall-Regeln |\n| Monit | \/etc\/monit\/ | 29+ Monitoring-Regeln |\n| ipset | \/etc\/ipset\/ | IP-Blocklisten |\n| Cron | \/etc\/cron.d\/ | 15 Cron-Konfigurationen |\n| Let's Encrypt | \/etc\/letsencrypt\/ | SSL-Zertifikate + Renewal |\n| NATS | \/etc\/nats\/ | Message-Broker-Konfiguration |\n| Qdrant | \/etc\/qdrant\/ | Qdrant-Konfiguration |\n| systemd | \/etc\/systemd\/system\/ | Custom Services (qdrant, ollama, etc.) |\n\n### Taeglich: Credentials (GPG-verschluesselt)\n\n| Typ | Quellen |\n|-----|---------|\n| .env-Dateien | Alle \/var\/www\/*\/.env (bis 3 Ebenen tief) |\n| API-Credentials | credentials.json, stripe-keys.json, deployment-auth.json |\n| Weitere | nevoteam_adm.json, *api_key* Dateien |\n\n**Verschluesselung:** GPG AES-256, symmetrisch, Passphrase in \/root\/.backup-gpg-passphrase\n\n### Taeglich: Webinhalte (inkrementell)\n\n| Verzeichnis | Methode | Groesse |\n|-------------|---------|---------|\n| \/var\/www\/ (81 Sites inkl. videos) | rsync --delete | ~360 GB |\n\n**Excludes:** .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, *.log, logs\/, demo.karlkratz.de\/\n\n### Taeglich: Metadaten\n\n| Datei | Inhalt |\n|-------|--------|\n| disk-usage.txt | Festplattenauslastung |\n| db-list.txt | Aktuelle Datenbankliste |\n| redis-info.txt | Redis-Statistiken |\n| dpkg-selections.txt | Installierte Pakete (fuer Disaster Recovery) |\n| running-services.txt | Laufende Dienste |\n| checksums.sha256 | SHA256-Pruefsummen aller Backup-Dateien |\n| backup.log | Kopie des Backup-Logs |\n\n### NICHT gesichert (bewusst)\n\n| Komponente | Grund |\n|------------|-------|\n| Ollama-Modelle (~150 GB) | Koennen jederzeit neu heruntergeladen werden |\n| demo.karlkratz.de (54 GB) | Demo-Daten, nicht produktionsrelevant |\n| Log-Dateien | Nicht archivierungsrelevant |\n| node_modules\/, vendor\/ | Koennen via Paketmanager wiederhergestellt werden |\n| .git\/ Verzeichnisse | Code liegt in Repositories |\n\n## Verzeichnisstruktur auf ki (\/backup\/prod\/)\n\n```\n\/backup\/\n├── prod\/\n│ ├── daily\/YYYY-MM-DD\/ # 7-Tage-Rotation\n│ │ ├── databases\/\n│ │ │ ├── mariadb\/ # 45x DB.sql.gz + _grants.sql.gz\n│ │ │ ├── redis\/ # dump.rdb.gz\n│ │ │ ├── qdrant\/ # Collection-Snapshots\n│ │ │ ├── arangodb\/ # arangodump-Ausgabe\n│ │ │ └── chromadb\/ # chromadb-data.tar.gz\n│ │ ├── mail\/\n│ │ │ ├── vmail.tar.gz\n│ │ │ └── mail.tar.gz\n│ │ ├── configs\/ # 16x Dienst.tar.gz\n│ │ ├── credentials\/ # credentials.tar.gz.gpg\n│ │ └── meta\/ # Checksummen, Logs, Systeminformationen\n│ └── incremental\/\n│ └── www\/ # rsync-Spiegel von \/var\/www\/\n└── ki\/ # Lokale ki-Backups (eigener Cron)\n```\n\n## Fehlerbehandlung\n\n- Einzelne Fehler brechen das Backup NICHT ab\n- Alle Fehler werden gesammelt und am Ende per E-Mail gemeldet\n- Lock-File verhindert parallele Ausfuehrung\n- Bei SSH-Timeout wird Transfer uebersprungen (Rest laeuft weiter)\n\n## Monitoring\n\n### Auf prod\n- **Monit**: Prueft ob Backup-Log aktuell ist (< 26 Stunden alt)\n- **Log-Rotation**: Woechentlich, 8 Wochen aufbewahrt\n\n### Auf ki\n- **Verifikations-Script**: \/var\/www\/scripts\/verify-prod-backup.sh (taeglich 08:00)\n- Prueft: Backup-Verzeichnis vorhanden, mind. 40 DB-Dumps, Speicherplatz > 100 GB frei\n\n## Wiederherstellung (Restore)\n\n### Einzelne MariaDB-Datenbank\n\n```bash\n# Von ki holen und einspielen\nssh root@88.198.50.199 \"cat \/backup\/prod\/daily\/DATUM\/databases\/mariadb\/DBNAME.sql.gz\" \\\n | gunzip | mysql DBNAME\n```\n\n### Redis\n\n```bash\nsystemctl stop redis-server\nssh root@88.198.50.199 \"cat \/backup\/prod\/daily\/DATUM\/databases\/redis\/dump.rdb.gz\" \\\n | gunzip > \/var\/lib\/redis\/dump.rdb\nchown redis:redis \/var\/lib\/redis\/dump.rdb\nsystemctl start redis-server\n```\n\n### Qdrant Collection\n\n```bash\nscp root@88.198.50.199:\/backup\/prod\/daily\/DATUM\/databases\/qdrant\/COLLECTION.snapshot \/tmp\/\ncurl -X POST \"http:\/\/localhost:6333\/collections\/COLLECTION\/snapshots\/upload\" \\\n -H \"Content-Type: multipart\/form-data\" \\\n -F \"snapshot=@\/tmp\/COLLECTION.snapshot\"\n```\n\n### Credentials entschluesseln\n\n```bash\ngpg --batch --decrypt \\\n --passphrase-file \/root\/.backup-gpg-passphrase \\\n \/backup\/prod\/daily\/DATUM\/credentials\/credentials.tar.gz.gpg \\\n | tar xzf - -C \/tmp\/restore-credentials\/\n```\n\n### Vollstaendige \/var\/www\/ wiederherstellen\n\n```bash\nrsync -azP root@88.198.50.199:\/backup\/prod\/incremental\/www\/ \/var\/www\/\n```\n\n### E-Mail wiederherstellen\n\n```bash\nscp root@88.198.50.199:\/backup\/prod\/daily\/DATUM\/mail\/vmail.tar.gz \/tmp\/\ncd \/var && tar xzf \/tmp\/vmail.tar.gz\nchown -R vmail:vmail \/var\/vmail\/\n```\n\n### Konfiguration wiederherstellen\n\n```bash\nscp root@88.198.50.199:\/backup\/prod\/daily\/DATUM\/configs\/apache2.tar.gz \/tmp\/\ncd \/etc && tar xzf \/tmp\/apache2.tar.gz\nsystemctl reload apache2\n```\n\n## Speicherplatz-Planung auf ki\n\n| Bereich | Geschaetzter Bedarf |\n|---------|---------------------|\n| daily (7 Tage, DB+Mail+Configs) | ~50-80 GB |\n| incremental\/www | ~360 GB |\n| **Gesamt** | **~420-440 GB** |\n| **Verfuegbar auf ki** | **~1.1 TB** |\n\n## Wartung\n\n### Neue Datenbank hinzufuegen\n\n1. Script oeffnen: `\/var\/www\/scripts\/backup-prod-to-ki.sh`\n2. DB-Name in `DB_LIST` Array einfuegen\n3. Diese Dokumentation aktualisieren\n\n### Log pruefen\n\n```bash\ntail -100 \/var\/log\/backup-prod-to-ki.log\n```\n\n### Backup-Groesse auf ki pruefen\n\n```bash\nssh root@88.198.50.199 \"du -sh \/backup\/prod\/daily\/* \/backup\/prod\/incremental\/*\"\n```\n\n### Manuelles Backup ausloesen\n\n```bash\n\/var\/www\/scripts\/backup-prod-to-ki.sh\n```\n\n## Sicherheitskonzept\n\n- **Transport:** SSH (rsync ueber SSH-Tunnel)\n- **Credentials at rest:** GPG AES-256 symmetrisch verschluesselt\n- **Passphrase:** \/root\/.backup-gpg-passphrase (chmod 600) auf prod UND ki\n- **Zugriff:** Script laeuft als root (noetig fuer DB-Dumps und \/etc\/)\n- **WICHTIG:** GPG-Passphrase zusaetzlich offline sichern!\n\n## Aenderungshistorie\n\n| Datum | Aenderung | Autor |\n|-------|-----------|-------|\n| 2026-02-19 | Ersteinrichtung | System |\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/tmp\/prozess.md",
"content": "# Datensicherung: prod.karlkratz.com → ki\/st Server\n\n## Uebersicht\n\n| Eigenschaft | Wert |\n|---------------------|-------------------------------------------|\n| Quell-Server | prod.karlkratz.com (148.251.182.181) |\n| Ziel-Server | ki\/st (88.198.50.199) |\n| Backup-Script | \/var\/www\/scripts\/backup-prod-to-ki.sh |\n| Cron-Job | \/etc\/cron.d\/backup-prod-to-ki |\n| Ausfuehrungszeit | Taeglich 02:00 Uhr |\n| Aufbewahrung | 7 Tage (taeglich), fortlaufend (inkr.) |\n| Log-Datei | \/var\/log\/backup-prod-to-ki.log |\n| Lock-Datei | \/var\/run\/backup-prod-to-ki.lock |\n| Benachrichtigung | i@karlkratz.de (Fehler sofort, OK montags)|\n\n## Gesicherte Komponenten\n\n### Taeglich: Datenbanken (komprimiert, einzeln)\n\n| Datenbank | Methode |\n|-----------|---------|\n| admin, admin_auth, agent, anachroma_pipeline, apache_log_db | mysqldump + gzip |\n| backup_restore, bic, claudia_grajek_de, code_documentation, code_intelligence | mysqldump + gzip |\n| codequality, content_pipeline, doc2vector, freund | mysqldump + gzip |\n| freund_lexoffice_369wohlbefinden, freund_lexoffice_karlscore, freund_pipeline | mysqldump + gzip |\n| karlkratz_de, karlkratz_de_dev, karlkratz_semantic, karlscore_net | mysqldump + gzip |\n| ki_db, ki_protocol, kiebook, kigem_rag, kigemeinschaft, kiglove, kiseminar | mysqldump + gzip |\n| lisa_sundermeyer_de, nevoteam, nextcloud, ocr_rechnung, payment_system | mysqldump + gzip |\n| pdf_import, ragdemo, ragdemo1, raum_events, sprechstunde_physio | mysqldump + gzip |\n| system_karlkratz_de, t_anachroma, telegram_bot_karlkratz, tracking, vmail | mysqldump + gzip |\n| _grants (alle DB-Benutzer und Rechte) | mysql + gzip |\n\n**Gesamt: 45 Datenbanken + Grants**\n\n### Taeglich: Weitere Datenbanken\n\n| Dienst | Daten | Methode |\n|--------|-------|---------|\n| Redis | db0 (128k+ Keys) | BGSAVE + Kopie dump.rdb + gzip |\n| Qdrant | 82 Collections (Vektordaten) | API-Snapshot pro Collection |\n| ArangoDB | Graph-Daten | arangodump --compress-output |\n| ChromaDB | Vektordaten (\/var\/www\/chromadb) | tar + gzip |\n\n### Taeglich: E-Mail\n\n| Verzeichnis | Inhalt | Groesse |\n|-------------|--------|---------|\n| \/var\/vmail\/ | Virtuelle Mailboxen (karlkratz.de, raum.events, sprechstunde.physio, tcc.gmbh) | ~3.5 GB |\n| \/var\/mail\/ | System-Mail | minimal |\n\n### Taeglich: Konfigurationen (16 Dienste)\n\n| Dienst | Pfad | Inhalt |\n|--------|------|--------|\n| Apache2 | \/etc\/apache2\/ | VHost-Konfigurationen aller Sites |\n| PHP | \/etc\/php\/ | php.ini, FPM-Pools |\n| MariaDB | \/etc\/mysql\/ | Server-Konfiguration |\n| Redis | \/etc\/redis\/ | Redis-Konfiguration |\n| Postfix | \/etc\/postfix\/ | MTA-Konfig, MySQL-Maps, Virtual-Maps, Transport |\n| Dovecot | \/etc\/dovecot\/ | IMAP-Server-Konfiguration |\n| OpenDKIM | \/etc\/opendkim\/ | DKIM-Schluessel |\n| Rspamd | \/etc\/rspamd\/ | Spam-Filter-Konfiguration |\n| Fail2ban | \/etc\/fail2ban\/ | Jail-Konfigurationen |\n| nftables | \/etc\/nftables\/ | Firewall-Regeln |\n| Monit | \/etc\/monit\/ | 29+ Monitoring-Regeln |\n| ipset | \/etc\/ipset\/ | IP-Blocklisten |\n| Cron | \/etc\/cron.d\/ | 15 Cron-Konfigurationen |\n| Let's Encrypt | \/etc\/letsencrypt\/ | SSL-Zertifikate + Renewal |\n| NATS | \/etc\/nats\/ | Message-Broker-Konfiguration |\n| Qdrant | \/etc\/qdrant\/ | Qdrant-Konfiguration |\n| systemd | \/etc\/systemd\/system\/ | Custom Services (qdrant, ollama, etc.) |\n\n### Taeglich: Credentials (GPG-verschluesselt)\n\n| Typ | Quellen |\n|-----|---------|\n| .env-Dateien | Alle \/var\/www\/*\/.env (bis 3 Ebenen tief) |\n| API-Credentials | credentials.json, stripe-keys.json, deployment-auth.json |\n| Weitere | nevoteam_adm.json, *api_key* Dateien |\n\n**Verschluesselung:** GPG AES-256, symmetrisch, Passphrase in \/root\/.backup-gpg-passphrase\n\n### Taeglich: Webinhalte (inkrementell)\n\n| Verzeichnis | Methode | Groesse |\n|-------------|---------|---------|\n| \/var\/www\/ (81 Sites inkl. videos) | rsync --delete | ~360 GB |\n\n**Excludes:** .git\/, node_modules\/, vendor\/, __pycache__\/, .cache\/, *.log, logs\/, demo.karlkratz.de\/\n\n### Taeglich: Metadaten\n\n| Datei | Inhalt |\n|-------|--------|\n| disk-usage.txt | Festplattenauslastung |\n| db-list.txt | Aktuelle Datenbankliste |\n| redis-info.txt | Redis-Statistiken |\n| dpkg-selections.txt | Installierte Pakete (fuer Disaster Recovery) |\n| running-services.txt | Laufende Dienste |\n| checksums.sha256 | SHA256-Pruefsummen aller Backup-Dateien |\n| backup.log | Kopie des Backup-Logs |\n\n### NICHT gesichert (bewusst)\n\n| Komponente | Grund |\n|------------|-------|\n| Ollama-Modelle (~150 GB) | Koennen jederzeit neu heruntergeladen werden |\n| demo.karlkratz.de (54 GB) | Demo-Daten, nicht produktionsrelevant |\n| Log-Dateien | Nicht archivierungsrelevant |\n| node_modules\/, vendor\/ | Koennen via Paketmanager wiederhergestellt werden |\n| .git\/ Verzeichnisse | Code liegt in Repositories |\n\n## Verzeichnisstruktur auf ki (\/backup\/prod\/)\n\n```\n\/backup\/\n├── prod\/\n│ ├── daily\/YYYY-MM-DD\/ # 7-Tage-Rotation\n│ │ ├── databases\/\n│ │ │ ├── mariadb\/ # 45x DB.sql.gz + _grants.sql.gz\n│ │ │ ├── redis\/ # dump.rdb.gz\n│ │ │ ├── qdrant\/ # Collection-Snapshots\n│ │ │ ├── arangodb\/ # arangodump-Ausgabe\n│ │ │ └── chromadb\/ # chromadb-data.tar.gz\n│ │ ├── mail\/\n│ │ │ ├── vmail.tar.gz\n│ │ │ └── mail.tar.gz\n│ │ ├── configs\/ # 16x Dienst.tar.gz\n│ │ ├── credentials\/ # credentials.tar.gz.gpg\n│ │ └── meta\/ # Checksummen, Logs, Systeminformationen\n│ └── incremental\/\n│ └── www\/ # rsync-Spiegel von \/var\/www\/\n└── ki\/ # Lokale ki-Backups (eigener Cron)\n```\n\n## Fehlerbehandlung\n\n- Einzelne Fehler brechen das Backup NICHT ab\n- Alle Fehler werden gesammelt und am Ende per E-Mail gemeldet\n- Lock-File verhindert parallele Ausfuehrung\n- Bei SSH-Timeout wird Transfer uebersprungen (Rest laeuft weiter)\n\n## Monitoring\n\n### Auf prod\n- **Monit**: Prueft ob Backup-Log aktuell ist (< 26 Stunden alt)\n- **Log-Rotation**: Woechentlich, 8 Wochen aufbewahrt\n\n### Auf ki\n- **Verifikations-Script**: \/var\/www\/scripts\/verify-prod-backup.sh (taeglich 08:00)\n- Prueft: Backup-Verzeichnis vorhanden, mind. 40 DB-Dumps, Speicherplatz > 100 GB frei\n\n## Wiederherstellung (Restore)\n\n### Einzelne MariaDB-Datenbank\n\n```bash\n# Von ki holen und einspielen\nssh root@88.198.50.199 \"cat \/backup\/prod\/daily\/DATUM\/databases\/mariadb\/DBNAME.sql.gz\" \\\n | gunzip | mysql DBNAME\n```\n\n### Redis\n\n```bash\nsystemctl stop redis-server\nssh root@88.198.50.199 \"cat \/backup\/prod\/daily\/DATUM\/databases\/redis\/dump.rdb.gz\" \\\n | gunzip > \/var\/lib\/redis\/dump.rdb\nchown redis:redis \/var\/lib\/redis\/dump.rdb\nsystemctl start redis-server\n```\n\n### Qdrant Collection\n\n```bash\nscp root@88.198.50.199:\/backup\/prod\/daily\/DATUM\/databases\/qdrant\/COLLECTION.snapshot \/tmp\/\ncurl -X POST \"http:\/\/localhost:6333\/collections\/COLLECTION\/snapshots\/upload\" \\\n -H \"Content-Type: multipart\/form-data\" \\\n -F \"snapshot=@\/tmp\/COLLECTION.snapshot\"\n```\n\n### Credentials entschluesseln\n\n```bash\ngpg --batch --decrypt \\\n --passphrase-file \/root\/.backup-gpg-passphrase \\\n \/backup\/prod\/daily\/DATUM\/credentials\/credentials.tar.gz.gpg \\\n | tar xzf - -C \/tmp\/restore-credentials\/\n```\n\n### Vollstaendige \/var\/www\/ wiederherstellen\n\n```bash\nrsync -azP root@88.198.50.199:\/backup\/prod\/incremental\/www\/ \/var\/www\/\n```\n\n### E-Mail wiederherstellen\n\n```bash\nscp root@88.198.50.199:\/backup\/prod\/daily\/DATUM\/mail\/vmail.tar.gz \/tmp\/\ncd \/var && tar xzf \/tmp\/vmail.tar.gz\nchown -R vmail:vmail \/var\/vmail\/\n```\n\n### Konfiguration wiederherstellen\n\n```bash\nscp root@88.198.50.199:\/backup\/prod\/daily\/DATUM\/configs\/apache2.tar.gz \/tmp\/\ncd \/etc && tar xzf \/tmp\/apache2.tar.gz\nsystemctl reload apache2\n```\n\n## Speicherplatz-Planung auf ki\n\n| Bereich | Geschaetzter Bedarf |\n|---------|---------------------|\n| daily (7 Tage, DB+Mail+Configs) | ~50-80 GB |\n| incremental\/www | ~360 GB |\n| **Gesamt** | **~420-440 GB** |\n| **Verfuegbar auf ki** | **~1.1 TB** |\n\n## Wartung\n\n### Neue Datenbank hinzufuegen\n\n1. Script oeffnen: `\/var\/www\/scripts\/backup-prod-to-ki.sh`\n2. DB-Name in `DB_LIST` Array einfuegen\n3. Diese Dokumentation aktualisieren\n\n### Log pruefen\n\n```bash\ntail -100 \/var\/log\/backup-prod-to-ki.log\n```\n\n### Backup-Groesse auf ki pruefen\n\n```bash\nssh root@88.198.50.199 \"du -sh \/backup\/prod\/daily\/* \/backup\/prod\/incremental\/*\"\n```\n\n### Manuelles Backup ausloesen\n\n```bash\n\/var\/www\/scripts\/backup-prod-to-ki.sh\n```\n\n## Sicherheitskonzept\n\n- **Transport:** SSH (rsync ueber SSH-Tunnel)\n- **Credentials at rest:** GPG AES-256 symmetrisch verschluesselt\n- **Passphrase:** \/root\/.backup-gpg-passphrase (chmod 600) auf prod UND ki\n- **Zugriff:** Script laeuft als root (noetig fuer DB-Dumps und \/etc\/)\n- **WICHTIG:** GPG-Passphrase zusaetzlich offline sichern!\n\n## Aenderungshistorie\n\n| Datum | Aenderung | Autor |\n|-------|-----------|-------|\n| 2026-02-19 | Ersteinrichtung | System |\n",
"structuredPatch": [],
"originalFile": null
}
}