Team Fortress 2 Dedicated Server Docker images for multiple purposes
$ docker run \
-v "maps:/home/tf2/server/tf/maps" \
-e "RCON_PASSWORD=foobar123" \
-e "SERVER_HOSTNAME=melkor.tf" \
-e "STV_NAME=melkor TV" \
--network=host \
ghcr.io/melkortf/tf2-base
Each TF2 image has its own server.cfg.template
file that is used to generate server.cfg
. The docker container
uses envsubst
to replace environment variables in the template file.
For example, this line in server.cfg.template
:
rcon_password "${RCON_PASSWORD}"
when launched with these params:
$ docker run --network=host -e RCON_PASSWORD=123456 -itd ghcr.io/melkortf/tf2-base
will generate the following server.cfg
:
rcon_password "123456"
There are many more configuration options, you will find them all listed below.
In order to make the image as small as possible, the only map shipped is cp_badlands. This also lets you maintain only one volume with all the maps and share it between all the containers. Just mount /home/tf2/server/tf/maps
to your local directory that contains all the maps you need:
$ docker run -v "/your/maps/directory:/home/tf2/server/tf/maps" --network=host -d ghcr.io/melkortf/tf2-base
The docker run
examples in this readme run on the host
network for best performance. Read official documentation on the host network driver here.
The container entrypoint ensures the safe parameters are used to launch the TF2 server. These are, among others:
-steamcmd_script
path,-ip
,-port
,+clientport
,-steamport
and+tv_port
options,+sv_setsteamaccount
env variable.
These are part of image internal scripts and cannot be overridden by other means than the environment variables. Other values, on the other hand, can be easily configured however desired. The default command line for the tf2-base
image is
+sv_pure 1 +map cp_badlands +maxplayers 24
You can override these by simply appending command line to the docker run
invocation, for example:
$ docker run -v "maps:/home/tf2/server/tf/maps" --network=host ghcr.io/melkortf/tf2-base +sv_pure 1 +map pl_badwater +maxplayers 24
This will start the server on pl_badwater.
$ docker pull ghcr.io/melkortf/tf2-base
32-bit | 64-bit |
---|---|
ghcr.io/melkortf/tf2-base , ghcr.io/melkortf/tf2-base/i386 |
ghcr.io/melkortf/tf2-base/amd64 |
The base image for all other images; pure TF2 server, without any add-ons and plugins.
Environment variable | Default value | Used in | Description |
---|---|---|---|
IP | 0.0.0.0 | -ip ${IP} |
Specifies the address to use for the bind(2) syscall. |
PORT | 27015 | -port ${PORT} |
The port which the server will run on. |
CLIENT_PORT | 27016 | +clientport ${CLIENT_PORT} |
The client port. |
STEAM_PORT | 27018 | -steamport ${STEAM_PORT} |
Master server updater port. |
STV_PORT | 27020 | +tv_port ${STV_PORT} |
SourceTV port. |
SERVER_TOKEN | +sv_setsteamaccount ${SERVER_TOKEN} |
Game server account token to use for logging in to a persistent game server account. | |
RCON_PASSWORD | 123456 | rcon_password "${RCON_PASSWORD}" |
The RCON password (change this in your docker run invocation). |
SERVER_HOSTNAME | A Team Fortress 2 server | hostname "${SERVER_HOSTNAME}" |
The game server hostname. |
SERVER_PASSWORD | sv_password "${SERVER_PASSWORD}" |
The server password. | |
STV_NAME | Source TV | tv_name "${STV_NAME}" |
SourceTV host name. |
STV_TITLE | A Team Fortress 2 server Source TV | tv_title "${STV_TITLE}" |
Title for the SourceTV spectator UI. |
STV_PASSWORD | tv_password "${STV_PASSWORD}" |
SourceTV password. | |
DOWNLOAD_URL | https://fastdl.serveme.tf/ | sv_downloadurl "${DOWNLOAD_URL}" |
Download URL for the FastDL. |
ENABLE_FAKE_IP | 0 | -enablefakeip |
Enables/Disables SDR by turning the -enablefakeip flag on or off, setting to 1 or 0 respectively. |
$ docker pull ghcr.io/melkortf/tf2-sourcemod
32-bit | 64-bit |
---|---|
ghcr.io/melkortf/tf2-sourcemod , ghcr.io/melkortf/tf2-sourcemod/i386 |
ghcr.io/melkortf/tf2-sourcemod/amd64 |
TF2 server with Metamod:Source and SourceMod installed.
$ docker pull ghcr.io/melkortf/tf2-competitive
32-bit | 64-bit |
---|---|
ghcr.io/melkortf/tf2-competitive , ghcr.io/melkortf/tf2-competitive/i386 |
- |
TF2 server configured to be used in competitive matches. The following plugins, add-ons and configs are installed:
- TF2 competitive fixes
- Updated pause plugin
- SrcTV+
- Improved Match Timer plugin
- Supplemental Stats 2
- Medic Stats
- RestoreScore
- LogsTF
- RecordSTV
- WaitForSTV
- FixStvSlot
- AFK
- tf2rue
- neocurl
- demos.tf
- ETF2L.org configs
- RGL.gg configs
- fbtf.tf configs
- showsdr
Environment variable | Default value | Used in | Description |
---|---|---|---|
DEMOS_TF_APIKEY | sm_demostf_apikey ${DEMOS_TF_APIKEY} |
The API key used to upload the demo to demos.tf. | |
LOGS_TF_APIKEY | logstf_apikey ${LOGS_TF_APIKEY} |
The API key used to upload logs to logs.tf. |
$ docker pull ghcr.io/melkortf/tf2-dm
32-bit | 64-bit |
---|---|
ghcr.io/melkortf/tf2-dm , ghcr.io/melkortf/tf2-dm/i386 |
- |
TF2 dedicated server for DeathMatch gameplay.
$ docker pull ghcr.io/melkortf/tf2-mge
32-bit | 64-bit |
---|---|
ghcr.io/melkortf/tf2-mge , ghcr.io/melkortf/tf2-mge/i386 |
- |
TF2 dedicated server for MGE 1v1 training mod.