# BorgBackup Pull-Backup: Raspberry Pi ← Docker-Host ## Konzept ``` Docker-Host (Quelle) Raspberry Pi (Backup-Ziel) ───────────────────── ────────────────────────── borgbackup-User (SSH) ←───── sshfs mount (read-only) /var/lib/docker/volumes borg create → lokales Repo /etc, /opt, /home Systemd-Timer (02:30 Uhr) ``` Der Pi **zieht** die Daten – der Docker-Host hat **keinen** Zugriff auf das Borg-Repository. Ransomware oder Kompromittierung des Docker-Hosts kann die Backups nicht zerstören. --- ## Schritt-für-Schritt Einrichtung ### Schritt 1: Docker-Host vorbereiten ```bash # Als root auf dem Docker-Host: bash setup-docker-host.sh # Alternativ mit direkter Key-Übergabe: bash setup-docker-host.sh "ssh-ed25519 AAAA... pi@raspberry" ``` Das Skript legt den User `borgbackup` an und trägt den SSH-Key mit Einschränkungen ein (kein Port-Forwarding, kein PTY). ### Schritt 2: Pi einrichten ```bash # Als root auf dem Pi: bash setup-pi.sh 192.168.1.100 # IP des Docker-Hosts # Das Skript: # - Installiert borgbackup, sshfs, fuse # - Erzeugt SSH-Key /home/pi/.ssh/borg_pull # - Initialisiert das Borg-Repository # - Installiert das Backup-Skript ``` ### Schritt 3: Backup-Skript anpassen ```bash nano /usr/local/bin/borg-pull-backup.sh ``` Wichtige Variablen: | Variable | Bedeutung | |---|---| | `REMOTE_HOST` | IP/Hostname des Docker-Hosts | | `REMOTE_USER` | SSH-User (borgbackup) | | `SSH_KEY` | Pfad zum SSH-Key auf dem Pi | | `BORG_REPO` | Lokaler Pfad zum Repository | | `BORG_PASSPHRASE` | Verschlüsselungspasswort | | `BACKUP_PATHS` | Welche Pfade gesichert werden | | `KEEP_DAILY/WEEKLY/MONTHLY` | Aufbewahrungsrichtlinie | ### Schritt 4: Systemd-Timer aktivieren ```bash # Dateien kopieren cp borg-pull-backup.service /etc/systemd/system/ cp borg-pull-backup.timer /etc/systemd/system/ # Aktivieren systemctl daemon-reload systemctl enable --now borg-pull-backup.timer # Status prüfen systemctl status borg-pull-backup.timer systemctl list-timers borg-pull-backup.timer ``` ### Schritt 5: Testlauf ```bash # Backup manuell starten /usr/local/bin/borg-pull-backup.sh # Oder via Systemd systemctl start borg-pull-backup.service # Log verfolgen journalctl -fu borg-pull-backup.service tail -f /var/log/borg-pull-backup.log ``` --- ## Wiederherstellung ```bash export BORG_PASSPHRASE="dein-passwort" REPO="/media/backup/borg/docker-host" # Archive auflisten borg list "$REPO" # Einzelne Datei / Verzeichnis wiederherstellen cd /tmp/restore borg extract "$REPO::docker-host-2024-01-15T02-30-00" \ var/lib/docker/volumes/mein-volume # Komplettes Archiv wiederherstellen borg extract --list "$REPO::docker-host-2024-01-15T02-30-00" # Archiv-Inhalt durchsuchen ohne zu extrahieren borg list "$REPO::docker-host-2024-01-15T02-30-00" | grep "volumes" ``` --- ## Wichtige Hinweise ### Repokey sichern! ```bash # Einmalig nach der Initialisierung: borg key export /media/backup/borg/docker-host \ /media/backup/borg-key-docker-host.txt # Diesen Key getrennt aufbewahren (USB-Stick, Passwortmanager) # Ohne Key + Passwort sind die Backups WERTLOS ``` ### Docker Volumes konsistent sichern Für Datenbanken entweder: **Option A: Container kurz stoppen** ```bash # Im Backup-Skript vor borg create: ssh borgbackup@docker-host \ "docker compose -f /opt/myapp/docker-compose.yml stop" # ... backup ... ssh borgbackup@docker-host \ "docker compose -f /opt/myapp/docker-compose.yml start" ``` **Option B: Dump vorher erstellen** ```bash # PostgreSQL ssh borgbackup@docker-host \ "docker exec postgres pg_dumpall -U postgres > /opt/backup/pg_dump.sql" # MySQL/MariaDB ssh borgbackup@docker-host \ "docker exec mysql mysqldump -u root -p... --all-databases > /opt/backup/mysql_dump.sql" ``` ### Mehrere Docker-Hosts Das Skript ist pro Host ausgelegt. Für mehrere Hosts: ```bash # Kopie für jeden Host cp /usr/local/bin/borg-pull-backup.sh \ /usr/local/bin/borg-pull-backup-host2.sh # Separate Timer/Services anlegen cp /etc/systemd/system/borg-pull-backup.{service,timer} \ /etc/systemd/system/borg-pull-backup-host2.{service,timer} ``` --- ## Troubleshooting | Problem | Lösung | |---|---| | `sshfs: connection failed` | SSH-Key prüfen, User `borgbackup` vorhanden? | | `Permission denied` auf `/var/lib/docker` | borgbackup-User braucht Lesezugriff | | Mount hängt nach Fehler | `fusermount -u /mnt/borg-pull/docker-host` | | Backup sehr langsam | Compression auf `zstd` ändern statt `lz4` | | `Repository already locked` | `borg break-lock /media/backup/borg/docker-host` |