diff --git a/management-ui/src/i18n/locales/de/common.json b/management-ui/src/i18n/locales/de/common.json
index 25af81c..76db7a5 100644
--- a/management-ui/src/i18n/locales/de/common.json
+++ b/management-ui/src/i18n/locales/de/common.json
@@ -416,7 +416,10 @@
"ok": "OK",
"degraded": "degraded",
"split-brain": "split-brain"
- }
+ },
+ "roleDbPrimary": "DB-Primary",
+ "rolePeer": "Peer",
+ "roleHint": "DB-/Cluster-Rolle: bestimmt, wohin Schreibzugriffe gehen. Sie wandert NICHT mit der VIP — ein Node kann DB-Primary sein und trotzdem gerade keepalived-BACKUP (siehe VIP/VRRP-Karte). Sie aendert sich nur durch „edgeguard-ctl promote“."
},
"routingCard": {
"title": "Routing",
diff --git a/management-ui/src/i18n/locales/en/common.json b/management-ui/src/i18n/locales/en/common.json
index 3d532d2..cff7bc5 100644
--- a/management-ui/src/i18n/locales/en/common.json
+++ b/management-ui/src/i18n/locales/en/common.json
@@ -416,7 +416,10 @@
"ok": "OK",
"degraded": "degraded",
"split-brain": "split-brain"
- }
+ },
+ "roleDbPrimary": "DB primary",
+ "rolePeer": "Peer",
+ "roleHint": "Database/cluster role: decides where writes go. It does NOT follow the VIP — a node can be DB primary while currently being keepalived BACKUP (see the VIP/VRRP card). It only changes via \"edgeguard-ctl promote\"."
},
"routingCard": {
"title": "Routing",
diff --git a/management-ui/src/pages/Dashboard/index.tsx b/management-ui/src/pages/Dashboard/index.tsx
index ea88823..2e0da67 100644
--- a/management-ui/src/pages/Dashboard/index.tsx
+++ b/management-ui/src/pages/Dashboard/index.tsx
@@ -677,7 +677,18 @@ function ClusterStatusCard({ nodes, status }: ClusterStatusCardProps) {
padding: '4px 0', borderBottom: '1px solid #F1F5F9', fontSize: 12,
}}>
{n.fqdn}
- {n.role}
+ {/* ha_nodes.role ist die DB-/Cluster-Rolle (wohin Schreibzugriffe
+ gehen) und wandert bewusst NICHT mit der VIP — sie aendert
+ sich nur durch `edgeguard-ctl promote`. Ein nacktes "primary"
+ hier las sich neben der VIP-Karte ("BACKUP") wie ein
+ Widerspruch, deshalb explizit als DB-Rolle beschriftet. */}
+
+
+ {n.role === 'primary'
+ ? t('dashboard.clusterCard.roleDbPrimary')
+ : t('dashboard.clusterCard.rolePeer')}
+
+
))}