From f40ca1c55f3664f4f53a1d2c9d7dde8917d8465a Mon Sep 17 00:00:00 2001 From: MrEgosar Date: Thu, 29 Oct 2026 12:53:27 +0100 Subject: [PATCH 1/4] Admin: IP und Ports des Servers in der Matchkarte anzeigen --- client/src/pages/AdminPage.jsx | 6 ++++++ server/src/matchService.js | 3 +++ 2 files changed, 9 insertions(+) diff --git a/client/src/pages/AdminPage.jsx b/client/src/pages/AdminPage.jsx index cf4b62e..b1ca7c2 100644 --- a/client/src/pages/AdminPage.jsx +++ b/client/src/pages/AdminPage.jsx @@ -296,6 +296,12 @@ function MatchAdminCard({ m, run, busy, token, reload, setNotice }) { {current.live?.roundsPlayed != null && Runde {current.live.roundsPlayed + 1}} )} + {m.server?.address && ( +
+ Server {m.server.address.host}:{m.server.address.port} + {m.server.address.tvPort && <> · CSTV {m.server.address.host}:{m.server.address.tvPort}} +
+ )} {paused && Pausiert} diff --git a/server/src/matchService.js b/server/src/matchService.js index 7c6b597..f4a61d4 100644 --- a/server/src/matchService.js +++ b/server/src/matchService.js @@ -956,6 +956,9 @@ export class MatchService extends EventEmitter { updatedAt: row.updated_at, idleTimeoutMinutes: this.config.idleTimeoutMinutes, }; + if (viewer.isOrganizer && row.host) { + view.address = { host: row.host, port: row.port, tvPort: row.tv_port }; + } const configured = row.status === 'configured'; if (!configured || viewer.role === 'public') return view; From a6c7ba1a23dcc1a6fa10bba4a7701d89396a1443 Mon Sep 17 00:00:00 2001 From: MrEgosar Date: Thu, 29 Oct 2026 12:55:23 +0100 Subject: [PATCH 2/4] Admin: freien Speicher dort messen, wo das Gameserver-Volume liegt --- server/src/servers/dockerAdapter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/servers/dockerAdapter.js b/server/src/servers/dockerAdapter.js index 261e680..bd65ec8 100644 --- a/server/src/servers/dockerAdapter.js +++ b/server/src/servers/dockerAdapter.js @@ -251,7 +251,7 @@ export class DockerHostPool { } /** - * Freier Speicher unter /var/lib/docker auf einem Host, per SSH. Ergebnis wird eine Minute lang + * Freier Speicher auf einem Host, per SSH: dort, wo das Gameserver-Volume liegt. Ergebnis wird eine Minute lang * zwischengespeichert, weil die Admin-Seite alle paar Sekunden abfragt. Ohne ssh:// gibt es null. */ async diskUsage(name) { @@ -265,7 +265,7 @@ export class DockerHostPool { try { const { stdout } = await exec('ssh', [ '-o', 'BatchMode=yes', '-o', 'ConnectTimeout=5', host.dockerHost.slice('ssh://'.length), - 'df -B1 /var/lib/docker 2>/dev/null || df -B1 /', + `df -B1 "$(docker volume inspect ${host.volume} --format '{{.Mountpoint}}' 2>/dev/null || echo /var/lib/docker)" 2>/dev/null || df -B1 /var/lib/docker 2>/dev/null || df -B1 /`, ], { timeout: 10_000 }); value = parseDf(stdout.trim().split('\n').pop()); } catch { From 39fe8da5f51fba0b189f1fcf0d356d85b6993860 Mon Sep 17 00:00:00 2001 From: MrEgosar Date: Thu, 29 Oct 2026 12:57:11 +0100 Subject: [PATCH 3/4] Speichermessung: Bind-Ordner eines Volumes auch ohne laufenden Container finden --- server/src/servers/dockerAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/servers/dockerAdapter.js b/server/src/servers/dockerAdapter.js index bd65ec8..98f26d7 100644 --- a/server/src/servers/dockerAdapter.js +++ b/server/src/servers/dockerAdapter.js @@ -265,7 +265,7 @@ export class DockerHostPool { try { const { stdout } = await exec('ssh', [ '-o', 'BatchMode=yes', '-o', 'ConnectTimeout=5', host.dockerHost.slice('ssh://'.length), - `df -B1 "$(docker volume inspect ${host.volume} --format '{{.Mountpoint}}' 2>/dev/null || echo /var/lib/docker)" 2>/dev/null || df -B1 /var/lib/docker 2>/dev/null || df -B1 /`, + `df -B1 "$(docker volume inspect ${host.volume} --format '{{with .Options}}{{.device}}{{end}}' 2>/dev/null | grep . || docker volume inspect ${host.volume} --format '{{.Mountpoint}}' 2>/dev/null || echo /var/lib/docker)" 2>/dev/null || df -B1 /var/lib/docker 2>/dev/null || df -B1 /`, ], { timeout: 10_000 }); value = parseDf(stdout.trim().split('\n').pop()); } catch { From fcee62c1462209cfa30fc0de1cad3f574dafd330 Mon Sep 17 00:00:00 2001 From: MrEgosar Date: Thu, 29 Oct 2026 12:58:25 +0100 Subject: [PATCH 4/4] Admin: Adresszeile kompakt gestalten, bei gestopptem Server ausblenden --- client/src/pages/AdminPage.jsx | 10 ++++++---- client/src/styles.css | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/client/src/pages/AdminPage.jsx b/client/src/pages/AdminPage.jsx index b1ca7c2..0d23b93 100644 --- a/client/src/pages/AdminPage.jsx +++ b/client/src/pages/AdminPage.jsx @@ -296,10 +296,12 @@ function MatchAdminCard({ m, run, busy, token, reload, setNotice }) { {current.live?.roundsPlayed != null && Runde {current.live.roundsPlayed + 1}} )} - {m.server?.address && ( -
- Server {m.server.address.host}:{m.server.address.port} - {m.server.address.tvPort && <> · CSTV {m.server.address.host}:{m.server.address.tvPort}} + {m.server?.address && m.server.status !== 'stopped' && ( +
+ Server {m.server.address.host}:{m.server.address.port} + {m.server.address.tvPort && ( + CSTV {m.server.address.host}:{m.server.address.tvPort} + )}
)} {paused && Pausiert} diff --git a/client/src/styles.css b/client/src/styles.css index 87abb8c..3ba7b9a 100644 --- a/client/src/styles.css +++ b/client/src/styles.css @@ -568,3 +568,5 @@ input:focus, select:focus { border-color: var(--link); outline: none; } .host-matches li { padding: 3px 0; border-top: 1px solid var(--line); } .host-disk { font-size: .85rem; color: var(--muted); margin: -2px 0 8px; font-variant-numeric: tabular-nums; } .host-disk.is-low { color: var(--error); font-weight: 600; } +.admin-address { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 8px; font-size: .85rem; } +.admin-address code { font: 500 .85rem ui-monospace, SFMono-Regular, Consolas, monospace; padding: 1px 6px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface); }