164 lines
6.1 KiB
Markdown
164 lines
6.1 KiB
Markdown
# 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
|
||
|
||
```text
|
||
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:
|
||
```bash
|
||
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)
|
||
```bash
|
||
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
|
||
```bash
|
||
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
|
||
```bash
|
||
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 `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>`, Datastore `homelab`, Username `root@pam`, Passwort, Fingerprint einfügen.
|
||
|
||
## 1.7 — Alle Gäste sichern
|
||
**Einmalig jetzt (vor dem Wipe), konsistent per stop-modus:**
|
||
```bash
|
||
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?
|
||
```bash
|
||
# 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
|
||
```bash
|
||
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:
|
||
```bash
|
||
# 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)
|
||
```bash
|
||
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:
|
||
```bash
|
||
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.
|