From 4856779db897ffa633cbb4d426b97b1eac5c9bc6 Mon Sep 17 00:00:00 2001 From: Debian Date: Fri, 31 Jul 2026 17:44:23 +0200 Subject: [PATCH] =?UTF-8?q?fix(ui):=20Standby-Node=20zeigt=20keinen=20"all?= =?UTF-8?q?e=20Backends=20down"-Fehlalarm=20mehr=20=E2=80=94=20v1.3.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Dashboard-Down-Backends-Alarm liest die LIVE-HAProxy-Stats des lokalen Nodes. Auf dem keepalived-BACKUP-Node erreicht die lokale HAProxy die Backend- Subnetze nicht (VLAN-Gateway-VIPs liegen beim Master) → alle Backends L4-down. v1.3.7 stoppte nur den alert_events-Spam (scheduler), nicht die Anzeige. Jetzt: ist der Node BACKUP (vip_status.vrrp_state), wird der rote "N Backends down"-Alarm durch einen ruhigen Info-Hinweis ersetzt ("Standby-Node — Backend- Health lokal nicht aussagekräftig, Master bedient den Traffic"). Auf MASTER/ UNKNOWN bleibt der echte Alarm. Co-Authored-By: Claude Opus 4.8 --- VERSION | 2 +- management-ui/src/i18n/locales/de/common.json | 2 ++ management-ui/src/i18n/locales/en/common.json | 2 ++ management-ui/src/pages/Dashboard/index.tsx | 16 +++++++++++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 8ed486a..06c7347 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.7 \ No newline at end of file +1.3.8 \ No newline at end of file diff --git a/management-ui/src/i18n/locales/de/common.json b/management-ui/src/i18n/locales/de/common.json index 711ac3f..eeffc42 100644 --- a/management-ui/src/i18n/locales/de/common.json +++ b/management-ui/src/i18n/locales/de/common.json @@ -454,6 +454,8 @@ "summaryCritical": "{{critical}} kritisch" }, "downBackendsAlert": "{{count}} Backend(s) komplett ausgefallen — kein Server UP", + "backupNodeBackends": "Standby-Node — Backend-Health lokal nicht aussagekräftig", + "backupNodeBackendsDesc": "Dieser Node ist gerade keepalived-BACKUP und hält die VLAN-Gateway-VIPs nicht, kann die Backend-Subnetze also nicht erreichen — die lokalen Health-Checks laufen deshalb alle auf Timeout. Kein Ausfall: der Master-Node bedient den Traffic. Nach einem Failover (VIP übernimmt dieser Node) werden die Backends hier UP.", "maintenanceAlert": "{{count}} Domain(s) im Wartungs-Modus", "onboardingTitle": "Willkommen bei EdgeGuard", "onboardingIntro": "Frische Box — hier die nächsten Schritte um Customer-Traffic zu routen:", diff --git a/management-ui/src/i18n/locales/en/common.json b/management-ui/src/i18n/locales/en/common.json index 4fc9a15..3827e1f 100644 --- a/management-ui/src/i18n/locales/en/common.json +++ b/management-ui/src/i18n/locales/en/common.json @@ -454,6 +454,8 @@ "summaryCritical": "{{critical}} critical" }, "downBackendsAlert": "{{count}} backend(s) completely down — no server UP", + "backupNodeBackends": "Standby node — local backend health is not meaningful", + "backupNodeBackendsDesc": "This node is currently the keepalived BACKUP and does not hold the VLAN gateway VIPs, so it cannot reach the backend subnets — local health checks all time out. This is not an outage: the master node serves the traffic. After a failover (this node takes over the VIP), the backends will show UP here.", "maintenanceAlert": "{{count}} domain(s) in maintenance mode", "onboardingTitle": "Welcome to EdgeGuard", "onboardingIntro": "Fresh box — here are the next steps to route customer traffic:", diff --git a/management-ui/src/pages/Dashboard/index.tsx b/management-ui/src/pages/Dashboard/index.tsx index 7bfa2a8..ea88823 100644 --- a/management-ui/src/pages/Dashboard/index.tsx +++ b/management-ui/src/pages/Dashboard/index.tsx @@ -303,6 +303,13 @@ export default function DashboardPage() { return down })() + // Auf dem keepalived-BACKUP-Node erreicht die lokale HAProxy die Backend- + // Subnetze nicht (die VLAN-Gateway-VIPs liegen beim Master) → sie sieht + // ALLE Backends als down. Das ist strukturell erwartet, kein Ausfall: + // der Master bedient den Traffic. Deshalb den roten Down-Alarm auf dem + // Standby durch einen ruhigen Hinweis ersetzen. + const isBackup = vipStatus.data?.vrrp_state === 'BACKUP' + const alerts = recentAlerts.data ?? [] const nCritical = alerts.filter(e => e.severity === 'critical' || e.severity === 'error').length const nWarning = alerts.filter(e => e.severity === 'warning').length @@ -366,13 +373,20 @@ export default function DashboardPage() { )} {/* ─ Operational alerts ─────────────────────────────── */} - {downBackends.length > 0 && ( + {downBackends.length > 0 && !isBackup && ( {downBackends.map(n => {n})}} /> )} + {downBackends.length > 0 && isBackup && ( + + )} {maintenanceDomains.length > 0 && (