Skip to content

Releases: heyvaldemar/l4d2-server-docker-compose

v1.2.0

Choose a tag to compare

@heyvaldemar heyvaldemar released this 22 Sep 14:08

Added

  • L4D2_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:58

Added

  • A Left 4 Dead 2 co-op 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 master because upstream publishes
    no version numbers: the digest is the version.
  • Direct connect enabled. sv_allow_lobby_connect_only 0 in server.cfg;
    the game's default accepts only lobby arrivals and refuses connect host:port with nothing useful said.
  • A campaign rotation that rotates. The file the image ships lists four
    maps from the first game under names that do not exist in this build, so
    every finale restarted the same campaign. Fourteen campaigns by their real
    first chapter, each name checked with maps on a running server.
  • Three SourceMod plugins, compiled in CI with a pinned compiler.
    l4d2_campaign_cycle moves the group to the next campaign on finale_win,
    because L4D2 exposes no way to see whether the engine reads mapcycle.txt in
    co-op at all; l4d2_join_rescue puts a human dropped into Spectator back on
    the survivor team when the engine's own takeover does not fire;
    l4d2_character_select lets a player pick their survivor without turning
    sv_cheats on for everybody.
  • Addons and the sourcemod config directory bind-mounted from the host,
    because the game sits in the image's writable layer and anything installed
    inside vanishes on the next recreate without a word. Only the sourcemod
    subdirectory of cfg/ is mounted, so the game's own cfg files stay visible.
  • An exact-match health check on the game binary, with
    tests/e2e-healthcheck.sh proving it against a real container.
  • Measured limits. A four-player server peaked at 432 MB; the 3 GB ceiling
    exists so a leak here cannot get some other container OOM-killed in its
    place.
  • Deployment Verification CI that boots the real image: docker compose up, a health check going green, and an A2S_INFO query answered on the
    published port. The image is 3.3 GB compressed, which a runner can hold —
    the one Source server in this family for which that is true.

Upgrading

First release: nothing to upgrade from. git clone, copy .env.example to .env, put MetaMod and SourceMod into addons/, and docker compose up -d.

Full history in CHANGELOG.md.