Skip to content

Releases: heyvaldemar/tf2-server-docker-compose

v1.2.0

Choose a tag to compare

@heyvaldemar heyvaldemar released this 22 Sep 14:08

Added

  • TF2_SERVER_TIMEZONE: the game gets the household clock too. Every timestamp this server writes — a ban, a join, the crash it leaves behind — is read next to a log line from somewhere else, and two clocks turn that into arithmetic. Six of this fleet's eleven game templates already carried the setting and this one did not. It defaults to UTC, which is now a choice rather than an accident, and the image carries the whole tz database so any zone name works. Measured against the pinned image: unset gives UTC, set gives the zone asked for.

Upgrading

git pull (or ./update.sh), then docker compose up -d. Nothing changes unless you set the new variable: the default is UTC, which is what the container did before.

Full history in CHANGELOG.md.

v1.1.0

Choose a tag to compare

@heyvaldemar heyvaldemar released this 07 Sep 20:42

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-run says 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.0

Choose a tag to compare

@heyvaldemar heyvaldemar released this 07 Sep 02:27

Added

  • A Team Fortress 2 dedicated server, image pinned by digest as an
    interpolation default, so git pull delivers the build this repository has
    tested and .env overrides survive it. The tag is latest because upstream
    publishes no version numbers: the digest is the version, and the daily
    freshness check is what notices a rebuild.
  • A health check anchored to the game binary rather than a substring. Two
    commands run in the container: srcds_linux64, the game, and
    srcds_run_64, its restart wrapper. 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. tests/e2e-healthcheck.sh proves the distinction
    against a real container, with no game download.
  • The hostname in server.cfg, not on the command line. The launcher drops
    everything after a | in an argument; a name passed through .env arrived
    truncated with no error.
  • A 24-slot casual rotation that bots keep alive. tf_bot_quota_mode fill
    with a quota of six: bots yield slots as humans join, so the server never
    reads as empty in the browser. Every map on the rotation ran with a
    navigation mesh on the machine this template comes from; a navs/ mount is
    there for maps that ship without one.
  • 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 full server peaked at 1.57 GB; the 4 GB ceiling
    exists so a leak here cannot get some other container OOM-killed in its
    place.
  • 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: the image is 10 GB compressed,
    and a test that pretends a runner can hold it never runs.

Upgrading

First release: nothing to upgrade from. git clone, copy .env.example to .env, create the external volume where the compose file says so, and docker compose up -d.

Full history in CHANGELOG.md.