#!/usr/bin/env bash # # setup-pbs.sh — richtet einen Proxmox Backup Server als LXC ein. # Datastore landet auf der angegebenen (bereits eingebundenen) SSD. # # Macht NUR additive Dinge: LXC anlegen, PBS installieren, Datastore anlegen, # in PVE als Storage einbinden. Fasst KEINE Platten an, loescht nichts, # startet KEINE Backups. Das machst du danach bewusst selbst. # # Auf dem Proxmox-VE-Host als root ausfuehren. Vorher durchlesen. set -euo pipefail [[ $EUID -eq 0 ]] || { echo "Bitte als root ausfuehren."; exit 1; } command -v pct >/dev/null || { echo "Kein Proxmox-VE-Host (pct fehlt)."; exit 1; } echo "=== PBS-LXC Setup ===" echo # --- datastore-pfad (die neue SSD) --- echo "Eingebundene Directory-Storages (Pfad-Spalte):" awk '/^dir:/{name=$2} /path /{print " "name" -> "$2}' /etc/pve/storage.cfg || true echo read -rp "Pfad der SSD fuer den Datastore [/mnt/pve/pbs-ssd]: " DS_PATH DS_PATH=${DS_PATH:-/mnt/pve/pbs-ssd} [[ -d $DS_PATH ]] || { echo "FEHLER: $DS_PATH existiert nicht. Erst die SSD einbinden."; exit 1; } # --- container-ID (naechste freie als default) --- NEXTID=$(pvesh get /cluster/nextid) read -rp "Container-ID [$NEXTID]: " CTID CTID=${CTID:-$NEXTID} # --- netzwerk (gateway autodetektiert) --- GW_DETECT=$(ip route | awk '/default/{print $3; exit}') read -rp "Gateway [$GW_DETECT]: " GW GW=${GW:-$GW_DETECT} read -rp "Bridge [vmbr0]: " BRIDGE BRIDGE=${BRIDGE:-vmbr0} read -rp "Feste IP fuer PBS inkl. Maske (z.B. 192.168.1.50/24): " CTIP [[ -n ${CTIP:-} ]] || { echo "FEHLER: IP erforderlich."; exit 1; } IPONLY=${CTIP%%/*} # --- rootfs-storage --- read -rp "Storage fuer die Container-rootfs [local-lvm]: " ROOTSTORE ROOTSTORE=${ROOTSTORE:-local-lvm} # --- root-passwort fuer den container (= PBS-Login root@pam) --- read -rsp "Root-Passwort fuer den PBS-Container: " CTPW; echo [[ -n ${CTPW:-} ]] || { echo "FEHLER: Passwort erforderlich."; exit 1; } # --- zusammenfassung + bestaetigung --- cat < im Container /datastore Datastore-Name homelab SUMMARY read -rp "So anlegen? [y/N]: " OK [[ ${OK,,} == y ]] || { echo "Abgebrochen."; exit 0; } # --- debian-13-template sicherstellen --- echo ">> Template pruefen/holen ..." pveam update >/dev/null 2>&1 || true TMPL=$(pveam available --section system | awk '/debian-13-standard/{print $2}' | sort | tail -n1) [[ -n $TMPL ]] || { echo "FEHLER: kein debian-13-Template gefunden."; exit 1; } pveam list local | grep -q "$TMPL" || pveam download local "$TMPL" # --- LXC anlegen --- echo ">> Erstelle LXC $CTID ..." pct create "$CTID" "local:vztmpl/$TMPL" \ --hostname pbs --cores 2 --memory 2048 --swap 512 \ --rootfs "${ROOTSTORE}:16" --unprivileged 0 \ --net0 "name=eth0,bridge=${BRIDGE},ip=${CTIP},gw=${GW}" \ --onboot 1 # datastore reinmounten + starten pct set "$CTID" -mp0 "${DS_PATH},mp=/datastore" pct start "$CTID" sleep 5 pct exec "$CTID" -- bash -c "echo 'root:${CTPW}' | chpasswd" # --- PBS installieren --- echo ">> Installiere PBS im Container ..." pct exec "$CTID" -- bash -c ' set -e wget -qO /usr/share/keyrings/proxmox-archive-keyring.gpg \ https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg cat > /etc/apt/sources.list.d/pbs.sources <> Lege Datastore 'homelab' an ..." pct exec "$CTID" -- proxmox-backup-manager datastore create homelab /datastore 2>/dev/null \ || echo " (Datastore existiert evtl. schon - ok)" # --- in PVE als storage einbinden (fingerprint automatisch) --- echo ">> Binde PBS in PVE ein ..." FP=$(pct exec "$CTID" -- proxmox-backup-manager cert info | awk -F': ' '/[Ff]ingerprint/{print $2; exit}') if [[ -n ${FP:-} ]]; then pvesm add pbs pbs --server "$IPONLY" --datastore homelab \ --username root@pam --password "$CTPW" --fingerprint "$FP" 2>/dev/null \ && echo " PVE-Storage 'pbs' angelegt." \ || echo " (Storage 'pbs' existiert evtl. schon - ok)" else echo " Fingerprint nicht automatisch gefunden - bitte manuell einbinden (siehe unten)." fi cat < Prune & GC: keep-last 3, daily 7, weekly 4, monthly 6; GC woechentlich - Verify Jobs -> woechentlich Backups starten (bewusst, separat) - alle Gaeste einmalig ins PBS: 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 DONE