diff --git a/VERSION b/VERSION
index d24bae7..591b0f8 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.1.140
+1.1.141
diff --git a/cmd/edgeguard-api/main.go b/cmd/edgeguard-api/main.go
index cdec34c..045cdea 100644
--- a/cmd/edgeguard-api/main.go
+++ b/cmd/edgeguard-api/main.go
@@ -60,7 +60,7 @@ import (
usersvc "git.netcell-it.de/projekte/edgeguard-native/internal/services/users"
)
-var version = "1.1.140"
+var version = "1.1.141"
func main() {
addr := os.Getenv("EDGEGUARD_API_ADDR")
diff --git a/cmd/edgeguard-ctl/main.go b/cmd/edgeguard-ctl/main.go
index fae04ca..80e21ca 100644
--- a/cmd/edgeguard-ctl/main.go
+++ b/cmd/edgeguard-ctl/main.go
@@ -11,7 +11,7 @@ import (
"git.netcell-it.de/projekte/edgeguard-native/internal/services/setup"
)
-var version = "1.1.140"
+var version = "1.1.141"
const usage = `edgeguard-ctl — EdgeGuard CLI
diff --git a/cmd/edgeguard-scheduler/main.go b/cmd/edgeguard-scheduler/main.go
index 933667b..cf51fed 100644
--- a/cmd/edgeguard-scheduler/main.go
+++ b/cmd/edgeguard-scheduler/main.go
@@ -41,7 +41,7 @@ import (
"git.netcell-it.de/projekte/edgeguard-native/internal/services/tlscerts"
)
-var version = "1.1.140"
+var version = "1.1.141"
const (
// renewTickInterval — how often we re-evaluate expiring certs.
diff --git a/management-ui/src/i18n/locales/de/common.json b/management-ui/src/i18n/locales/de/common.json
index 0514a9a..cbfd347 100644
--- a/management-ui/src/i18n/locales/de/common.json
+++ b/management-ui/src/i18n/locales/de/common.json
@@ -380,6 +380,8 @@
"forceHttp1Hint": "Deaktiviert HTTP/2 (h2) auf der Backend-Verbindung — HAProxy handelt nur noch HTTP/1.1 aus. Nötig für Backends die kein h2 unterstützen (z. B. ältere nginx-Konfigurationen ohne h2-Modul, Legacy-Apps).",
"servers": "Server",
"noServers": "kein Server",
+ "noServersWarning": "Ein oder mehrere aktive Backends haben keine Server konfiguriert.",
+ "noServersWarningDesc": "HAProxy liefert für Traffic auf diese Backends 503. Backend öffnen (oranger Tag) und mindestens einen Server hinzufügen.",
"nServers": "{{n}} Server",
"serversIn": "Server in „{{name}}\"",
"serverHintCreate": "Speichern legt nur den Pool an. Server kommen im nächsten Schritt — Pool öffnen → „Server hinzufügen\".",
@@ -415,6 +417,8 @@
"editRule": "Regel bearbeiten",
"domain": "Domain",
"pathPrefix": "Pfad-Präfix",
+ "pathPrefixHint": "Muss mit / beginnen. HAProxy matcht als Präfix.",
+ "pathPrefixInvalid": "Pfad muss mit / beginnen und darf nur gültige URL-Zeichen enthalten",
"backend": "Backend",
"priority": "Priorität",
"active": "Aktiv",
diff --git a/management-ui/src/i18n/locales/en/common.json b/management-ui/src/i18n/locales/en/common.json
index ae51209..b28cf68 100644
--- a/management-ui/src/i18n/locales/en/common.json
+++ b/management-ui/src/i18n/locales/en/common.json
@@ -380,6 +380,8 @@
"forceHttp1Hint": "Disables HTTP/2 (h2) on the backend connection — HAProxy negotiates HTTP/1.1 only. Required for backends that don't support h2 (e.g. older nginx configs without the h2 module, legacy apps).",
"servers": "Servers",
"noServers": "no server",
+ "noServersWarning": "One or more active backends have no servers configured.",
+ "noServersWarningDesc": "HAProxy will return 503 for any traffic routed to these backends. Open the backend (orange tag) and add at least one server.",
"nServers": "{{n}} servers",
"serversIn": "Servers in “{{name}}”",
"serverHintCreate": "Saving creates the pool only. Add servers in the next step — open the pool and click “Add server”.",
@@ -415,6 +417,8 @@
"editRule": "Edit rule",
"domain": "Domain",
"pathPrefix": "Path prefix",
+ "pathPrefixHint": "Must start with /. HAProxy uses prefix matching.",
+ "pathPrefixInvalid": "Path must start with / and contain only valid URL characters",
"backend": "Backend",
"priority": "Priority",
"active": "Active",
diff --git a/management-ui/src/pages/Backends/index.tsx b/management-ui/src/pages/Backends/index.tsx
index 76fd249..f2f9837 100644
--- a/management-ui/src/pages/Backends/index.tsx
+++ b/management-ui/src/pages/Backends/index.tsx
@@ -329,6 +329,15 @@ export default function BackendsPage() {
)}
/>
+ {serverCounts && (data ?? []).some(b => b.active && (serverCounts[b.id] ?? 0) === 0) && (
+
+ )}
{ setEditing(null); setCreating(false) }}
onOk={() => { void form.submit() }}
confirmLoading={create.isPending || update.isPending}
+ destroyOnHidden
>
-
+