No description
  • Go 89.9%
  • HTML 9.8%
  • Shell 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
HWE70 40111e73c2 Version 1.2.0
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 18:12:32 +02:00
cmd/pbs-container-helper Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
config Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
container Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
containerhelper Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
i18n Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
packaging Mehrsprachige Oberfläche (DE/EN) plus Hilfe-Tab 2026-08-30 08:53:28 +02:00
pbsclient Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
pbslog Catalog-Dump-Restore-Auswahl, "Generiere Kommando"-Buttons, sofortige Debug-Ausgabe 2026-07-27 15:55:25 +02:00
schedule Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
ui Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
version Versions-Tab, und den Fingerprint aus der Config entfernen 2026-08-30 14:21:01 +02:00
.gitignore Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
CHANGELOG.md Version 1.2.0 2026-09-14 18:12:32 +02:00
go.mod Qt6-GUI-Grundgerüst für proxmox-backup-client (Repos, Backup-Sets, Zeitpläne, Restore) 2026-07-27 13:59:15 +02:00
go.sum Qt6-GUI-Grundgerüst für proxmox-backup-client (Repos, Backup-Sets, Zeitpläne, Restore) 2026-07-27 13:59:15 +02:00
LICENSE Lizenz dokumentieren (AGPL-3.0, analog zu Proxmox Backup selbst) 2026-07-27 15:27:43 +02:00
main.go Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
proxmox-backup-client-gui.spec Version 1.2.0 2026-09-14 18:12:32 +02:00
README.md Container-Backup/-Restore mit Zeitplaenen; Backup-Set-Loeschen entfernt Timer (#1) 2026-09-14 16:05:49 +00:00
release-tarball.sh RPM-Packaging für die GUI: Spec, Source-Tarball-Skript, Desktop-Eintrag+Icon 2026-07-27 19:00:05 +02:00

🖥️ proxmox-backup-client-gui

AI-assisted

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-client selbst 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-client und dem statischen pbs-container-helper. Dateien ab 1 GiB (VM-Disks wie WinBoats data.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 ruft pbs-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-client verweigert standardmäßig das Überschreiben (kein --overwrite/--overwrite-files wird 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_FINGERPRINT vor dem Start exportieren, der Wert wird durchgereicht. Ein fingerprint-Eintrag in einer bestehenden Config wird ignoriert und verschwindet beim nächsten Speichern. Damit die Prüfung greift, setzt die GUI beim Aufruf SSL_CERT_FILE auf den Zertifikatsspeicher des Systems — nötig, weil der statisch gelinkte Debian-Build von proxmox-backup-client sein OpenSSL-OPENSSLDIR fest auf /usr/lib/ssl/ hat und dort auf keiner RPM-Distribution etwas findet (per strings am Binary verifiziert). Ein selbst gesetztes SSL_CERT_FILE/SSL_CERT_DIR wird 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 ist encrypt). Falls das Keyfile nicht mit --kdf none erstellt 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-client selbst meldet keinen Fortschritt (siehe pbsclient/tcpstats.go fü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 von proxmox-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 aus CHANGELOG.md eingebettet, gehören also garantiert zu genau diesem Binary. Die Version kommt beim RPM-Build per -ldflags -X aus 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.log protokolliert, 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-client selbst ist zustandslos; der gesamte GUI-Zustand lebt nur hier.
  • pbsclient/ — dünner os/exec-Wrapper, nutzt --output-format json für maschinell auswertbare Ausgaben. cabundle.go findet 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 (siehe pbslog/).
  • 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) plus mainview.go (Tab-Widget, Sprachauswahl, Neuaufbau beim Sprachwechsel), excludetree.go (Checkbox-Baum mit Lazy-Loading fürs Backup-Set-Exclude), catalogtree.go (Checkbox-Baum aus catalog dump fürs Restore-Panel) und theme.go (von controlbox/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 per go:embed eingebetteten Hilfetexte (help/de.html, help/en.html). Bewusst ohne Qt-tr()/QTranslator: das bräuchte .ts/.qm-Dateien und lupdate/lrelease im Build und im RPM, und miqt bietet gar kein Go-seitiges tr(), das lupdate einlesen könnte. Structs statt Maps, weil ein Feldtippfehler so ein Compile-Fehler ist; die Tests in i18n_test.go prü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

  1. i18n/xx.go nach dem Muster von en.go anlegen (alle Felder ausfüllen).
  2. In i18n.go die neue Sprache in Available(), DisplayName(), Resolve() und Set() eintragen, in detect() das Locale-Präfix.
  3. i18n/help/xx.html anlegen und in help.go per go:embed einbinden.
  4. In i18n_test.go die Sprache in catalogs registrieren — 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

  • archiveNameFor leitet 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äre proxmox-file-restore (separates Debian-Paket proxmox-backup-file-restore + proxmox-backup-restore-image fü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-restore empfiehlt zusätzlich pve-qemu-kvm — Proxmox' eigener gepatchter QEMU-Build (~417 MB) mit hartem Abhängigkeits-Rattenschwanz (ceph-common, librados2, librbd1, libproxmox-backup-qemu0 u.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ür proxmox-file-restore ohnehin zusätzlich nötig (KVM-Zugriff; laut Proxmox-Forum reicht sudo dafür nicht, nur echtes root) — bei Umsetzung vermutlich per pkexec nur 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).