- Go 89.9%
- HTML 9.8%
- Shell 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| cmd/pbs-container-helper | ||
| config | ||
| container | ||
| containerhelper | ||
| i18n | ||
| packaging | ||
| pbsclient | ||
| pbslog | ||
| schedule | ||
| ui | ||
| version | ||
| .gitignore | ||
| CHANGELOG.md | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| proxmox-backup-client-gui.spec | ||
| README.md | ||
| release-tarball.sh | ||
🖥️ proxmox-backup-client-gui
Native Qt6-Desktop-GUI für proxmox-backup-client (CLI von Proxmox Backup). Bedient das CLI im Hintergrund per Subprozess — kein eigener Server, kein Fork des CLI.
Technisch analog zu controlbox/qtgui: Go + github.com/mappu/miqt
(Qt6-Bindings), gleiches Theme.
Dieses Projekt wurde mit Unterstützung von Claude (Anthropic) entwickelt.
✨ Funktionen
- Repositories: PBS-Repository-Ziele (Host/Datastore/Namespace/Token) verwalten, Passwort optional aus einer separaten 0600-Datei statt im Klartext in der Config.
- Backup-Sets: mehrere rekursive Quellverzeichnisse zu einem Set
gruppieren, einzelne Unterordner/Dateien per Checkbox im Baum abwählen,
zusätzlich per Regex vorfiltern (Regex läuft rein GUI-seitig über den
lokalen Dateibaum —
proxmox-backup-clientselbst kennt nur Glob/--exclude). - Container: ausgewählte Volumes/Bind-Mounts eines Docker-Containers
(optional samt Compose-Projektverzeichnis) als einen Snapshot sichern und
an Ort und Stelle zurückspielen. Modus „Stoppen" (konsistent) oder
„Pausieren" (live, crash-konsistent). Ohne sudo: die root-eigenen
Volume-Daten liest und schreibt ein kurzlebiger Hilfscontainer mit dem
statischen
proxmox-backup-clientund dem statischenpbs-container-helper. Dateien ab 1 GiB (VM-Disks wie WinBoatsdata.img) werden eigene.img-Archive und sparse mit No_COW zurückgeschrieben; der Restore entpackt erst in ein Staging-Verzeichnis und tauscht dann, der bisherige Stand kann erhalten bleiben. Zeitpläne wie bei Backup-Sets; die Unit ruftpbs-qtgui -run-container-backup <Name>ohne Oberfläche auf. - Zeitpläne: pro Backup-Set beliebig viele systemd-
--user-Timer anlegen/aktivieren/deaktivieren/entfernen. Kein eigener Hintergrunddienst nötig, da der Client selbst keinen Scheduler mitbringt. - Restore: Repository → Gruppe → Snapshot-Zeitstempel wählen, Archiv aus
Combo-Box wählen (aus den tatsächlichen Snapshot-Dateien abgeleitet,
keine Handeingabe) + Zielverzeichnis wählen. Für Teil-Restores: "Katalog
laden" zeigt den Snapshot-Inhalt (
catalog dump) als Checkbox-Baum, einzelne Dateien/Ordner anhaken restored nur diese (plus optional ein manuelles Pattern zusätzlich zur Baumauswahl). Gruppen-/Snapshot-Auswahl setzt alle abhängigen Auswahlen (Snapshot/Archiv/Katalog) zurück, damit nie eine Auswahl von einer anderen Gruppe/Snapshot stehen bleibt. - Überschreibschutz beim Restore:
proxmox-backup-clientverweigert standardmäßig das Überschreiben (kein--overwrite/--overwrite-fileswird je gesetzt, verifiziert). Zusätzlich prüft die GUI, falls der Katalog geladen ist, schon vor dem Start, ob Zieldateien bereits existieren, und bricht mit klarer Meldung ab statt den CLI-Fehler mittendrin auflaufen zu lassen. - "Generiere Kommando": sowohl Backup-Set- als auch Restore-Panel können
das exakte
proxmox-backup-client-Kommando (inkl. Env-Var-Zuweisungen für Repository-Login/Verschlüsselung) anzeigen, ohne es auszuführen — zum manuellen Ausführen/Anpassen außerhalb der GUI. Eigener Dialog mit "In Zwischenablage kopieren"-Button statt einer schwer kopierbaren Standard-Messagebox. - Größenschätzung & Platzprüfung: Backup-Sets zeigen auf Knopfdruck eine geschätzte Größe (lokale Verzeichnisgröße abzüglich Excludes). Vor einem Restore wird die Snapshot-/Archivgröße mit dem freien Platz im Zielverzeichnis verglichen und bei zu wenig Platz gewarnt.
- Zertifikatsprüfung über die System-CA, kein Fingerprint-Feld mehr:
Zertifikate werden gegen den Zertifikatsspeicher des Systems geprüft, was
jede Erneuerung übersteht — ein gepinnter Fingerprint bricht bei Let's
Encrypt etwa alle 60 Tage, und zwar lautlos. Selbstsignierte Server gehen
weiterhin:
PBS_FINGERPRINTvor dem Start exportieren, der Wert wird durchgereicht. Einfingerprint-Eintrag in einer bestehenden Config wird ignoriert und verschwindet beim nächsten Speichern. Damit die Prüfung greift, setzt die GUI beim AufrufSSL_CERT_FILEauf den Zertifikatsspeicher des Systems — nötig, weil der statisch gelinkte Debian-Build vonproxmox-backup-clientsein OpenSSL-OPENSSLDIRfest auf/usr/lib/ssl/hat und dort auf keiner RPM-Distribution etwas findet (perstringsam Binary verifiziert). Ein selbst gesetztesSSL_CERT_FILE/SSL_CERT_DIRwird respektiert. "Generiere Kommando" gibt die Zuweisung mit aus, damit das kopierte Kommando außerhalb der GUI identisch funktioniert. - Verschlüsselung: Repositories können ein PBS-Encryption-Keyfile
hinterlegen (
--keyfile), nötig für die meisten echten Datastores (Standard-Crypt-Mode istencrypt). Falls das Keyfile nicht mit--kdf noneerstellt wurde, sondern passphrasegeschützt ist, kann zusätzlich eine Passphrase-Datei hinterlegt werden (→PBS_ENCRYPTION_PASSWORD, unabhängig vom Repository-Login-Passwort). - Fortschrittsanzeige: "Backup jetzt"-Button im Backup-Set-Panel sowie
Restore zeigen einen echten, byte-genauen Fortschrittsbalken samt
geschätzter Restlaufzeit —
proxmox-backup-clientselbst meldet keinen Fortschritt (siehepbsclient/tcpstats.gofür den dafür nötigen Mess-Trick, für Backup wie Restore einheitlich über TCP-Bytes statt lokaler Datei-I/O -- Details im Verifikations-Abschnitt unten). - UI: alle Buttons einheitlich blau; die drei "…laden"-Buttons im
Restore-Panel sind gleich breit (anhand des größten der drei
Qt-
SizeHint()-Werte, nicht geraten -- sonst wurde z.B. "Snapshots laden" abgeschnitten). - Mehrsprachig (Deutsch/Englisch): die komplette Oberfläche — Reiter,
Buttons, Feldnamen, Platzhalter, Dialoge, Fehlermeldungen — liegt in beiden
Sprachen vor. Umgeschaltet wird über die Auswahl rechts oben neben den
Reitern; die Wahl landet in der Config und gilt beim nächsten Start wieder.
Ohne gespeicherte Einstellung entscheidet die System-Locale
(
LANGUAGE/LC_ALL/LC_MESSAGES/LANG), Rückfallebene ist Englisch. Meldungen vonproxmox-backup-client, systemd und aus dem Debug-Log bleiben bewusst unübersetzt — sie sollen wortgleich zur CLI bleiben. - Hilfe-Tab: erklärt jeden Reiter samt aller Felder und Buttons (Repository-Syntax, Passwort-/Keyfile-Dateien, Exclude-Baum und Regex, OnCalendar-Ausdrücke inkl. Linger-Hinweis, Restore-Reihenfolge, warum der Fortschrittsbalken bei Teil-Restores trotzdem komplett durchläuft, Pfade von Config/Logfile/Units). Als HTML im Binary eingebettet, ebenfalls zweisprachig.
- Versions-Tab: zeigt Version und Git-Commit dieser GUI, die Go- und
Qt-Versionen, gegen die sie gebaut wurde, die Version des angesteuerten
proxmox-backup-client(zur Laufzeit abgefragt), die verwendeten Pfade (Config, Logfile) und die Release-Notes dieses Builds. Letztere sind ausCHANGELOG.mdeingebettet, gehören also garantiert zu genau diesem Binary. Die Version kommt beim RPM-Build per-ldflags -Xaus der Spec, sonst aus Gos VCS-Stempeln. - Debug-Tab: zeigt jeden
proxmox-backup-client-Aufruf live (exakte Kommandozeile + Ausgabe) — ein/ausschaltbar, zum Nachvollziehen/Lernen. Unabhängig davon wird jeder Aufruf immer zusätzlich in~/.config/proxmox-backup-client-gui/commands.logprotokolliert, auch von geplanten (systemd-Timer-)Backups, die komplett ohne laufende GUI ausgeführt werden -- so bleiben auch nächtliche Batch-Läufe nachvollziehbar.
🧩 Architektur
config/— persistiert Repositories/Backup-Sets/Zeitpläne als JSON unter~/.config/proxmox-backup-client-gui/config.json.proxmox-backup-clientselbst ist zustandslos; der gesamte GUI-Zustand lebt nur hier.pbsclient/— dünneros/exec-Wrapper, nutzt--output-format jsonfür maschinell auswertbare Ausgaben.cabundle.gofindet den System-Zertifikatsspeicher (Debian/RHEL/SUSE/Alpine-Pfade der Reihe nach) für die CA-Validierung ohne Fingerprint-Pin.schedule/— erzeugt/installiert systemd---user-Timer+Service-Units. Jede Unit protokolliert ihren eigenen Aufruf ins selbe Logfile wie der Debug-Tab (siehepbslog/).pbslog/— ein Format + Dateipfad für Aufruf-Protokolle, gemeinsam genutzt vom Debug-Tab (interaktiv) und den generierten systemd-Units (geplant).ui/— ein Panel pro Tab (repopanel.go,backupsetpanel.go,schedulepanel.go,restorepanel.go,debugpanel.go,helppanel.go) plusmainview.go(Tab-Widget, Sprachauswahl, Neuaufbau beim Sprachwechsel),excludetree.go(Checkbox-Baum mit Lazy-Loading fürs Backup-Set-Exclude),catalogtree.go(Checkbox-Baum auscatalog dumpfürs Restore-Panel) undtheme.go(voncontrolbox/qtguiübernommenes Theme).version/— Build-Informationen (-ldflags -X, sonst Gos VCS-Stempel) und der Markdown→HTML-Renderer für die Release-Notes. Bewusst ohne Markdown-Bibliothek: Qt versteht ohnehin nur eine HTML-Teilmenge, und es geht um eine Datei, die wir selbst schreiben.i18n/— Sprachkataloge als Go-Structs (de.go/en.go) plus die pergo:embedeingebetteten Hilfetexte (help/de.html,help/en.html). Bewusst ohne Qt-tr()/QTranslator: das bräuchte.ts/.qm-Dateien undlupdate/lreleaseim Build und im RPM, und miqt bietet gar kein Go-seitigestr(), daslupdateeinlesen könnte. Structs statt Maps, weil ein Feldtippfehler so ein Compile-Fehler ist; die Tests ini18n_test.goprüfen zusätzlich, dass keine Übersetzung fehlt und dass die%s/%d-Platzhalter jeder…Fmt-Meldung über alle Sprachen hinweg identisch bleiben.
🌍 Weitere Sprache ergänzen
i18n/xx.gonach dem Muster vonen.goanlegen (alle Felder ausfüllen).- In
i18n.godie neue Sprache inAvailable(),DisplayName(),Resolve()undSet()eintragen, indetect()das Locale-Präfix. i18n/help/xx.htmlanlegen und inhelp.gopergo:embedeinbinden.- In
i18n_test.godie Sprache incatalogsregistrieren —go test ./i18n/meldet dann jede vergessene Zeichenkette.
🔨 Build & Start
go build -o pbs-qtgui .
./pbs-qtgui --pbs-client proxmox-backup-client
📦 Fedora-RPM
git tag v1.0.1 && git push origin v1.0.1
./release-tarball.sh v1.0.1 # archiviert den Tag + vendort Go-Module nach ~/rpmbuild/SOURCES/
cp proxmox-backup-client-gui.spec ~/rpmbuild/SPECS/
rpmbuild -ba ~/rpmbuild/SPECS/proxmox-backup-client-gui.spec
sudo dnf install ~/rpmbuild/RPMS/x86_64/proxmox-backup-client-gui-*.rpm
Installiert pbs-qtgui + .desktop-Eintrag samt Icon (packaging/icons/,
GNOME/KDE-Schnellstartleiste-tauglich über hicolor-Icon-Theme in 48/128/
256px + SVG). Voraussetzung: proxmox-backup-client
selbst installiert (Requires: im Paket).
✅ Gegen echten Server verifiziert
list/snapshot list/backup/restore wurden gegen einen echten
PBS-4.2-Server mit realen VM-Backups getestet: voller Backup→Restore-Zyklus
byte-genau verifiziert, Group/Snapshot-JSON-Feldnamen an der echten API
abgeglichen, Überschreibschutz und Multi-Datei-Pattern-Restore bestätigt.
proxmox-backup-client liefert dabei kein Fortschrittssignal (kein
RUST_LOG, kein Pseudo-Terminal, kein task log hilft) -- die
Fortschrittsbalken messen deshalb echte TCP-Bytes statt Datei-I/O
(pbsclient/tcpstats.go). Ein paar handfeste, beim Testen gegen den echten
Server gefundene Bugs (Pointer-Identität in den Qt-Baum-Widgets, ein
Progress-Poller-Race, catalog dump-Ausgabe auf stderr statt stdout) sind
gefixt; Details dazu in der Git-Historie statt hier ausgeschrieben.
⚠️ Offene Punkte
archiveNameForleitet Archivnamen aus dem vollen Quellpfad ab, was bei tief verschachtelten Pfaden sehr lange, unhandliche Namen erzeugt (im Test gesehen). Sollte künftig eher vom Basisnamen ausgehen (mit Kollisionsauflösung bei mehreren gleichnamigen Quellverzeichnissen).- Kein Einzeldatei-Restore aus Image-Backups (
.img.fidx, z.B. VM-Disks): Restore funktioniert bisher nur für.pxar-Dateiarchive (catalog dump). Das offizielle Werkzeug dafür wäreproxmox-file-restore(separates Debian-Paketproxmox-backup-file-restore+proxmox-backup-restore-imagefürs Kernel/Initramfs der Restore-Sandbox-VM). Beide Pakete selbst wären unproblematisch nach Fedora zu repackagen (nur Standard-Libs). Der Haken:proxmox-backup-file-restoreempfiehlt zusätzlichpve-qemu-kvm— Proxmox' eigener gepatchter QEMU-Build (~417 MB) mit hartem Abhängigkeits-Rattenschwanz (ceph-common,librados2,librbd1,libproxmox-backup-qemu0u.a., ~20 Debian-trixie-spezifische Shared Libs). Das ist kein einfaches .deb-Repackaging mehr, sondern im Kern ein eigener QEMU-Fork-Build für Fedora. Bewusst zurückgestellt (Stand 2026-07-27) statt halbfertig umgesetzt. Root-Rechte wären fürproxmox-file-restoreohnehin zusätzlich nötig (KVM-Zugriff; laut Proxmox-Forum reichtsudodafür nicht, nur echtes root) — bei Umsetzung vermutlich perpkexecnur für die betroffenen Aufrufe, nicht die ganze GUI privilegiert.
📜 Lizenz
AGPL-3.0 — see LICENSE, analog zur Lizenz von proxmox-backup-client selbst (Proxmox Backup ist AGPL-3.0-only).