feat(games): add Valheim #17

Closed
gbr-bot wants to merge 1 commits from draft/valheim into main
pull from: draft/valheim
Member

Drafted by the GBR AI builder. Review before merging: check the settings, ports and descriptions against the game's documentation.

  • Game: Valheim — Valheim Dedicated Server
  • Image: cm2network/steamcmd, Steam app 896660
  • Model rounds: 1

Checked for real

  • image cm2network/steamcmd exists
  • image lloesche/valheim-server exists
  • image ghcr.io/community-valheim-tools/valheim-server exists
  • image pfeiffermax/valheim-dedicated-server exists
  • Steam app 896660 is "Valheim Dedicated Server"
  • first boot of cm2network/steamcmd: running and quiet for 121s after 188s; stopped gracefully
  • boot test with the node-agent: PASSED: READY: 10/26/2026 00:51:39: Loading: Done. Total seconds sinze ZNet start: 44.555916, Genloc duration: 36894.628 ms, (Total genloc time: 00:00:37.0968340, locations: 183, iterations: 0)

Notes from research: Crossplay is enabled with the -crossplay launch flag (allows Xbox, PS5, Switch 2, and Game Pass players to join; a join code is printed to the server log). BepInEx and ValheimPlus mods are supported via the lloesche and community-valheim-tools images. Server password must be at least 5 characters or valheim_server.x86_64 refuses to start. There is no config file; all settings are launch arguments. World data lives in a worlds/ subfolder under the -savedir path. Granting CAP_SYS_NICE is optional but avoids a thread-priority warning. The pfeiffermax image explicitly runs as a non-root user; lloesche and community-valheim-tools images also support non-root operation. First start downloads ~1 GB from Steam.

Sources

Replaces #13 (closed, branch deleted).

Drafted by the GBR AI builder. **Review before merging**: check the settings, ports and descriptions against the game's documentation. - Game: **Valheim** — Valheim Dedicated Server - Image: `cm2network/steamcmd`, Steam app 896660 - Model rounds: 1 **Checked for real** - image cm2network/steamcmd exists - image lloesche/valheim-server exists - image ghcr.io/community-valheim-tools/valheim-server exists - image pfeiffermax/valheim-dedicated-server exists - Steam app 896660 is "Valheim Dedicated Server" - first boot of cm2network/steamcmd: running and quiet for 121s after 188s; stopped gracefully - boot test with the node-agent: PASSED: READY: 10/26/2026 00:51:39: Loading: Done. Total seconds sinze ZNet start: 44.555916, Genloc duration: 36894.628 ms, (Total genloc time: 00:00:37.0968340, locations: 183, iterations: 0) **Notes from research:** Crossplay is enabled with the -crossplay launch flag (allows Xbox, PS5, Switch 2, and Game Pass players to join; a join code is printed to the server log). BepInEx and ValheimPlus mods are supported via the lloesche and community-valheim-tools images. Server password must be at least 5 characters or valheim_server.x86_64 refuses to start. There is no config file; all settings are launch arguments. World data lives in a worlds/ subfolder under the -savedir path. Granting CAP_SYS_NICE is optional but avoids a thread-priority warning. The pfeiffermax image explicitly runs as a non-root user; lloesche and community-valheim-tools images also support non-root operation. First start downloads ~1 GB from Steam. **Sources** - https://hub.docker.com/r/lloesche/valheim-server - https://github.com/community-valheim-tools/valheim-server-docker - https://steamdb.info/app/896660/info/ - https://max-pfeiffer.github.io/how-to-set-up-a-valheim-dedicated-server-using-docker-and-docker-compose.html - https://hosthavoc.com/wiki/game-servers/valheim/enable-crossplay - https://www.valheimgame.com/support/a-guide-to-dedicated-servers/ - https://netrouting.com/gaming-industry/setup-valheim/ - https://shattered.io/valheim-dedicated-server/ - https://connecthosting.net/blog/valheim-dedicated-server-setup-guide - https://www.gameserverkings.com/knowledge-base/valheim/configuration-overview/ - https://natchecker.com/blog/valheim-dedicated-server-port-forwarding Replaces #13 (closed, branch deleted).
gbr-bot added 1 commit 2026-10-26 00:51:41 +00:00
feat(games): draft Valheim
Validate game templates / validate (push) Successful in 21s
Validate game templates / boot-test (push) Successful in 2m26s
Validate game templates / publish (push) Skipped
bc0bac5e89
Drafted and boot-tested by the GBR builder (job 4b174b2d-48ad-455d-b979-6c36e2b0ce9f).
git_ai_bot left a comment
Member

🤖 AI Code Review

Review: feat(games): add Valheim

1. Blocking issues

None identified. The configuration is consistent with the platform's patterns, the ports are correct (2456/udp game, 2457/udp RCON), the Steam app ID is verified, and the boot test passed.

2. Non-blocking suggestions

JoinPassword schema validation gap. The description says "Must be at least 5 characters," and the PR notes confirm valheim_server.x86_64 refuses to start with a shorter password. The schema has no minLength constraint. A user typing a 3-character password will get a server that repeatedly crashes rather than a validation error. Consider adding a constraint (or at minimum a pattern like ^(.{5,})?$ to allow empty-or-5+). If the schema validator doesn't support conditional length rules, a description is the least we can do, which you already have — so this is more of a "nice to have" than a hard requirement.

CROSSPLAY string comparison is serialization-fragile.

[ "${CROSSPLAY}" = "true" ]

This works if the platform serialises booleans as the lowercase strings "true"/"false". If a future refactor switches to 1/0, yes/no, or Go's True/False, the crossplay flag silently stops being applied with no error. Worth confirming with the runner team how boolean config values are rendered into env vars, and if possible using a case-insensitive or multi-value check:

case "${CROSSPLAY}" in true|True|TRUE|1|yes|Yes) args+=(-crossplay) ;; esac

requiredDiskMb: 4096 may be tight for modded servers. The PR notes mention BepInEx + ValheimPlus as supported via alternative images. If this config is ever extended to those images, mod files plus world data can exceed 4 GB. Not blocking since the default image is vanilla, but worth a comment or a higher ceiling if the platform allows.

Consider documenting the /server savedir assumption. The startup command hardcodes -savedir /server. If the platform's volume-mount convention changes or a user's instance uses a different path, the server will write to an ephemeral layer. This is probably a platform-level guarantee, but a brief comment in the YAML (e.g. # world data persisted via mounted volume at /server) would help future maintainers.

3. Tests

  • The CI boot test (test.yaml) exercises the default path (no password, no crossplay). The two conditional branches in the startup command — [ -n "${JOIN_PASSWORD}" ] and [ "${CROSSPLAY}" = "true" ] — are never exercised by the passing test. Adding a second test case (or a matrix) with config: {JoinPassword: "test123", Crossplay: true} would verify those array-append paths and confirm the server actually starts with those flags.
  • The readyPattern is verified against one sample line. The pattern is specific enough that this is low-risk, but it would be worth confirming it still matches if Valve ever changes the "Loading: Done" log line (the typo "sinze" is in their binary, so it's unlikely to change, but the format around it could).

4. Overall assessment

The configuration is well-structured, the research notes are thorough, the ports/install-method/ready-pattern are correct, and the boot test passed. The two items I'd most like to see addressed before merge are: (1) confirming the boolean serialization contract for CROSSPLAY so the flag isn't silently dropped, and (2) adding at least one CI test case that exercises the password and crossplay code paths. Neither is a correctness bug in the current test matrix, but both are latent failure modes that would be confusing to debug in production. Otherwise, good to merge.


Automated review by AI Git Bot

## 🤖 AI Code Review ## Review: feat(games): add Valheim ### 1. Blocking issues None identified. The configuration is consistent with the platform's patterns, the ports are correct (2456/udp game, 2457/udp RCON), the Steam app ID is verified, and the boot test passed. ### 2. Non-blocking suggestions **JoinPassword schema validation gap.** The description says "Must be at least 5 characters," and the PR notes confirm `valheim_server.x86_64` *refuses to start* with a shorter password. The schema has no `minLength` constraint. A user typing a 3-character password will get a server that repeatedly crashes rather than a validation error. Consider adding a constraint (or at minimum a `pattern` like `^(.{5,})?$` to allow empty-or-5+). If the schema validator doesn't support conditional length rules, a `description` is the least we can do, which you already have — so this is more of a "nice to have" than a hard requirement. **CROSSPLAY string comparison is serialization-fragile.** ```bash [ "${CROSSPLAY}" = "true" ] ``` This works if the platform serialises booleans as the lowercase strings `"true"`/`"false"`. If a future refactor switches to `1`/`0`, `yes`/`no`, or Go's `True`/`False`, the crossplay flag silently stops being applied with no error. Worth confirming with the runner team how boolean config values are rendered into env vars, and if possible using a case-insensitive or multi-value check: ```bash case "${CROSSPLAY}" in true|True|TRUE|1|yes|Yes) args+=(-crossplay) ;; esac ``` **`requiredDiskMb: 4096` may be tight for modded servers.** The PR notes mention BepInEx + ValheimPlus as supported via alternative images. If this config is ever extended to those images, mod files plus world data can exceed 4 GB. Not blocking since the default image is vanilla, but worth a comment or a higher ceiling if the platform allows. **Consider documenting the `/server` savedir assumption.** The startup command hardcodes `-savedir /server`. If the platform's volume-mount convention changes or a user's instance uses a different path, the server will write to an ephemeral layer. This is probably a platform-level guarantee, but a brief comment in the YAML (e.g. `# world data persisted via mounted volume at /server`) would help future maintainers. ### 3. Tests - The CI boot test (`test.yaml`) exercises the default path (no password, no crossplay). The two conditional branches in the startup command — `[ -n "${JOIN_PASSWORD}" ]` and `[ "${CROSSPLAY}" = "true" ]` — are never exercised by the passing test. Adding a second test case (or a matrix) with `config: {JoinPassword: "test123", Crossplay: true}` would verify those array-append paths and confirm the server actually starts with those flags. - The `readyPattern` is verified against one sample line. The pattern is specific enough that this is low-risk, but it would be worth confirming it still matches if Valve ever changes the "Loading: Done" log line (the typo "sinze" is in their binary, so it's unlikely to change, but the format around it could). ### 4. Overall assessment The configuration is well-structured, the research notes are thorough, the ports/install-method/ready-pattern are correct, and the boot test passed. The two items I'd most like to see addressed before merge are: (1) confirming the boolean serialization contract for `CROSSPLAY` so the flag isn't silently dropped, and (2) adding at least one CI test case that exercises the password and crossplay code paths. Neither is a correctness bug in the current test matrix, but both are latent failure modes that would be confusing to debug in production. Otherwise, good to merge. --- *Automated review by AI Git Bot*
gbr-bot closed this pull request 2026-10-26 01:54:21 +00:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gbreed-public/gbr-games#17