Releases: heyvaldemar/cs2-server-docker-compose
Release list
v1.2.0
Added
CS2_SERVER_DELTATICKS_ENFORCEandCS2_SERVER_TV_RELAYVOICE. Upstream added both in 5.0.0 with defaults baked into the image, so the server behaves the same whether or not they are set. They are wired through and documented because a knob nobody can find is a knob that does not exist. The second one decides whether GOTV relays player voice, which is a privacy question on a public server rather than a tuning one.
Changed
joedwards32/cs2:4.0.1moved tojoedwards32/cs2:5.0.0. The freshness check reported the lag; the deploy job booted the stack on the new image before this landed.- The container's base runtime changed, and nothing in this file had to. Upstream marked 5.0.0 breaking for moving off Steam Runtime "sniper" onto steamrt4, and for replacing the RCON forwarder
simpleproxywithsocat. Both live inside the image: the ports, the variables and the compose interface are unchanged, and thesocatform forks per connection where the old one did not. The review was right to stop on that marker: the release notes carry the title and nothing else, so what!meant could not be read from them. It is readable from the change itself — upstream PR 218 is a directory rename plus two lines of Dockerfile, and that is what settled it.
Upgrading
git pull (or ./update.sh), then docker compose up -d. The container is recreated on the new image; the game files and .env are untouched.
Upstream calls 5.0.0 breaking because the image moved off Steam Runtime "sniper" onto steamrt4 and replaced the RCON forwarder simpleproxy with socat. Nothing in this repository had to change for it: same ports, same variables, same compose interface. The first start after the move re-verifies the game files through SteamCMD, so give it the usual long start period before calling it unhealthy.
Two new optional variables come with 5.0.0, both already at the image's own defaults. TV_RELAYVOICE is the one worth a look: it decides whether GOTV relays player voice.
Full history in CHANGELOG.md.
v1.1.0
Added
update.sh: move between release tags on purpose. It updates to the latest release (a combination this repository's CI has booted and smoke-tested), refuses to cross a major version unattended, refuses to run over local changes, and names any new required variable before anything has moved.--dry-runsays what would happen.
Upgrading
git pull (or ./update.sh). Nothing running changes: this release adds or extends the update script and touches no image pin.
Full history in CHANGELOG.md.
v1.0.1
Fixed
- The freshness job was watching the wrong pins. It looped over
MINECRAFT_SERVER_IMAGE_TAGandMINECRAFT_SERVER_BACKUP_IMAGE_TAG, names
carried over from the template this workflow was adapted from and absent from
the compose file here. The CS2 pin was never compared against the registry:
the one thing the job exists to do was not happening, while the job failed
daily for an unrelated reason. - An absent variable no longer reports itself as a registry failure. An
empty pin fell through to the image lookup and surfaced as "did not resolve
after three attempts", which points at Docker Hub. The variable is checked
first now and the error names this file, so the same mistake is loud instead
of misleading.
Upgrading
Nothing to do on a running server: this release changes CI only. git pull picks it up.
Full history in CHANGELOG.md.
v1.0.0
Added
- A Counter-Strike 2 dedicated server, image pinned by digest as an
interpolation default, sogit pulldelivers the version this repository has
tested and.envoverrides survive it. - A health check that matches the game exactly rather than as a substring.
Two commands run in the container:cs2, the game, andcs2.sh, its
supervisor. A substring search is satisfied by either, so the game can crash
and leave the wrapper standing while the container reports healthy — and
docker does not restart an unhealthy container by itself, so nothing else
catches it.tests/e2e-healthcheck.shproves the distinction against a real
container, and no CS2 download is involved. - The game volume declared external, so
docker compose down -vcannot
delete 60 GB of SteamCMD content.down -vis the command everyone reaches
for when a stack misbehaves, and on a metered connection that content comes
back twice: once in bytes, once on the bill. - The published port equal to the port the server binds. Steam's list
records what the server bound, not what was forwarded, so a mismatch hands
players an address where a different server answers. - Measured limits. A populated server sits near 950 MB; the ceiling exists
so a leak here cannot get some other container OOM-killed in its place. - A 90 minute start period, because the first boot downloads the game.
- Deployment Verification CI: shell and workflow linting, a Trivy scan of
the pinned image, a daily freshness check on the pin, and the health-check
suite. It deliberately does not boot the game: a runner has neither the disk
for 60 GB nor the hours, and a test that pretends otherwise never runs.