Das Setup

Ich will meinen Ubuntu-24.04-Desktop auf meinen Proxmox Backup Server sichern. PBS läuft auf einem lokalen Homelab-Host (pbs-tatooine, 192.168.66.4). Statt root-Passwort im Backup-Script hinterlegen zu wollen, soll ein API-Token mit minimalen Rechten ran.

Klingt simpel. Ist es auch — wenn man zwei Gotchas kennt.

Installation

Proxmox liefert ein dediziertes pbs-client-Repository. Das funktioniert auch auf Ubuntu 24.04 mit dem Debian-Bookworm-Repo:

# GPG-Key
wget -q https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg \
  -O /usr/share/keyrings/proxmox-archive-keyring.gpg

# Prüfsumme verifizieren
sha256sum /usr/share/keyrings/proxmox-archive-keyring.gpg
# Erwartet: 136673be77aba35dcce385b28737689ad64fd785a797e57897589aed08db6e45

# Repo eintragen
echo "deb [signed-by=/usr/share/keyrings/proxmox-archive-keyring.gpg] \
  http://download.proxmox.com/debian/pbs-client bookworm main" \
  > /etc/apt/sources.list.d/pbs-client.list

apt update && apt install proxmox-backup-client

Ubuntu 24.04 (Noble) mit dem Bookworm-Repo: funktioniert problemlos.

API-Token erstellen

Auf dem PBS-Host einen Token für den gewünschten User anlegen:

proxmox-backup-manager user generate-token backup@pbs mein-client

Ausgabe:

Result: {
  "tokenid": "backup@pbs!mein-client",
  "value": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Den Token-Wert jetzt kopieren — er wird nur einmal angezeigt.

Die ACL-Falle

Hier stolpert man: Der Token backup@pbs!mein-client hat keine Rechte, auch wenn backup@pbs bereits Admin auf dem Datastore ist.

PBS API-Tokens erben Rechte nicht vom User. Punkt. Die Doku erwähnt das, aber der Fehler ist trotzdem überraschend:

Error: permission check failed - missing Datastore.Audit|Datastore.Backup
  on /datastore/backups/mein-namespace

Lösung: ACL explizit für den Token setzen.

proxmox-backup-manager acl update \
  /datastore/backups/mein-namespace \
  DatastoreAdmin \
  --auth-id "backup@pbs!mein-client"

Warum DatastoreAdmin statt DatastoreBackup? Weil DatastoreBackup nur Datastore.Backup enthält, aber kein Datastore.Audit. Ohne Audit funktionieren snapshot list und Statusabfragen nicht. Wer wirklich minimal bleiben will: DatastoreBackup + DatastoreReader kombinieren.

Namespace erstellen

proxmox-backup-manager hat kein namespace create-Subcommand. Namespace einfach als Verzeichnis anlegen:

mkdir -p /data_storage/backups/ns/mein-namespace
chown -R backup:backup /data_storage/backups/ns/mein-namespace

Backup konfigurieren

Credentials persistent ablegen:

mkdir -p /etc/proxmox-backup
cat > /etc/proxmox-backup/client.conf <<EOF
repository: backup@pbs!mein-client@192.168.66.4:backups
fingerprint: XX:XX:XX:...  # von: proxmox-backup-manager cert info
EOF
echo "TOKEN-WERT" > /etc/proxmox-backup/client.password
chmod 600 /etc/proxmox-backup/client.conf /etc/proxmox-backup/client.password

PBS-Fingerprint holen:

ssh root@192.168.66.4 "proxmox-backup-manager cert info | grep Fingerprint"

Verbindungstest:

PBS_REPOSITORY="backup@pbs!mein-client@192.168.66.4:backups" \
PBS_FINGERPRINT="XX:XX:..." \
PBS_PASSWORD="$(cat /etc/proxmox-backup/client.password)" \
proxmox-backup-client snapshot list --ns mein-namespace

Leere Ausgabe = Verbindung funktioniert.

Backup-Script mit systemd-Timer

Script unter /usr/local/bin/pbs-backup.sh:

#!/bin/bash
set -euo pipefail

export PBS_REPOSITORY="backup@pbs!mein-client@192.168.66.4:backups"
export PBS_FINGERPRINT="XX:XX:..."
export PBS_PASSWORD
PBS_PASSWORD=$(cat /etc/proxmox-backup/client.password)

proxmox-backup-client backup \
    home.pxar:/home \
    etc.pxar:/etc \
    --ns mein-namespace \
    --backup-type host \
    --backup-id mein-hostname \
    --exclude "luke.skywalker/Downloads/tmp"

systemd-Timer für täglich 10:00:

# /etc/systemd/system/pbs-backup.timer
[Unit]
Description=Proxmox Backup — täglich ab 10:00

[Timer]
OnCalendar=*-*-* 10:00:00
Persistent=true
RandomizedDelaySec=5min

[Install]
WantedBy=timers.target
systemctl enable --now pbs-backup.timer

Manuell starten (kehrt sofort zurück, Backup läuft im Hintergrund):

systemctl start --no-block pbs-backup.service

--no-block nicht vergessen — ohne es blockiert der Terminal bis das Backup durch ist. Bei 300 GB macht das mehrere Stunden Spaß.

Verifikation

# Snapshots auf dem PBS prüfen
PBS_REPOSITORY="..." PBS_FINGERPRINT="..." PBS_PASSWORD="..." \
proxmox-backup-client snapshot list --ns mein-namespace

# Logs
journalctl -u pbs-backup.service --since today

Fazit

PBS als Backup-Ziel für Linux-Desktops und -Server funktioniert gut. Die zwei Stolperstellen:

  1. API-Tokens brauchen eigene ACLs — User-Rechte werden nicht vererbt
  2. DatastoreBackup reicht nicht für Read-Ops — DatastoreAdmin oder Kombination mit DatastoreReader verwenden

Der Rest ist straightforward.