Files
infra-borgbackup-docker/readme.md
T
2026-05-31 13:32:57 +00:00

4.6 KiB
Raw Blame History

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

# 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

# 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

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

# 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

# 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

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!

# 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

# 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

# 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:

# 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