From f8479d2ae45a6fc6e8b63fdef182abb35a00a1a7 Mon Sep 17 00:00:00 2001 From: valgulnecron <39313199+ValgulNecron@users.noreply.github.com> Date: Thu, 16 Jul 2026 20:23:49 +0200 Subject: [PATCH 1/3] feat: rich quick-action sets for six games MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every command here is verified against the game's own docs (minecraft.wiki, terraria.wiki.gg, pzwiki.net, Valve's CS2 command list, Stunlock's own server instructions, ARK admin docs) — no guessed commands. - minecraft-java: adds set-difficulty and an announce-restart SEQUENCE (warn -> save-all flush -> stop). Save now flushes. REMOVES whitelist-add and whitelist-remove: the Players tab already owns whitelist, and two UIs for one operation is what the action spec forbids. - terraria: its FIRST actions, over the new stdin transport — broadcast, save, set-time, settle water, MOTD. Terraria's time commands are bare words, so set-time's template is just the param. No set-weather: Terraria has no weather command. - project-zomboid: reload-config plus the world-event triggers the game is loved for — chopper, gunshot, alarm. - cs2: restart-round, change-map, exec config, warmup. - v-rising: announcerestart (Stunlock's own, auto-localised per player) and cancelshutdown. - ark: SetTimeOfDay and DestroyWildDinos. No 'cheat' prefix — over RCON the session is already admin. All actions are grouped World/Server for the new sectioned card. Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com> --- ark-survival-ascended/module.yaml | 2 +- ark-survival-ascended/template.yaml | 24 +++++++++++- cs2/module.yaml | 2 +- cs2/template.yaml | 43 +++++++++++++++++++- minecraft-java/module.yaml | 2 +- minecraft-java/template.yaml | 55 +++++++++++++++++--------- project-zomboid/module.yaml | 2 +- project-zomboid/template.yaml | 27 ++++++++++++- terraria/module.yaml | 2 +- terraria/template.yaml | 61 ++++++++++++++++++++++++++++- v-rising/module.yaml | 2 +- v-rising/template.yaml | 20 +++++++++- 12 files changed, 213 insertions(+), 29 deletions(-) diff --git a/ark-survival-ascended/module.yaml b/ark-survival-ascended/module.yaml index 0a0dd00..be30d55 100644 --- a/ark-survival-ascended/module.yaml +++ b/ark-survival-ascended/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: ark-survival-ascended displayName: "ARK: Survival Ascended" -version: 1.0.6 +version: 1.0.7 game: ark-survival-ascended categories: [Survival, PvP, Co-op, Modded] summary: "ARK: Survival Ascended dedicated server (mschnitzer/asa-linux-server) with RCON console/moderation. CurseForge mods install via the game's own -mods= launch parameter." diff --git a/ark-survival-ascended/template.yaml b/ark-survival-ascended/template.yaml index 1a3e7b0..cf798b0 100644 --- a/ark-survival-ascended/template.yaml +++ b/ark-survival-ascended/template.yaml @@ -58,7 +58,7 @@ metadata: spec: displayName: "ARK: Survival Ascended" game: ark-survival-ascended - version: 1.0.6 + version: 1.0.7 categories: [Survival, PvP, Co-op, Modded] accentColor: "#00b2e2" description: | @@ -144,6 +144,7 @@ spec: displayName: Broadcast description: Send a chat message to everyone on the server. icon: megaphone + group: Server command: "ServerChat {{.Params.message}}" params: - name: message @@ -153,7 +154,28 @@ spec: - id: save-world displayName: Save world icon: save + group: World command: "SaveWorld" + - id: set-time + displayName: Set time of day + description: Time as HH:MM. + icon: clock + group: World + command: "SetTimeOfDay {{.Params.time}}" + params: + - name: time + displayName: Time + type: string + default: "12:00" + required: true + - id: destroy-wild-dinos + displayName: Destroy wild dinos + description: Clears and respawns all wild creatures. Tamed creatures are unaffected. + icon: skull + group: World + danger: true + confirm: true + command: "DestroyWildDinos" mods: # ASA has no mods directory and no mods env — its only hook is a # -mods=,... flag on the launch string, which also diff --git a/cs2/module.yaml b/cs2/module.yaml index 562934d..0dc2a58 100644 --- a/cs2/module.yaml +++ b/cs2/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: cs2 displayName: Counter-Strike 2 -version: 1.0.3 +version: 1.0.4 game: cs2 categories: [Shooter, PvP] summary: Counter-Strike 2 dedicated server (joedwards32/CS2) with Source RCON and a Metamod/CS# plugins volume. diff --git a/cs2/template.yaml b/cs2/template.yaml index 3835e71..83d3e0c 100644 --- a/cs2/template.yaml +++ b/cs2/template.yaml @@ -22,7 +22,7 @@ metadata: spec: displayName: Counter-Strike 2 game: cs2 - version: 1.0.3 + version: 1.0.4 categories: [Shooter, PvP] accentColor: "#f4a900" description: | @@ -94,12 +94,53 @@ spec: - id: broadcast displayName: Broadcast icon: megaphone + group: Server command: 'say "{{.Params.message}}"' params: - name: message displayName: Message type: string required: true + - id: restart-round + displayName: Restart round + icon: rotate-ccw + group: World + command: "mp_restartgame {{.Params.seconds}}" + params: + - name: seconds + displayName: Seconds + type: int + default: "1" + required: true + - id: change-map + displayName: Change map + icon: map + group: World + danger: true + confirm: true + command: "changelevel {{.Params.map}}" + params: + - name: map + displayName: Map + type: string + default: de_dust2 + required: true + - id: reload-config + displayName: Exec config + icon: settings + group: Server + command: "exec {{.Params.cfg}}" + params: + - name: cfg + displayName: Config file + type: string + default: server.cfg + required: true + - id: warmup-start + displayName: Start warmup + icon: clock + group: World + command: "mp_warmup_start" # No version/loader axis for CS2, so mods use the legacy single-path # form. Metamod stays at game/csgo/addons; CounterStrikeSharp nests one # level deeper (game/csgo/addons/counterstrikesharp/plugins) but is diff --git a/minecraft-java/module.yaml b/minecraft-java/module.yaml index 7d8dd66..464221e 100644 --- a/minecraft-java/module.yaml +++ b/minecraft-java/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: minecraft-java displayName: Minecraft (Java Edition) -version: 2.7.2 +version: 2.8.0 game: minecraft-java categories: [Sandbox, Survival, Building, Modded, Creative] summary: Vanilla / Paper / Spigot / Bukkit / Purpur / Forge / NeoForge / Fabric / Quilt servers (itzg/minecraft-server) with a version+loader picker spanning 1.16.5–latest, per-loader mod volumes, and in-app Modrinth browse. diff --git a/minecraft-java/template.yaml b/minecraft-java/template.yaml index 335f8cd..c46b0dc 100644 --- a/minecraft-java/template.yaml +++ b/minecraft-java/template.yaml @@ -22,7 +22,7 @@ spec: displayName: Minecraft (Java Edition) game: minecraft-java # Kept in lockstep with module.yaml's bundle version from 2.5.0 onward. - version: 2.7.2 + version: 2.8.0 categories: [Sandbox, Survival, Building, Modded, Creative] # Brand color the dashboard tints this game's icon/accents with. accentColor: "#5b9a3e" @@ -338,6 +338,7 @@ spec: displayName: Broadcast message description: Send a chat message to everyone on the server. icon: megaphone + group: Server command: "say {{.Params.message}}" params: - name: message @@ -347,6 +348,7 @@ spec: - id: set-time displayName: Set time icon: clock + group: World command: "time set {{.Params.time}}" params: - name: time @@ -357,6 +359,7 @@ spec: - id: set-weather displayName: Set weather icon: cloud + group: World command: "weather {{.Params.weather}}" params: - name: weather @@ -364,29 +367,45 @@ spec: type: enum enum: ["clear", "rain", "thunder"] default: clear - - id: whitelist-add - displayName: Whitelist player - icon: user-plus - command: "whitelist add {{.Params.player}}" + - id: set-difficulty + displayName: Set difficulty + icon: settings + group: World + command: "difficulty {{.Params.level}}" params: - - name: player - displayName: Player name - type: string - required: true - - id: whitelist-remove - displayName: Remove from whitelist - icon: user-minus - command: "whitelist remove {{.Params.player}}" - params: - - name: player - displayName: Player name - type: string + - name: level + displayName: Difficulty + type: enum + enum: ["peaceful", "easy", "normal", "hard"] + default: normal required: true + # whitelist-add / whitelist-remove were removed here — whitelist + # management now lives solely on the Players tab + # (capabilities.players.whitelist above), so quick actions don't + # duplicate that UI. - id: save-world displayName: Save world description: Flush the world to disk now. icon: save - command: "save-all" + group: World + command: "save-all flush" + - id: announce-restart + displayName: Announce restart + description: Warn players, save the world, then stop the server. + icon: rotate-ccw + group: Server + danger: true + confirm: true + commands: + - 'say {{.Params.message}}' + - "save-all flush" + - "stop" + params: + - name: message + displayName: Message + type: string + default: "Server restarting shortly — please log out safely." + required: true status: metrics: - id: seed diff --git a/project-zomboid/module.yaml b/project-zomboid/module.yaml index 1daac49..78f5b58 100644 --- a/project-zomboid/module.yaml +++ b/project-zomboid/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: project-zomboid displayName: Project Zomboid -version: 1.0.4 +version: 1.0.5 game: project-zomboid categories: [Survival, Horror, Co-op] summary: Project Zomboid dedicated server (sknnr/zomboid-dedicated-server) with RCON console/moderation and Steam Workshop mods via the game's own MOD_IDS/MOD_NAMES sync. diff --git a/project-zomboid/template.yaml b/project-zomboid/template.yaml index 148b666..84e387d 100644 --- a/project-zomboid/template.yaml +++ b/project-zomboid/template.yaml @@ -34,7 +34,7 @@ metadata: spec: displayName: Project Zomboid game: project-zomboid - version: 1.0.4 + version: 1.0.5 categories: [Survival, Horror, Co-op] accentColor: "#336600" description: | @@ -130,6 +130,7 @@ spec: displayName: Broadcast description: Send a server message to everyone. icon: megaphone + group: Server command: 'servermsg "{{.Params.message}}"' params: - name: message @@ -139,7 +140,31 @@ spec: - id: save-world displayName: Save world icon: save + group: World command: "save" + - id: reload-config + displayName: Reload server options + icon: settings + group: Server + command: "reloadoptions" + - id: chopper-event + displayName: Helicopter event + description: Trigger the helicopter flyover that draws zombies. + icon: siren + group: World + command: "chopper" + - id: gunshot-event + displayName: Gunshot event + description: Trigger a gunshot noise that draws zombies. + icon: siren + group: World + command: "gunshot" + - id: alarm-event + displayName: Alarm event + description: Trigger a building alarm. + icon: siren + group: World + command: "alarm" probes: # Game/direct ports are UDP; RCON is the only TCP port, so it's the diff --git a/terraria/module.yaml b/terraria/module.yaml index ee4f353..cc764ba 100644 --- a/terraria/module.yaml +++ b/terraria/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: terraria displayName: Terraria -version: 2.1.1 +version: 2.2.0 game: terraria categories: [Sandbox, Survival, Adventure, Modded] summary: Terraria + tModLoader dedicated server (passivelemon/terraria-docker) with a vanilla/tModLoader version picker and a tModLoader ModPacks volume. Console via container stdin. diff --git a/terraria/template.yaml b/terraria/template.yaml index bd18415..1878051 100644 --- a/terraria/template.yaml +++ b/terraria/template.yaml @@ -20,7 +20,7 @@ spec: displayName: Terraria game: terraria # Kept in lockstep with module.yaml's bundle version from 2.1.0 onward. - version: 2.1.1 + version: 2.2.0 categories: [Sandbox, Survival, Adventure, Modded] # Brand color the dashboard tints this game's icon/accents with. accentColor: "#4a90d9" @@ -94,6 +94,65 @@ spec: failureThreshold: 30 capabilities: + # Terraria has no RCON (rcon.protocol: none above), so every action + # below runs over stdin pod-attach instead of RCON — fire-and-forget: + # no output returns inline, it appears in the Console tab. transport: + # stdin is set explicitly on each action for clarity, even though it's + # also what the default resolves to for this template. + # + # Terraria's dedicated-server console has no weather command, so there + # is no set-weather action here (unlike minecraft-java/project-zomboid). + actions: + - id: broadcast + displayName: Broadcast message + group: Server + icon: megaphone + transport: stdin + command: "say {{.Params.message}}" + params: + - name: message + displayName: Message + type: string + required: true + - id: save-world + displayName: Save world + group: World + icon: save + transport: stdin + command: "save" + - id: set-time + displayName: Set time + group: World + icon: clock + transport: stdin + # The command IS the word: dawn/noon/dusk/midnight are each their + # own console command on Terraria's server console (not a command + # that takes a time-of-day argument), so the template is just the + # param itself. + command: "{{.Params.time}}" + params: + - name: time + displayName: Time of day + type: enum + enum: ["dawn", "noon", "dusk", "midnight"] + default: noon + required: true + - id: settle-water + displayName: Settle water + description: Settle all flowing liquids. + group: World + transport: stdin + command: "settle" + - id: set-motd + displayName: Set MOTD + group: Server + transport: stdin + command: "motd {{.Params.message}}" + params: + - name: message + displayName: Message + type: string + required: true # tModLoader modpacks live under /ModPacks; the active modpack is # picked with the MODPACK config field. Vanilla has no loaders entry, so # vanilla servers show no Mods tab. diff --git a/v-rising/module.yaml b/v-rising/module.yaml index 2329102..ea9775f 100644 --- a/v-rising/module.yaml +++ b/v-rising/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: v-rising displayName: V Rising -version: 1.0.1 +version: 1.0.2 game: v-rising categories: [Survival, PvP, Co-op] summary: V Rising dedicated server (trueosiris/vrising) with Source RCON and a safe shutdown sequence. diff --git a/v-rising/template.yaml b/v-rising/template.yaml index 578f1fd..5e81eb5 100644 --- a/v-rising/template.yaml +++ b/v-rising/template.yaml @@ -27,7 +27,7 @@ metadata: spec: displayName: V Rising game: v-rising - version: 1.0.1 + version: 1.0.2 categories: [Survival, PvP, Co-op] accentColor: "#8b0000" description: | @@ -86,12 +86,30 @@ spec: - id: broadcast displayName: Broadcast icon: megaphone + group: Server command: "announce {{.Params.message}}" params: - name: message displayName: Message type: string required: true + - id: announce-restart + displayName: Announce restart + description: Stunlock's own restart warning — auto-localised to each player's language. + icon: rotate-ccw + group: Server + command: "announcerestart {{.Params.minutes}}" + params: + - name: minutes + displayName: Minutes + type: int + default: "10" + required: true + - id: cancel-shutdown + displayName: Cancel shutdown + icon: rotate-ccw + group: Server + command: "cancelshutdown" configSchema: - name: SERVERNAME From 91e0a05fc332111fc2759cd449c50991d706ae80 Mon Sep 17 00:00:00 2001 From: valgulnecron <39313199+ValgulNecron@users.noreply.github.com> Date: Thu, 16 Jul 2026 20:48:33 +0200 Subject: [PATCH 2/3] feat: palworld migrates to the REST admin API; actions for four more games MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Palworld's RCON is officially deprecated upstream ('scheduled to stop functioning in an upcoming update'), so it moves to the REST admin API (protocol: palworld, port 8212). The image already exposes REST_API_ENABLED and REST_API_PORT, and the REST API authenticates against the same AdminPassword RCON used — so the operator's generated password lands via the existing ADMIN_PASSWORD, unchanged. The migration is a net gain: it brings a real players list, and an announce that keeps its spaces (the deprecated RCON's Broadcast truncated at the first space). Palworld kick/ban are deliberately NOT offered: the REST API moderates by userId while the players list yields display names, and the agent carries one value to both — a button would risk targeting the wrong account. Same reasoning as DayZ. First actions for rust (broadcast/save/set-time over webrcon) and dont-starve-together (Lua c_* over the stdin transport, incl. a danger rollback). factorio gets save only and satisfactory save-game only — both consoles are genuinely that sparse, and saying so beats inventing buttons. Records why five games get none: valheim (no stdin input at all), dayz (BE too restricted to verify), 7dtd + garrys-mod (images can't wire a console password), enshrouded (no remote console). Also fixes three user-facing descriptions that had gone stale as the protocols landed — rust, dayz and satisfactory each still told the user their console was unsupported. Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com> --- 7-days-to-die/module.yaml | 2 +- 7-days-to-die/template.yaml | 8 ++- dayz/README.md | 78 ++++++++++++++++++++ dayz/module.yaml | 2 +- dayz/template.yaml | 14 ++-- dont-starve-together/module.yaml | 2 +- dont-starve-together/template.yaml | 43 ++++++++++- enshrouded/module.yaml | 2 +- enshrouded/template.yaml | 4 +- factorio/module.yaml | 2 +- factorio/template.yaml | 14 +++- garrys-mod/module.yaml | 2 +- garrys-mod/template.yaml | 6 +- palworld/README.md | 36 ++++++---- palworld/module.yaml | 4 +- palworld/template.yaml | 110 +++++++++++++++++++++-------- rust/module.yaml | 2 +- rust/template.yaml | 38 ++++++++-- satisfactory/module.yaml | 2 +- satisfactory/template.yaml | 31 ++++++-- valheim/module.yaml | 2 +- valheim/template.yaml | 8 ++- validate.py | 2 +- 23 files changed, 338 insertions(+), 76 deletions(-) create mode 100644 dayz/README.md diff --git a/7-days-to-die/module.yaml b/7-days-to-die/module.yaml index bacda3b..4d2222a 100644 --- a/7-days-to-die/module.yaml +++ b/7-days-to-die/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: 7-days-to-die displayName: 7 Days to Die -version: 2.0.3 +version: 2.0.4 game: 7-days-to-die categories: [Survival, Horror, Co-op, Shooter] summary: 7 Days to Die dedicated server (vinanrra/7dtd-server) with persistent world saves and image-native mod installers. No RCON console or wizard server settings — this image spreads them across directories the operator can't all mount at once. diff --git a/7-days-to-die/template.yaml b/7-days-to-die/template.yaml index 241425f..db9d7e1 100644 --- a/7-days-to-die/template.yaml +++ b/7-days-to-die/template.yaml @@ -43,7 +43,7 @@ metadata: spec: displayName: 7 Days to Die game: 7-days-to-die - version: 2.0.3 + version: 2.0.4 categories: [Survival, Horror, Co-op, Shooter] accentColor: "#8b0000" description: | @@ -136,6 +136,12 @@ spec: # independent of storage.mountPath, so they still work: install runs # before the pod is considered ready, and re-runs (fetching fresh) on # every restart since serverfiles/ isn't persisted either. + # + # No capabilities.actions either (on top of requiring RCON, which this + # template doesn't have): 7 Days to Die's `settime` parameter format is + # undocumented and `settime 0` reportedly crashes the server, so even if + # RCON were wired up here, shipping a time-control action would be a + # guess. No actions. configSchema: - name: UNDEAD_LEGACY displayName: Install Undead Legacy diff --git a/dayz/README.md b/dayz/README.md new file mode 100644 index 0000000..7a4c2c8 --- /dev/null +++ b/dayz/README.md @@ -0,0 +1,78 @@ +# `dayz` module + +Gameplane GameTemplate for DayZ dedicated servers. + +## Install + +```sh +kubectl apply -f modules/dayz/template.yaml +``` + +## Image + +[`GodBleak/ServerZ`](https://github.com/GodBleak/ServerZ), pulled from +the project's own OCI registry: +`registry.godbleak.dev/godbleak/serverz:latest`. This replaces the +previous draft's `jammsen/dayz-dedicated-server`, which does not exist on +any registry. + +**Not Docker Hub or GHCR.** The image is hosted on the project's +self-hosted GitLab container registry — verified reachable and +anonymously pullable (`docker pull` needs no login), but it is a single +maintainer's own infrastructure rather than a major registry. If that's +a concern for your deployment, mirror the image into your own registry +before installing. + +## No console, no RCON + +DayZ speaks proprietary **BattlEye RCon**, not Source RCON or telnet — +Gameplane's agent has no client for it, so `rcon.protocol: none`. The +game binary also has no interactive admin console of its own (admin is +BattlEye RCon, an external tool, or an in-game admin mod only), so no +`consoleMode` is set either — the Console tab shows "no live console." +With no reachable transport, there is no `capabilities` block at all: no +lifecycle stop sequence, no moderation, no quiesce. The server relies on +SIGTERM + DayZ's own autosave; whether that's fully safe under a bare +SIGTERM is not documented anywhere authoritative that was found — +consider a generous `stopGracePeriodSeconds` on the GameServer. + +## Mods + +**Workshop mod IDs** is a plain config field (comma-separated Steam +Workshop item IDs) — DayZ mods are `-mod=` launch-parameter driven, not a +panel-managed folder, so there is no `capabilities.mods` block. + +**Mods require a one-time interactive Steam login.** The base dedicated +server installs anonymously (no Steam account needed) — but Workshop +downloads need one. ServerZ's recommended flow is a QR code shown in the +container logs (scan with the Steam mobile app); this can't be automated +through the Gameplane dashboard today. To use mods: + +1. Set **Workshop mod IDs**, start the server, then `kubectl logs` the + game pod and scan the QR code within its timeout. +2. This template does **not** persist `/root/.steam` (see Storage below), + so a rescheduled/restarted pod loses that login and needs it redone. + +Running with no mods needs none of this. + +## Ports + +| Name | Port | Protocol | Advertised | +| ----- | ----- | -------- | ---------- | +| game | 2302 | UDP | yes | +| query | 27015 | UDP | no | + +## Storage + +The image documents four separate paths (`/data`, `/overrides`, +`/install`, `/root/.steam`) with no common parent besides `/` — only +`/data` (world/profile state) is mounted here. `/install` is left +ephemeral, so **every pod (re)start re-downloads the full ~10GB+ server +via SteamCMD** — the same tradeoff the shipped `valheim` module already +makes with its own SteamCMD-on-boot image. Default size is 40 GiB. + +## No readiness/liveness probes + +Every port this image exposes is UDP, and it has no HTTP endpoint — +there is no TCP or HTTP surface to probe, so none is declared. Kubernetes +falls back to treating the pod as ready once the container is running. diff --git a/dayz/module.yaml b/dayz/module.yaml index 90df79b..bdf9255 100644 --- a/dayz/module.yaml +++ b/dayz/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: dayz displayName: DayZ -version: 1.1.0 +version: 1.1.1 game: dayz categories: [Survival, Shooter, PvP, Horror] summary: DayZ dedicated server (GodBleak/ServerZ). No RCON is reachable (proprietary BattlEye RCon, not Source RCON) — manage via SIGTERM-safe restarts and config fields. diff --git a/dayz/template.yaml b/dayz/template.yaml index 6616e43..2d2aed3 100644 --- a/dayz/template.yaml +++ b/dayz/template.yaml @@ -34,15 +34,15 @@ metadata: spec: displayName: DayZ game: dayz - version: 1.0.1 + version: 1.1.1 categories: [Survival, Shooter, PvP, Horror] accentColor: "#bd2020" description: | DayZ dedicated server using - [GodBleak/ServerZ](https://github.com/GodBleak/ServerZ). No RCON is - reachable (DayZ uses proprietary BattlEye RCon, not Source RCON) — - manage the server via SIGTERM-safe restarts and the config fields - below. + [GodBleak/ServerZ](https://github.com/GodBleak/ServerZ). Console and + the players list run over BattlEye RCon. Kick/ban aren't offered: + BattlEye targets players by number rather than name, so a button would + risk hitting the wrong one — moderate in-game instead. image: registry.godbleak.dev/godbleak/serverz:latest @@ -110,6 +110,10 @@ spec: # BattlEye moderation is by player number, not name — the dashboard # passes what the list returned, so kick/ban are left unset rather # than shipping commands that would silently target the wrong player. + # No capabilities.actions either: BattlEye RCon's command set is too + # restricted, and a broadcast command ("say -1 ") could not be + # verified for DayZ specifically (BE's "say" semantics vary by game). + # No actions rather than shipping buttons that may error. # No console/probes block: the game's only ports are UDP (no TCP surface # to probe), and there is no HTTP endpoint either. Kubernetes falls back diff --git a/dont-starve-together/module.yaml b/dont-starve-together/module.yaml index 213fbcf..1ff3a26 100644 --- a/dont-starve-together/module.yaml +++ b/dont-starve-together/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: dont-starve-together displayName: Don't Starve Together -version: 1.0.1 +version: 1.1.0 game: dont-starve-together categories: [Survival, Co-op] summary: DST dedicated server. diff --git a/dont-starve-together/template.yaml b/dont-starve-together/template.yaml index 281d2be..d99d771 100644 --- a/dont-starve-together/template.yaml +++ b/dont-starve-together/template.yaml @@ -7,7 +7,7 @@ metadata: spec: displayName: Don't Starve Together game: dont-starve-together - version: 1.0.1 + version: 1.1.0 categories: [Survival, Co-op] accentColor: "#cc0000" description: DST dedicated server. @@ -44,6 +44,47 @@ spec: # shut down cleanly. Note: the stdin attachment may reach the master # shard or caves shard depending on container startup order. stop: ["c_save()", "c_shutdown(true)"] + # DST's server console is a Lua console (hence the c_ function-call + # syntax below, not plain-text RCON commands) reached only via stdin — + # there is no RCON (rcon.protocol: none above), so every action sets + # transport: stdin explicitly. Stdin actions are fire-and-forget: the + # agent writes to the container's stdin and returns immediately with no + # command output; any response appears in the Console tab instead. + actions: + - id: broadcast + displayName: Broadcast message + description: Send a chat message to everyone on the server. + icon: megaphone + group: Server + transport: stdin + command: 'c_announce("{{.Params.message}}")' + params: + - name: message + displayName: Message + type: string + required: true + - id: save-world + displayName: Save world + description: Flush the world to disk now. + icon: save + group: World + transport: stdin + command: "c_save()" + - id: rollback + displayName: Rollback world + description: Roll the world back by N day-saves. Players lose progress since then. + icon: rotate-ccw + group: World + danger: true + confirm: true + transport: stdin + command: "c_rollback({{.Params.days}})" + params: + - name: days + displayName: Days + type: int + default: "1" + required: true configSchema: - name: DST_CLUSTER_TOKEN displayName: Cluster Token diff --git a/enshrouded/module.yaml b/enshrouded/module.yaml index c98decc..86b129a 100644 --- a/enshrouded/module.yaml +++ b/enshrouded/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: enshrouded displayName: Enshrouded -version: 1.0.1 +version: 1.0.2 game: enshrouded categories: [Survival, Co-op, Building, Adventure] summary: Enshrouded dedicated server. diff --git a/enshrouded/template.yaml b/enshrouded/template.yaml index 3bb92f3..f433bc6 100644 --- a/enshrouded/template.yaml +++ b/enshrouded/template.yaml @@ -7,7 +7,7 @@ metadata: spec: displayName: Enshrouded game: enshrouded - version: 1.0.1 + version: 1.0.2 categories: [Survival, Co-op, Building, Adventure] accentColor: "#2a4b7c" description: Enshrouded dedicated server. @@ -27,6 +27,8 @@ spec: resources: requests: {cpu: "2", memory: 8Gi} limits: {cpu: "4", memory: 16Gi} + # No remote console of any kind (no RCON, no stdin), so no capabilities + # block and no actions — there is no transport to run a command over. rcon: protocol: none consoleMode: none diff --git a/factorio/module.yaml b/factorio/module.yaml index 61cfa62..27a700d 100644 --- a/factorio/module.yaml +++ b/factorio/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: factorio displayName: Factorio (Headless) -version: 1.1.1 +version: 1.1.2 game: factorio categories: [Simulation, Building, Sandbox, Modded, Co-op] summary: Factorio headless server (factoriotools/factorio) with a stable/latest/pinned channel picker, server-settings managed from the wizard, and a mods volume with in-app Factorio mod portal browse. Console via container stdin. diff --git a/factorio/template.yaml b/factorio/template.yaml index 9cdf28a..9b44589 100644 --- a/factorio/template.yaml +++ b/factorio/template.yaml @@ -28,7 +28,7 @@ spec: displayName: Factorio (Headless) game: factorio # Kept in lockstep with module.yaml's bundle version. - version: 1.1.1 + version: 1.1.2 categories: [Simulation, Building, Sandbox, Modded, Co-op] # Brand color the dashboard tints this game's icon/accents with. accentColor: "#e39827" @@ -108,6 +108,18 @@ spec: list: command: "/players online" entryRegex: "^\\s+(.+?) \\(online\\)$" + # Factorio's admin console genuinely supports very few commands. There is + # no plain say/broadcast console command — a chat broadcast needs a Lua + # /silent-command game.print(...), which we haven't verified, so it isn't + # shipped — and no console time/weather control. save-world (/save) is + # the one action we could verify; shipping only it is the honest set. + actions: + - id: save-world + displayName: Save game + description: Flush the world to disk now. + icon: save + group: World + command: "/save" # Factorio loads .zip mods straight from the mods dir (no extraction). # The in-app browser searches the official mod portal; downloads need # the player's own factorio.com credentials, so the panel hands off to diff --git a/garrys-mod/module.yaml b/garrys-mod/module.yaml index 6f757d7..3ba4e85 100644 --- a/garrys-mod/module.yaml +++ b/garrys-mod/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: garrys-mod displayName: Garry's Mod -version: 2.0.1 +version: 2.0.2 game: garrys-mod categories: [Sandbox, Modded, Creative] summary: Garry's Mod dedicated server (ceifa/garrysmod) with Workshop addon collections via launch args. No RCON console or panel-managed addons — this image bakes them in. diff --git a/garrys-mod/template.yaml b/garrys-mod/template.yaml index b3b693f..e69ae1d 100644 --- a/garrys-mod/template.yaml +++ b/garrys-mod/template.yaml @@ -79,7 +79,7 @@ metadata: spec: displayName: Garry's Mod game: garrys-mod - version: 2.0.1 + version: 2.0.2 categories: [Sandbox, Modded, Creative] accentColor: "#1194f0" description: | @@ -137,7 +137,9 @@ spec: memory: 4Gi # No RCON — see the header comment for why (baked cfg/, no password env, - # and the agent's rcon-port wiring is unfixed on top of that anyway). + # and the agent's rcon-port wiring is unfixed on top of that anyway). No + # capabilities block either: with no console reachable at all, there is no + # transport for a capabilities.actions command to run over. rcon: protocol: none diff --git a/palworld/README.md b/palworld/README.md index a97e6f7..e33c02b 100644 --- a/palworld/README.md +++ b/palworld/README.md @@ -22,21 +22,29 @@ game version (that always tracks Steam): ## Console & admin -RCON is enabled (Source protocol, port 25575). The operator generates a +RCON is **deprecated** by Palworld upstream ("scheduled to stop functioning +in an upcoming update" per docs.palworldgame.com), so this module talks to +Palworld's **REST admin API** instead (port 8212). The operator generates a per-server password and injects it as `ADMIN_PASSWORD`, which the image -uses for **both** RCON and the in-game admin password — read it from the -`-rcon` Secret if you need to `/AdminPassword` in game. - -Graceful stop runs `Save` then `Shutdown 1` over RCON, so the server never -takes a SIGTERM mid-save. Backups snapshot the data volume directly (no -quiesce — Palworld's `Save` is a one-shot flush, not a pausable state); -freshness therefore rides the server's autosave interval, and the "Save -world" action forces a flush on demand. - -There is **no Players tab** for Palworld yet: its RCON has no -Minecraft-style `list` command (`ShowPlayers` returns CSV the agent's -player poller doesn't parse), so the tab would render broken. Kick/ban via -the Console tab (`KickPlayer ` / `BanPlayer `) if needed. +uses for **both** the REST API and the in-game admin password — read it +from the `-rcon` Secret if you need to `/AdminPassword` in game. + +Graceful stop runs `save` then `shutdown 1` over the REST API, so the +server never takes a SIGTERM mid-save. Backups snapshot the data volume +directly (no quiesce — Palworld's `save` is a one-shot flush, not a +pausable state); freshness therefore rides the server's autosave interval, +and the "Save world" action forces a flush on demand. + +**Players tab** shows who's online (`GET /v1/api/players`). There's no +kick/ban here, though: the REST API moderates by a player's `userId` +(e.g. `steam_12345`), a different field from the display name the Players +tab lists, and Gameplane only carries one value through that pipeline — so +a kick/ban button here would target the wrong (or no) account. Use the +in-game admin commands, or the REST API directly, for kick/ban. + +**Quick actions**: Broadcast message, Save world, and Announce restart +(counts down, then shuts down cleanly) — see the server detail page's +Actions panel. ## Mods (.pak) diff --git a/palworld/module.yaml b/palworld/module.yaml index 9a9ac88..622eb9e 100644 --- a/palworld/module.yaml +++ b/palworld/module.yaml @@ -1,10 +1,10 @@ apiVersion: gameplane.local/module/v1 name: palworld displayName: Palworld (Dedicated) -version: 1.1.2 +version: 1.2.0 game: palworld categories: [Survival, Sandbox, Co-op] -summary: Palworld dedicated server (thijsvanloef/palworld-server-docker) with RCON console, save-aware graceful stop, and a .pak mod volume with archive install. First boot downloads the server via steamcmd. +summary: Palworld dedicated server (thijsvanloef/palworld-server-docker) with a REST-API console (RCON is deprecated upstream), save-aware graceful stop, and a .pak mod volume with archive install. First boot downloads the server via steamcmd. homepage: https://www.pocketpair.jp/palworld license: MIT gameplaneMinVersion: 0.2.0 diff --git a/palworld/template.yaml b/palworld/template.yaml index 30f69ac..92a716c 100644 --- a/palworld/template.yaml +++ b/palworld/template.yaml @@ -10,10 +10,17 @@ # always tracks Steam): latest, the v2 major line, or a pinned wrapper # release for change-averse servers. # -# RCON is native Source protocol; the image uses ADMIN_PASSWORD as the RCON -# password, so the operator-generated per-server secret doubles as the -# in-game admin password. The players.list capability parses ShowPlayers' -# CSV output to populate a Players tab. +# RCON is OFFICIALLY DEPRECATED upstream (docs.palworldgame.com: "scheduled +# to stop functioning in an upcoming update"), so this module now runs +# Palworld's REST admin API instead (rcon.protocol: palworld). The REST API +# authenticates with HTTP Basic (user "admin") against the server's +# AdminPassword — the same secret RCON used, so the operator-generated +# password still lands via ADMIN_PASSWORD, unchanged. The API is HTTP-only +# (no TLS), which is fine here: the agent dials it pod-local, never over the +# network. It's also strictly better than RCON for this game: the REST +# player list returns real per-player records (RCON's ShowPlayers was a CSV +# scrape), and its announce endpoint keeps spaces in the message, where +# RCON's Broadcast truncated at the first space. # # Cluster-scoped; apply once per cluster: # kubectl apply -f modules/palworld/template.yaml @@ -28,7 +35,7 @@ spec: displayName: Palworld (Dedicated) game: palworld # Kept in lockstep with module.yaml's bundle version. - version: 1.1.2 + version: 1.2.0 categories: [Survival, Sandbox, Co-op] # Brand color the dashboard tints this game's icon/accents with. accentColor: "#3d9dd9" @@ -36,7 +43,8 @@ spec: Palworld dedicated server using [thijsvanloef/palworld-server-docker](https://github.com/thijsvanloef/palworld-server-docker). The game installs via steamcmd on first boot (several GB — give it a few - minutes). RCON console, a save-then-shutdown graceful stop, and a `.pak` mod volume + minutes). Console via Palworld's REST admin API (RCON is deprecated + upstream), a save-then-shutdown graceful stop, and a `.pak` mod volume with archive install from the Mods tab. # Fallback image when a server selects no version. versions[] below is the @@ -55,10 +63,10 @@ spec: fsGroup: 1000 env: - - name: RCON_ENABLED + - name: REST_API_ENABLED value: "true" - - name: RCON_PORT - value: "25575" + - name: REST_API_PORT + value: "8212" - name: PORT value: "8211" - name: QUERY_PORT @@ -77,9 +85,10 @@ spec: containerPort: 27015 protocol: UDP advertise: false - - name: rcon - containerPort: 25575 + - name: rest-api + containerPort: 8212 protocol: TCP + # An admin API must never be exposed publicly. advertise: false # The whole server install lives on the data volume (steamcmd target dir), @@ -97,11 +106,11 @@ spec: memory: 12Gi rcon: - protocol: source - port: 25575 - # PasswordSecretRef left unset — the operator generates a password into - # "-rcon" and injects it as ADMIN_PASSWORD, which the image - # uses as both the RCON and in-game admin password. + protocol: palworld + port: 8212 + # The REST API authenticates with HTTP Basic (user "admin") against the + # server's AdminPassword — the same secret RCON used, so the operator's + # generated password still lands via ADMIN_PASSWORD, unchanged. passwordEnv: ADMIN_PASSWORD # Wrapper-image channels. The game version always tracks Steam (steamcmd @@ -124,24 +133,67 @@ spec: capabilities: players: + # /v1/api/players returns JSON; the agent applies entryRegex with + # FindAll across the whole reply, so this lifts out every player's + # display name. list: - command: "ShowPlayers" - entryRegex: "^([^,]+),[0-9]+," - # No quiesce block: Palworld's "Save" is a one-shot flush, not a + command: "players" + entryRegex: '"name"\s*:\s*"(?P[^"]*)"' + # No kick/ban: Palworld's REST kick/ban moderate by userId (e.g. + # "steam_12345"), a field distinct from the display "name" captured + # above — and the agent's players-list pipeline has only one captured + # value, reused both for the Players tab display and for {{.Player}} + # in a kick/ban template. Capturing "name" here means a kick/ban + # action would send the display name where the REST API expects a + # userId, silently targeting nothing or the wrong account. Same + # principle as DayZ (BE moderates by player number, not name): omit + # rather than ship a button that can't reliably work. + # No quiesce block: Palworld's "save" is a one-shot flush, not a # pausable state, so the pause/resume quiesce model doesn't fit (the # operator requires both a quiesce and an unquiesce command). Backups # snapshot the volume while the server autosaves; lifecycle.stop below - # saves on graceful stop. save-then-shutdown on stop — Palworld's - # Shutdown takes seconds + a message; 1s is effectively "now" after a - # completed Save. + # saves on graceful stop. lifecycle: - stop: ["Save", "Shutdown 1"] + stop: ["save", "shutdown 1"] actions: + - id: broadcast + displayName: Broadcast message + description: Send a chat message to everyone on the server. + icon: megaphone + group: Server + # Unlike the deprecated RCON Broadcast (which truncated at the + # first space), the REST announce endpoint keeps the full message. + command: "announce {{.Params.message}}" + params: + - name: message + displayName: Message + type: string + required: true - id: save-world displayName: Save world description: Flush the world to disk now. icon: save - command: "Save" + group: World + command: "save" + - id: announce-restart + displayName: Announce restart + description: Warn players, then shut down after a countdown so the operator restarts cleanly. + icon: rotate-ccw + group: Server + danger: true + confirm: true + command: "shutdown {{.Params.seconds}} {{.Params.message}}" + params: + - name: seconds + displayName: Countdown (seconds) + type: int + default: "60" + required: true + - name: message + displayName: Message + type: string + default: "Server restarting shortly." + required: true # Engine-native .pak mods, loaded from Pal/Content/Paks/~mods inside the # server install. URL installs are limited to GitHub (most server-side # pak mods publish there); local files can be added via upload. UE4SS @@ -161,22 +213,22 @@ spec: probes: # First boot = multi-GB steamcmd download before anything listens, so - # the startup probe budgets ~30 minutes. RCON's TCP port is the only - # reliable liveness signal (game traffic is UDP). + # the startup probe budgets ~30 minutes. The REST API's TCP port is the + # only reliable liveness signal (game traffic is UDP). startup: tcpSocket: - port: rcon + port: rest-api initialDelaySeconds: 30 periodSeconds: 15 failureThreshold: 120 readiness: tcpSocket: - port: rcon + port: rest-api periodSeconds: 10 failureThreshold: 6 liveness: tcpSocket: - port: rcon + port: rest-api periodSeconds: 30 failureThreshold: 5 diff --git a/rust/module.yaml b/rust/module.yaml index 5ae231c..ad500e8 100644 --- a/rust/module.yaml +++ b/rust/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: rust displayName: Rust -version: 1.0.3 +version: 1.1.0 game: rust categories: [Survival, Shooter, PvP] summary: Rust dedicated server (didstopia/rust-server) with a pty console, Oxide plugin volume, and a save-then-quit stop sequence. diff --git a/rust/template.yaml b/rust/template.yaml index 2670139..5cd84be 100644 --- a/rust/template.yaml +++ b/rust/template.yaml @@ -25,15 +25,15 @@ metadata: spec: displayName: Rust game: rust - version: 1.0.2 + version: 1.1.0 categories: [Survival, Shooter, PvP] accentColor: "#ce422b" description: | Rust dedicated server using [didstopia/rust-server](https://github.com/Didstopia/rust-server). - Console attaches to container stdin (pty) — Rust's RCON is - WebSocket-only and unsupported here. Oxide plugins are supported via - the version picker. + Console, players list and moderation run over Rust's WebSocket RCON + (Facepunch's webrcon). Oxide plugins are supported via the version + picker. image: didstopia/rust-server:latest @@ -81,6 +81,36 @@ spec: entryRegex: '"DisplayName":"(?P[^"]*)"' kick: 'kick "{{.Player}}"{{if .Reason}} "{{.Reason}}"{{end}}' ban: 'ban "{{.Player}}"{{if .Reason}} "{{.Reason}}"{{end}}' + actions: + - id: broadcast + displayName: Broadcast message + description: Send a chat message to everyone on the server. + icon: megaphone + group: Server + command: 'say "{{.Params.message}}"' + params: + - name: message + displayName: Message + type: string + required: true + - id: save-world + displayName: Save world + description: Flush the world to disk now. + icon: save + group: World + command: "server.save" + - id: set-time + displayName: Set time + icon: clock + group: World + command: "env.time {{.Params.time}}" + params: + - name: time + displayName: Time + description: Hour of day, 0-24. + type: int + default: "12" + required: true mods: loaders: oxide: diff --git a/satisfactory/module.yaml b/satisfactory/module.yaml index 0521034..148f391 100644 --- a/satisfactory/module.yaml +++ b/satisfactory/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: satisfactory displayName: Satisfactory (Dedicated) -version: 1.1.0 +version: 1.1.1 game: satisfactory categories: [Simulation, Building, Sandbox, Co-op] summary: Satisfactory dedicated server (wolveix/satisfactory-server) with a stable/experimental branch picker. Env-configured; installs via steamcmd on first boot. diff --git a/satisfactory/template.yaml b/satisfactory/template.yaml index 5cfaa53..3e07f05 100644 --- a/satisfactory/template.yaml +++ b/satisfactory/template.yaml @@ -48,7 +48,7 @@ spec: displayName: Satisfactory (Dedicated) game: satisfactory # Kept in lockstep with module.yaml's bundle version. - version: 1.0.1 + version: 1.1.1 categories: [Simulation, Building, Sandbox, Co-op] # Brand color the dashboard tints this game's icon/accents with. accentColor: "#e59344" @@ -56,9 +56,11 @@ spec: Satisfactory dedicated server using [wolveix/satisfactory-server](https://github.com/wolveix/satisfactory-server). The game installs via steamcmd on first boot (several GB — give it a few - minutes; progress streams to the Logs tab). No RCON/console: configure the - server from the wizard's env fields and manage it in-game. Choose the - stable or experimental Steam branch in the New Server wizard. + minutes; progress streams to the Logs tab). Console runs over + Satisfactory's own HTTPS admin API and needs a one-time in-game server + claim first (see the module README). The API exposes no player list, so + there's no Players tab. Choose the stable or experimental Steam branch + in the New Server wizard. # Fallback image when a server selects no version. versions[] below is the # authoritative source for the wizard's picker. @@ -140,6 +142,27 @@ spec: - name: STEAMBETA value: "true" + # Satisfactory's admin API (see rcon.protocol above) is deliberately + # sparse — no broadcast, no time control, and no player enumeration + # (which is also why there's no capabilities.players here). save-game, + # via the RunCommand API, is the one verified action. Like the Console + # tab, it stays inert until the one-time in-game claim + admin-password + # file documented in the header comment above is done. + capabilities: + actions: + - id: save-game + displayName: Save game + icon: save + group: World + command: "server.SaveGame {{.Params.name}}" + params: + - name: name + displayName: Save name + description: Save file name. + type: string + default: "gameplane" + required: true + # Field names match wolveix/satisfactory-server env vars exactly. configSchema: - name: MAXPLAYERS diff --git a/valheim/module.yaml b/valheim/module.yaml index 2ad5f04..7dba4f1 100644 --- a/valheim/module.yaml +++ b/valheim/module.yaml @@ -1,7 +1,7 @@ apiVersion: gameplane.local/module/v1 name: valheim displayName: Valheim (Dedicated) -version: 2.3.2 +version: 2.3.3 game: valheim categories: [Survival, Co-op, Building] summary: Valheim dedicated server (lloesche/valheim-server) with a stable/public-test channel picker, a BepInEx mod volume, and in-app Thunderstore browse. Crossplay-friendly. diff --git a/valheim/template.yaml b/valheim/template.yaml index dcc9966..5886e6d 100644 --- a/valheim/template.yaml +++ b/valheim/template.yaml @@ -21,7 +21,7 @@ metadata: spec: displayName: Valheim (Dedicated) game: valheim - version: 2.3.2 + version: 2.3.3 categories: [Survival, Co-op, Building] # Brand color the dashboard tints this game's icon/accents with. accentColor: "#d99a2b" @@ -107,7 +107,11 @@ spec: periodSeconds: 15 failureThreshold: 10 - # No RCON, so no players/quiesce/actions/status capabilities — mods only. + # No RCON, so no players/quiesce/status capabilities — mods only. No + # actions either: despite consoleMode: pty, research confirms the Valheim + # dedicated server binary has NO stdin command input at all — the pty + # here only streams stdout, it never reads commands back. Admin commands + # are in-game only, via the F5 console, so no quick action is possible. # BepInEx plugins live under /config/bepinex/plugins; the image loads them # when BEPINEX is enabled (see the config field below). capabilities: diff --git a/validate.py b/validate.py index e4f1e91..cf5dbff 100644 --- a/validate.py +++ b/validate.py @@ -124,7 +124,7 @@ # the GameTemplate CRD's rcon.protocol enum and agent/internal/rcon/. A protocol # listed here but not implemented lets a module ship a console that never # connects, so this list is deliberately conservative. -RCON_PROTOCOLS = ("source", "telnet", "websocket", "battleye", "satisfactory", "none") +RCON_PROTOCOLS = ("source", "telnet", "websocket", "battleye", "satisfactory", "palworld", "none") From cf400efae0bfffd86be2d785bf1b8a7f590976aa Mon Sep 17 00:00:00 2001 From: valgulnecron <39313199+ValgulNecron@users.noreply.github.com> Date: Thu, 16 Jul 2026 20:49:25 +0200 Subject: [PATCH 3/3] docs(dayz): the README still said DayZ had no console MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Its 'No console, no RCON' section claimed the agent has no BattlEye client and that rcon.protocol is none — both untrue since the battleye protocol landed. The file was written before that and had never been committed, so it slipped through. Now describes the real setup: battleye on UDP 2305 via ServerZ's BE_* env, loopback-pinned, and why kick/ban and quick actions are deliberately absent. Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com> --- dayz/README.md | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/dayz/README.md b/dayz/README.md index 7a4c2c8..a27512f 100644 --- a/dayz/README.md +++ b/dayz/README.md @@ -23,18 +23,27 @@ maintainer's own infrastructure rather than a major registry. If that's a concern for your deployment, mirror the image into your own registry before installing. -## No console, no RCON - -DayZ speaks proprietary **BattlEye RCon**, not Source RCON or telnet — -Gameplane's agent has no client for it, so `rcon.protocol: none`. The -game binary also has no interactive admin console of its own (admin is -BattlEye RCon, an external tool, or an in-game admin mod only), so no -`consoleMode` is set either — the Console tab shows "no live console." -With no reachable transport, there is no `capabilities` block at all: no -lifecycle stop sequence, no moderation, no quiesce. The server relies on -SIGTERM + DayZ's own autosave; whether that's fully safe under a bare -SIGTERM is not documented anywhere authoritative that was found — -consider a generous `stopGracePeriodSeconds` on the GameServer. +## Console and admin + +DayZ speaks proprietary **BattlEye RCon** — not Source RCON or telnet. +Gameplane's agent implements it (`rcon.protocol: battleye`, UDP 2305), so +the Console tab and the players list both work. ServerZ only writes a +`beserver_x64.cfg` when one of `BE_IP`/`BE_PORT`/`BE_PASSWORD` is set, so +this template sets all three: the operator injects the generated password +into `BE_PASSWORD`, and `BE_IP` pins the listener to loopback — the agent +sidecar shares the pod's network namespace and reaches it there, while an +RCon port that isn't on a public interface can't be brute-forced. + +**No kick/ban buttons, and no quick actions.** BattlEye targets players by +*number* rather than name, so wiring moderation to the name the list +returns would risk hitting the wrong player. Its command set is also too +restricted to verify a broadcast for DayZ specifically, so no quick actions +are declared rather than shipping buttons that may error. + +**No lifecycle stop sequence.** DayZ persists continuously rather than on a +save command, so a SIGTERM isn't the data-loss risk it is for Minecraft or +Valheim; a stop sequence that doesn't reliably work across builds would be +a lie. Consider a generous `stopGracePeriodSeconds` on the GameServer. ## Mods