6.1 KiB
anleitung: PBS aufsetzen + tank sichern
Zwei Teile: erst Proxmox Backup Server installieren & konfigurieren (Datastore auf der neuen SSD), dann den Tank sichern.
variablen — oben ausfüllen
PBS_DATASTORE_PATH = /mnt/pve/pbs-ssd # pfad deiner neuen SSD -> prüfen mit: cat /etc/pve/storage.cfg
PBS_CTID = 145 # freie container-ID
PBS_IP / GW = <freie-IP>/24 / <gateway> # in deinem bridge-subnetz
ETT_HDD = /mnt/pve/ext-hdd01 # die alte HDD = restic-ziel für den tank
HETZNER = uXXXX@uXXXX.your-storagebox.de
Pfad der neuen SSD bestätigen:
cat /etc/pve/storage.cfg # zeigt den namen + pfad der neu angelegten directory-storage
TEIL 1 — PBS installieren & konfigurieren
1.1 — Debian-13-Template holen (auf dem PVE-Host)
pveam update
pveam available | grep debian-13
pveam download local debian-13-standard_13.0-1_amd64.tar.zst # name ggf. anpassen
1.2 — PBS-LXC anlegen (privileged), SSD reinmounten
pct create 145 local:vztmpl/debian-13-standard_13.0-1_amd64.tar.zst \
--hostname pbs --cores 2 --memory 2048 --swap 512 \
--rootfs local-lvm:16 --unprivileged 0 \
--net0 name=eth0,bridge=vmbr0,ip=<freie-IP>/24,gw=<gateway> \
--password
# die neue SSD als datastore in den container binden:
pct set 145 -mp0 /mnt/pve/pbs-ssd,mp=/datastore
pct start 145
1.3 — PBS im Container installieren
pct enter 145
wget https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg \
-O /usr/share/keyrings/proxmox-archive-keyring.gpg
cat > /etc/apt/sources.list.d/pbs.sources << 'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
apt update && apt install -y proxmox-backup-server
Bei der Postfix-Frage „No configuration" wählen.
1.4 — Web-UI + Datastore anlegen
- Öffne
https://<PBS_IP>:8007, Loginroot+ Container-Passwort (Self-signed-Warnung ist normal). - Datastore → Add Datastore: Name
homelab, Backing Path/datastore.
1.5 — Aufräum- & Prüf-Jobs (im PBS)
- Datastore
homelab→ Prune & GC:- Prune: keep-last 3, keep-daily 7, keep-weekly 4, keep-monthly 6
- GC-Schedule: wöchentlich
- Verify Jobs → Add: wöchentlich (prüft die Backups gegen Bitrot).
1.6 — PBS in PVE als Backup-Ziel einbinden
- Im PBS: Dashboard → Show Fingerprint kopieren.
- Im PVE: Datacenter → Storage → Add → Proxmox Backup Server:
- ID
pbs, Server<PBS_IP>, Datastorehomelab, Usernameroot@pam, Passwort, Fingerprint einfügen.
- ID
1.7 — Alle Gäste sichern
Einmalig jetzt (vor dem Wipe), konsistent per stop-modus:
for id in $(pct list | awk 'NR>1{print $1}') $(qm list | awk 'NR>1{print $1}'); do
vzdump $id --mode stop --storage pbs
done
Das sichert deine 16 LXC (100–900) + die 2 VMs (500 windows, 800 homeassistant) ins PBS.
500 (windows) ist der grösste Brocken — vorher Platz auf der SSD prüfen:
df -h /mnt/pve/pbs-ssd.
Für den laufenden Betrieb (nach dem Rebuild): Datacenter → Backup → Add → täglicher Job, alle Gäste, Storage pbs, Modus Snapshot.
TEIL 2 — tank sichern
PBS deckt die Container/VMs ab. Die Bulk-Daten auf dem Tank sind eine eigene Schicht — die sicherst du mit Restic auf die alte HDD (ext-hdd01) und offsite nach Hetzner.
2.1 — Discovery: was liegt wo, und steckt es schon im PBS?
# alle datasets + mountpoints auf dem tank:
zfs list -o name,used,mountpoint -r tank
# pro container: mountpoints + backup-flag:
for id in $(pct list | awk 'NR>1{print $1}'); do
echo "=== CT $id ==="; pct config $id | grep -E '^(rootfs|mp[0-9]+):'
done
Entscheidend ist das backup=-Flag jedes Daten-Mountpoints:
backup=1→ die Daten sind schon in den PBS-Sicherungen aus 1.7. Restic ist dann nur noch für die Offsite-Kopie nötig.backup=0→ die Daten sind nicht im PBS → Restic ist hier Pflicht, lokal und offsite.
Schick mir die Ausgabe dieser beiden Befehle, dann setze ich unten die echten Pfade ein. Bis dahin: in den Restic-Befehl kommen die
mountpoint-Pfade der Daten-Datasets aus derzfs list(deine App-Daten wie nc_data, immich-library usw. — nicht die rootfs-Subvols der Websites, die deckt PBS ab).
2.2 — Restic-Repos initialisieren
export RESTIC_PASSWORD_FILE=/root/.restic-pw # vorher anlegen: ein starkes passwort reinschreiben, chmod 600
# lokal auf die HDD:
export RESTIC_REPOSITORY=/mnt/pve/ext-hdd01/restic-tank
restic init
# offsite nach hetzner:
export RESTIC_REPOSITORY=sftp:uXXXX@uXXXX.your-storagebox.de:/tank
restic init
2.3 — Tank sichern (kalt, weil Migration → Dienste eh gestoppt)
Pfade aus 2.1 einsetzen:
# lokal
export RESTIC_REPOSITORY=/mnt/pve/ext-hdd01/restic-tank
restic backup /tank/<dataset-a> /tank/<dataset-b> /tank/<...>
# offsite
export RESTIC_REPOSITORY=sftp:uXXXX@uXXXX.your-storagebox.de:/tank
restic backup /tank/<dataset-a> /tank/<dataset-b> /tank/<...>
Restic als root → Eigentümer/Rechte (inkl. Idmap-Offsets) kommen 1:1 zurück.
2.4 — Verifizieren + Restore-Test (PFLICHT vor dem Wipe)
restic -r /mnt/pve/ext-hdd01/restic-tank check
restic -r /mnt/pve/ext-hdd01/restic-tank restore latest \
--target /tmp/rtest --include /tank/<dataset-a>
ls -la /tmp/rtest/tank/<dataset-a> # stimmen die dateien?
2.5 — Für den laufenden Betrieb
Nach dem Rebuild beide Restic-Läufe (lokal + Hetzner) in einen täglichen Cron, plus Pruning:
restic forget --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --prune
die ganze kette auf einen blick
| Schicht | Werkzeug | Lokal | Offsite |
|---|---|---|---|
| Container + VMs | PBS | SSD (pbs-ssd) |
— (aus Gitea reproduzierbar) |
| Tank-Daten | Restic | HDD (ext-hdd01) |
Hetzner |
Beide externen Platten + die Hetzner-Box überleben den Wipe. Nach dem Rebuild: PBS-Datastore auf der SSD wieder einhängen → Gäste zurück; Tank neu anlegen → Restic zurück.