Release v1.1.5 #19

Merged
AxonByteDev merged 18 commits from beta into main 2026-09-26 08:01:42 +00:00
Owner
  • feat: Menüpunkt "Snapshots" — alle Snapshots aller Server, per Masse löschen (#15)
  • test: Snapshot-Gesamtliste nur mit den eigenen Servern prüfen (#15)
  • feat: Snapshots aller Server abrufen und serverübergreifend löschen — Backend (#15)
  • docs: Server-Neustart aus PatchPilot dokumentieren
  • feat: Button "Neu starten" in der Updateliste, wenn ein Neustart nötig ist
  • feat: Server aus PatchPilot neu starten, "Neustart nötig" für alle Debian/Ubuntu-Server
  • fix: Untermenü der Einstellungen passt immer, ohne Scrollbalken
  • docs: Wiki ins Repository unter docs/ verschoben und auf den aktuellen Stand gebracht
  • feat: Oberfläche für Backup & Wiederherstellung unter Einstellungen (#17)
  • feat: Einstellungen in Kategorien mit Untermenü und eigener Adresse (#17)
  • feat: Backup & Wiederherstellung im Backend — verschlüsselt, mit SSH-Schlüsseln (#17)
  • feat: Proxmox-Hosts in Dashboard, Updateliste, Server-Formular und Einstellungen (#13)
  • feat: Scan und Update für Proxmox-Hosts — dist-upgrade, kein Snapshot, Repo-Fehler, Neustart-Hinweis (#13)
  • fix: Nodes-Abgleich nach dem Speichern im Hintergrund, Speichern blockiert nicht mehr (#13)
  • feat: Proxmox-Nodes automatisch als Server vom Typ "Proxmox-Host" übernehmen (#13)
  • refactor: SSH-Verbindung zentral in ssh_utils, Anmeldung mit Proxmox-Zugangsdaten (#13)
  • fix: publish.sh bricht bei leeren Releases und vergessenen Branches ab
  • feat: Selbst-Update im Docker-Betrieb per Klick aus der Weboberfläche (#16)
- feat: Menüpunkt "Snapshots" — alle Snapshots aller Server, per Masse löschen (#15) - test: Snapshot-Gesamtliste nur mit den eigenen Servern prüfen (#15) - feat: Snapshots aller Server abrufen und serverübergreifend löschen — Backend (#15) - docs: Server-Neustart aus PatchPilot dokumentieren - feat: Button "Neu starten" in der Updateliste, wenn ein Neustart nötig ist - feat: Server aus PatchPilot neu starten, "Neustart nötig" für alle Debian/Ubuntu-Server - fix: Untermenü der Einstellungen passt immer, ohne Scrollbalken - docs: Wiki ins Repository unter docs/ verschoben und auf den aktuellen Stand gebracht - feat: Oberfläche für Backup & Wiederherstellung unter Einstellungen (#17) - feat: Einstellungen in Kategorien mit Untermenü und eigener Adresse (#17) - feat: Backup & Wiederherstellung im Backend — verschlüsselt, mit SSH-Schlüsseln (#17) - feat: Proxmox-Hosts in Dashboard, Updateliste, Server-Formular und Einstellungen (#13) - feat: Scan und Update für Proxmox-Hosts — dist-upgrade, kein Snapshot, Repo-Fehler, Neustart-Hinweis (#13) - fix: Nodes-Abgleich nach dem Speichern im Hintergrund, Speichern blockiert nicht mehr (#13) - feat: Proxmox-Nodes automatisch als Server vom Typ "Proxmox-Host" übernehmen (#13) - refactor: SSH-Verbindung zentral in ssh_utils, Anmeldung mit Proxmox-Zugangsdaten (#13) - fix: publish.sh bricht bei leeren Releases und vergessenen Branches ab - feat: Selbst-Update im Docker-Betrieb per Klick aus der Weboberfläche (#16)
Bisher zeigte "Jetzt aktualisieren" bei Docker nur einen Befehl zum Kopieren an. Jetzt stößt
der Klick das Update direkt an, auf Debian und Ubuntu, nach dem Vorbild von FilaDex. Der
Container bekommt weiterhin keinen Zugriff auf den Docker-Socket.

Ablauf:
- PatchPilot sichert die SQLite-Datenbank nach data/backups/ (die letzten 5 bleiben) und legt
  data/update.request mit dem Ziel-Tag ab
- patchpilot-updater.path (systemd) startet scripts/apply-update.sh als Benutzer patchpilot.
  Das Skript akzeptiert nur Tags, die als veröffentlichter Release auf Forgejo stehen, baut
  neu und springt bei einem Fehler auf den vorherigen Stand zurück
- Live-Protokoll per SSE (/api/system/update/log); nach dem Neustart des Containers meldet
  sich die Oberfläche mit dem Ergebnis (update.result) zurück und lädt neu
- Eine Anforderung, die über 10 Minuten niemand aufgreift, sperrt weitere Updates nicht
- Automatisches Update nach Zeitplan geht jetzt auch bei Docker

Einrichtung:
- scripts/install-updater.sh (einmalig als root, darf mehrfach laufen): trägt
  PATCHPILOT_UID/GID in die .env ein, übergibt data/ dem Dienstbenutzer, richtet die
  systemd-Units ein und erstellt den Container mit derselben UID neu
- Ohne Einrichtung bleibt es beim bisherigen Verhalten (Befehl zum Kopieren, jetzt mit
  Hinweis auf die Einrichtung)

Sonstiges:
- Der Schalter "update_auto_apply" wird bei Docker einmalig zurückgesetzt. Bisher hieß er
  dort "Benachrichtigung aktivieren", und niemand soll ungefragt automatische Updates bekommen
- Manueller Befehl: APP_VERSION ohne führendes "v", Anführungszeichen korrekt verschachtelt
- Protokollzeiten in UTC auf beiden Seiten, die Oberfläche zeigt Ortszeit

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
v1.1.5-beta.1 bis .4 wurden ohne jede Änderung veröffentlicht: Die Arbeit für #16 lag auf
einem Feature-Branch, publish.sh veröffentlicht aber immer "beta" und meldete das nur
unauffällig als "Keine Änderungen erfasst".

- ensure_no_stray_branches: Abbruch, wenn ein anderer Branch als beta/main (lokal oder auf
  Forgejo) Commits enthält, die nicht in beta sind — mit Liste der Commits und Anleitung
- ensure_new_commits: Abbruch, wenn beta seit dem letzten Tag keinen neuen Commit hat
- Es wird nur noch mit beta und main gearbeitet: Der Hinweis, Änderungen auf einem
  feat/-Branch zu committen, entfällt

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Der SSH-Verbindungsaufbau stand dreimal kopiert in updates.py, scripts.py und servers.py
(Verbindungstest). Er liegt jetzt in backend/ssh_utils.py.

Neu ist die Anmeldeart auth_method="proxmox" für Proxmox-Hosts: Sie nutzt die Zugangsdaten
des Eintrags unter Einstellungen → Proxmox (root@pam -> SSH als root mit demselben Passwort).
Die Daten werden bei jeder Verbindung frisch gelesen statt kopiert, eine Passwortänderung gilt
also sofort. Andere Realms als @pam werden mit einer verständlichen Meldung abgelehnt.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Jeder Node eines Eintrags unter Einstellungen → Proxmox wird ein Server mit type="proxmox"
und auth_method="proxmox" (meldet sich mit den Proxmox-Zugangsdaten an), ohne Snapshot und
mit os_type "debian". Damit laufen Scans, Updates, Verlauf und Benachrichtigungen über die
bestehenden Wege, ohne Schemaänderung.

- Abgleich beim Speichern eines Proxmox-Eintrags, vor jedem Scan (manuell und Zeitplan),
  einmal beim Start und per POST /api/proxmox/{id}/sync-nodes ("Nodes übernehmen")
- Adresse: /cluster/status liefert die Node-IPs; für einen Einzel-Node und den Node, an dem
  PatchPilot angemeldet ist, gilt die Adresse aus den Einstellungen
- Bestehende Hosts werden nie überschrieben (Name/Adresse lassen sich am Server ändern),
  verschwundene Nodes nicht gelöscht
- Ist der Proxmox nicht erreichbar, scheitert weder das Speichern noch der Scan
- Beim Löschen eines Proxmox-Eintrags verschwinden seine Hosts samt Scans und Läufen

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Ein nicht erreichbarer Proxmox hielt "Speichern" unter Einstellungen → Proxmox bis zum
Verbindungs-Timeout (10 s und mehr) fest. Der Abgleich läuft jetzt in einem eigenen Thread;
die Hosts erscheinen wenige Sekunden später.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Update: auf Proxmox-Hosts "apt-get dist-upgrade" statt "upgrade", wie Proxmox es vorgibt
  (neue Kernel- und Abhängigkeitspakete). Der Scan simuliert dieselbe Auswahl, die Anzahl
  passt also zum späteren Update
- Snapshot: wird für Proxmox-Hosts nie versucht, im Log steht warum. Der Server-Router
  erzwingt create_snapshot=False und keine VMID; die Anmeldeart "proxmox" gibt es nur für
  Proxmox-Hosts
- Repo-Fehler: "E:"-Zeilen aus apt-get update machen den Scan eines Proxmox-Hosts zum
  Fehler, mit Hinweis auf das Enterprise-Repository ohne Subscription (401) und
  pve-no-subscription. Für normale Server bleibt es beim bisherigen Verhalten
- Neustart: laufender Kernel älter als der neueste unter /boot (Debian legt kein
  /var/run/reboot-required an) -> UpdateScan.reboot_required, Hinweis im Update-Log
- Scan-Logik für normalen Scan und Abschluss-Scan in _collect_scan() zusammengeführt

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Updateliste: Badge "Proxmox-Host", Badge "Neustart nötig" (reboot_required), die
  Fehlermeldung eines Scans steht jetzt unter dem Eintrag (vorher nur "Fehler" ohne Grund —
  wichtig für den Hinweis auf das Enterprise-Repository). Bestätigung beim Update nennt
  dist-upgrade und dass kein Snapshot möglich ist
- Dashboard: lesbarer Server-Typ, Badge "Neustart nötig", Fehlermeldung als Tooltip
- Server-Formular: Typ "Proxmox-Host" mit Anmeldung "Zugangsdaten aus Einstellungen →
  Proxmox"; VM-ID und Snapshot-Option entfallen für Hosts
- Einstellungen → Proxmox: Button "Nodes übernehmen" mit Ergebnis, Serverliste wird nach
  dem Speichern/Löschen neu geladen
- Snapshot-Regel (wouldCreateSnapshot) an einer Stelle in lib/serverType.ts statt doppelt in
  Updates.tsx und Scripts.tsx; SnapshotBadge schließt Proxmox-Hosts ausdrücklich aus

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Neues Modul backend/backup.py und Router /api/backup:
- GET  /check    SSH-Schlüssel, die im Backup fehlen würden (nicht lesbar)
- POST /export   verschlüsseltes Backup als Download (.ppbackup)
- POST /inspect  Vorschau (Version, Anzahl Server/Scripts/…, fehlende Schlüssel), ändert nichts
- POST /restore  ersetzt alle Daten, danach Neustart wie beim Selbst-Update

Inhalt: konsistente Kopie der SQLite-DB (Backup-API, WAL-sicher), alle Schlüsseldateien, auf
die ein ssh_key_path zeigt, und ein Manifest. Der Verlauf (Scans, Update- und Script-Läufe) ist
optional; update_cache wird nie mitgenommen.

Sicherheit:
- Pflicht-Passwort (mind. 8 Zeichen), AES-256-GCM mit scrypt-Schlüssel. GCM erkennt ein
  falsches Passwort und jede Manipulation, bevor etwas entpackt wird
- Die ZIP darf nur manifest.json, database.db und ssh-keys/<name> enthalten — jeder andere
  Eintrag (../, absolute Pfade) führt zur Ablehnung, bevor etwas geschrieben wird
- Upload ohne multipart (keine neue Abhängigkeit): Datei als Body, Passwort Base64 im Header

Wiederherstellung: Backups neuerer Versionen werden abgelehnt, ältere eingespielt und beim
Neustart migriert. Vorher Sicherungskopie des aktuellen Stands nach data/backups/.
SSH-Schlüssel landen unter data/ssh-keys/ (Rechte 600), ssh_key_path wird umgeschrieben.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Settings.tsx war eine einzige Seite mit rund 1100 Zeilen. Jetzt gibt es ein Untermenü
(Desktop links, schmale Fenster als waagerechte Reiter) und eine Datei pro Kategorie unter
pages/settings/:

  /settings/general        Allgemein (automatischer Scan, Verlauf)
  /settings/proxmox        Proxmox-Server und Nodes
  /settings/notifications  Matrix-Benachrichtigungen
  /settings/security       Zugangsdaten
  /settings/update         PatchPilot-Update

Der Inhalt der Kategorien ist unverändert verschoben; Formular-Hilfen liegen in shared.ts
und CronPicker.tsx. /settings leitet auf /settings/general, die Sidebar-Meldung "Update
verfügbar" führt direkt nach /settings/update.

Beim Testen gefunden und behoben (beides React Router 7 in einer /settings/*-Route):
- relative Links hätten von einer Unterseite aus nach /settings/security/security geführt
- die Auffangroute für unbekannte Adressen hätte endlos weitergeleitet und die Seite
  eingefroren
Deshalb durchgehend absolute Ziele. Render-Tests für alle Kategorien in Settings.test.tsx.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Neue Kategorie /settings/backup:
- Backup erstellen: Passwort (zweimal, mind. 8 Zeichen), Verlauf optional, Download als
  .ppbackup. Fehlende oder unlesbare SSH-Schlüssel werden vorab deutlich angezeigt (Server,
  Pfad, Grund) — nicht erst, wenn man das Backup braucht
- Wiederherstellen: Datei + Passwort -> "Backup prüfen" zeigt Version, Datum, Anzahl Server,
  Proxmox-Zugänge, Scripts, Zeitpläne, Dokumentationen, SSH-Schlüssel und ob der Verlauf dabei
  ist, dazu Warnungen. Ein Backup einer neueren Version lässt sich nicht einspielen
- Bestätigung per Häkchen mit dem Hinweis, dass danach Benutzername und Passwort aus dem
  Backup gelten; danach wartet die Seite auf den Neustart und leitet zur Anmeldung

backupApi im Client: Upload als Rohdaten, Passwort Base64 im Header (Umlaute).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Die Anleitungen lagen im separaten Forgejo-Wiki und sind dort hinter dem Code
zurückgeblieben. Sie liegen jetzt in docs/ — Code und Doku ändern sich im selben Commit, und die
Anleitung passt immer zur ausgecheckten Version. docs/README.md ist die Startseite.

Neu:
- Proxmox-Hosts.md: Snapshots vor Updates, Proxmox-Hosts automatisch übernehmen, SSH-Anmeldung
  mit den Proxmox-Zugangsdaten (inkl. AllowGroups-Falle), dist-upgrade, Enterprise-Repo,
  Neustart-Hinweis
- Backup-Wiederherstellung.md: Backup erstellen, Vorschau, Wiederherstellen, Umzug

Aktualisiert:
- Installation: Node 22 LTS, APP_VERSION beim Start, Update per Klick einrichten (Schritt 7),
  Einstellungen → Sicherheit, Verweise auf Proxmox und Backup
- Selbst-Update: Update per Klick im Docker-Betrieb (Host-Watcher), Fehlersuche, neue Namen
  der Einstellungen
- Matrix: !update entfernt, Ereignisse einzeln schaltbar, Einstellungen → Benachrichtigungen
- Entwicklung: Projektstruktur, Modelle, alle API-Endpunkte, ssh_utils, Host-Watcher,
  Zeitzonen, Release-Ablauf mit beta/release-pr/release-tag und nur zwei Branches, Backups

README und alle Verweise im Code (.env.example, Oberfläche, Backend-Meldung,
install-updater.sh) zeigen jetzt auf docs/ statt aufs Wiki.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Das Menü hatte eine feste Breite von 208 px; "Backup & Wiederherstellung" passte nicht hinein
und erzeugte einen waagerechten Scrollbalken. Jetzt wird es so breit wie sein längster Eintrag
und steht erst ab 1024 px links neben dem Inhalt (vorher ab 768 px, dort bliebe dem Inhalt zu
wenig Platz). In schmalen Fenstern brechen die Reiter in eine zweite Zeile um, statt seitlich
zu scrollen.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Backend für den Neustart per Klick (backend/reboot.py, POST/GET /api/servers/{id}/reboot):
- vorher prüfen: kein laufendes Update/Script auf dem Server, SSH-Benutzer ist root
- Neustart losgelöst anstoßen (systemd-run-Timer, Rückfall nohup/shutdown), damit der
  SSH-Befehl noch zurückkommt
- erst "wieder da", wenn der Server per SSH antwortet UND eine neue Boot-ID hat — ein nur
  kurz nicht erreichbarer Server oder ein ignorierter Befehl zählt nicht als Neustart
  (Zeitlimit 15 Minuten)
- danach neu scannen, damit "Neustart nötig" verschwindet
- Matrix: "wird neu gestartet", "wieder erreichbar", "nicht wieder erreichbar" — eigener
  Schalter notify_reboot

"Neustart nötig" (UpdateScan.reboot_required) wird jetzt für alle Debian/Ubuntu-Server
ermittelt, nicht nur für Proxmox-Hosts: /var/run/reboot-required (Ubuntu) oder laufender
Kernel älter als der neueste unter /boot (Debian). LXC-Container haben kein eigenes /boot,
dort zählt nur die Datei.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Bei "Neustart nötig" erscheint neben "Scannen" der Button "Neu starten". Nach der Bestätigung
  zeigt die Zeile den Fortschritt (startet neu / wieder erreichbar / Fehler mit Grund); danach
  werden die Scans neu geladen und das Badge verschwindet
- Bei Proxmox-Hosts warnt die Bestätigung, dass alle VMs und Container auf dem Host betroffen
  sind und PatchPilot selbst nicht erreichbar ist, falls es dort läuft
- Kein Button während eines laufenden Updates; Ablehnungen des Backends (z.B. laufendes
  Script, Benutzer nicht root) erscheinen als Fehlermeldung
- Einstellungen → Benachrichtigungen: neuer Schalter "Server-Neustart"
- Tooltips von "Neustart nötig" in Updateliste und Dashboard angepasst

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Neue Seite docs/Neustart.md: wann "Neustart nötig" erscheint (Ubuntu-Datei, Debian-Kernel,
LXC), Ablauf des Neustarts per Klick, Besonderheiten bei Proxmox-Hosts, Fehlersuche.
Verweise aus README, docs/README.md, Proxmox-Hosts und Matrix (neues Ereignis); in der
Entwicklerdoku reboot.py, RebootControl, Endpunkte, reboot_required für alle Server und
notify_reboot ergänzt.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- GET /api/snapshots: Snapshots aller VMs/LXCs mit Proxmox-Zuordnung in einer Liste, mit
  Markierung für PatchPilot-Snapshots (pre-run-…). Anmeldung einmal pro Proxmox-Zugang, die
  Server werden parallel abgefragt (reiner HTTP-Abruf ohne DB-Zugriff in den Threads). Ein
  nicht erreichbarer Proxmox oder Server landet als Hinweis in "errors", die übrigen werden
  trotzdem angezeigt
- POST /api/snapshots/delete, GET …/{batch_id}, POST …/{batch_id}/cancel: serverübergreifende
  Löschung, strikt nacheinander, abbrechbar nach dem aktuellen Snapshot
- backend/snapshot_batches.py: gemeinsame Lösch-Logik — der Snapshot-Dialog eines einzelnen
  Servers nutzt sie jetzt ebenfalls. Ein Fehler bei einem Snapshot stoppt den Rest nicht

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
In der vollen Testsuite liegen in derselben Test-DB weitere Server mit Proxmox-Zuordnung aus
anderen Tests — der Test betrachtet jetzt nur die Server, die er selbst anlegt.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Neue Seite /snapshots mit allen Snapshots aller VMs und Container, gruppiert nach Server:
- Suche, Filter nach Server, Sortierung nach Alter (älteste zuerst ist Standard)
- PatchPilot-Snapshots (pre-run-…) markiert, Filter "Nur PatchPilot-Snapshots"
- Schnellauswahl "Älter als … Tage", Auswahl pro Server und aller sichtbaren
- Auswahl über Server hinweg mit Zähler "X Snapshots auf Y Servern"
- Bestätigung listet alles nach Server auf und warnt vor von Hand angelegten Snapshots
- Löschen nacheinander mit Fortschrittsbalken, aktuellem Snapshot und Ergebnis pro Zeile;
  "Abbrechen" hält nach dem laufenden Snapshot an
- nicht erreichbare Proxmox-Zugänge/Server erscheinen als Hinweis, die übrigen trotzdem

Doku: Proxmox-Hosts.md (Snapshots verwalten und aufräumen), Entwicklung.md, README.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
AxonByteDev/PatchPilot!19
No description provided.