This repository has been archived on 2026-07-22. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
homelab/doc/plan/pbs-und-tank-backup-anleitung.md

6.1 KiB
Raw Permalink Blame History

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, Login root + 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 homelabPrune & 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>, Datastore homelab, Username root@pam, Passwort, Fingerprint einfügen.

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 (100900) + 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 der zfs 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.