feat(cluster): Rolling Update — Secondary-first upgrade orchestration (v1.2.3)
POST /cluster/rolling-update startet den gestaffelten Upgrade-Prozess: 1. Secondary via mTLS /agent/cluster/trigger-update anstoßen 2. /agent/cluster/version pollen bis Secondary Version-Flip zeigt (max 10 min) 3. Primary self-upgrade via systemd-run (identisch zu /system/upgrade) State wird in /var/lib/edgeguard/rolling-update-state.json persistiert: Phasen: updating-secondary → waiting-secondary → updating-primary. "done" wird nicht geschrieben — Prozess stirbt beim Upgrade. UI erkennt Abschluss via /system/health version-flip (analog Single-Node-Upgrade). UI: UpdateBanner erkennt Cluster-Modus (/cluster/status mode="cluster") und tauscht den "Install now"-Button gegen "Rolling Update (Cluster)" aus. Multi-Step-Modal zeigt die drei Phasen; ab updating-primary wechselt der Client auf /system/health polling. Aggregator.PostPeer: neuer einzel-POST-Helper für mTLS-trigger-update. WithVersion(): ClusterHandler bekommt Binary-Version für /agent/cluster/version. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -629,6 +629,7 @@
|
||||
"node": "Knoten",
|
||||
"status": "Status",
|
||||
"role": "Rolle",
|
||||
"pgRole": "PG-Rolle",
|
||||
"apiUrl": "API-URL",
|
||||
"configHash": "Config-Hash",
|
||||
"version": "Version",
|
||||
@@ -641,6 +642,30 @@
|
||||
"uptime": "Uptime",
|
||||
"fetchMs": "Fetch"
|
||||
},
|
||||
"pgRole": {
|
||||
"standalone": "standalone",
|
||||
"primary": "primary",
|
||||
"standby": "standby"
|
||||
},
|
||||
"vipCard": {
|
||||
"title": "Hochverfügbarkeit (VIP / Keepalived)",
|
||||
"vipAddress": "VIP-Adresse",
|
||||
"vipAddressHelp": "Virtuelle IP-Adresse die zwischen Nodes wandert (z.B. 89.163.205.10)",
|
||||
"vipInterface": "Netzwerk-Interface",
|
||||
"vipInterfaceHelp": "Interface auf dem die VIP gebunden wird (z.B. eth0)",
|
||||
"vipAuthPass": "VRRP Auth-Passwort",
|
||||
"vipAuthPassHelp": "Max. 8 Zeichen — Keepalived-Limit. Gleich auf allen Nodes.",
|
||||
"vrrpRouterId": "VRRP Router-ID",
|
||||
"vrrpRouterIdHelp": "Muss im Subnetz eindeutig sein (1–255). Standard: 51.",
|
||||
"saveBtn": "Speichern & Keepalived neu konfigurieren",
|
||||
"saved": "VIP-Einstellungen gespeichert",
|
||||
"saveFailed": "Speichern fehlgeschlagen",
|
||||
"hintTitle": "Nächste Schritte nach dem Speichern",
|
||||
"hintPrimary": "Auf dem Primary: edgeguard-ctl cluster-init-replication",
|
||||
"hintStandby": "Auf dem Secondary: edgeguard-ctl cluster-setup-standby <primary-ip>",
|
||||
"hintKeepalived": "Keepalived auf beiden Nodes: sudo systemctl enable --now keepalived",
|
||||
"hintFailover": "Bei Failover: edgeguard-ctl promote (auf dem Secondary)"
|
||||
},
|
||||
"loadTitle": "Per-Node Resources (mTLS-Aggregator)",
|
||||
"loadEmpty": "Keine Node-Resources verfügbar — Agent-Listener nicht erreichbar?",
|
||||
"certCardTitle": "Cluster-TLS-Zertifikate",
|
||||
@@ -841,7 +866,14 @@
|
||||
"stepDownload": "Pakete laden",
|
||||
"stepInstall": "Installation",
|
||||
"stepRestart": "Service-Restart",
|
||||
"stepVerify": "Verifizierung"
|
||||
"stepVerify": "Verifizierung",
|
||||
"rollingUpdate": "Rolling Update (Cluster)",
|
||||
"rollingConfirmTitle": "Rolling Update starten?",
|
||||
"rollingConfirmDesc": "Der Secondary-Node ({{secondary}}) wird zuerst aktualisiert, danach dieser Primary. Kein Ausfall für den Proxied-Traffic während der Secondary-Phase.",
|
||||
"rollingRunning": "Rolling Update läuft…",
|
||||
"rollingStepSecondary": "Secondary aktualisieren ({{fqdn}})",
|
||||
"rollingStepWaiting": "Warte auf Neustart des Secondary",
|
||||
"rollingStepPrimary": "Primary aktualisieren (dieser Node)"
|
||||
},
|
||||
"wg": {
|
||||
"title": "WireGuard",
|
||||
|
||||
Reference in New Issue
Block a user