Files
2026-05-31 13:32:57 +00:00

181 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` |