Hosting Guides

Competitive TF2 Server Configuration via LinuxGSM

7 min readDebian 12LinuxGSMSource
Once your server is online, jump to the Team Fortress 2 command and config reference.

Team Fortress 2 community servers split into two operational philosophies: casual pubs that mirror the matchmaking experience, and competitive pickup servers that strip out randomness and bake in strict class limits. This guide targets the second category. We want a lean Debian 12 deployment, no panel overhead, predictable damage calculations, and SourceTV running on every map so that demos are always available for review.

LinuxGSM is the perfect fit. The tf2server wrapper handles SteamCMD, server keys, and update routines, while we keep full control of server.cfg for competitive tuning.

Prerequisites

  • Debian 12 minimum install on a host with at least 2 vCPU and 2 GB RAM.
  • Root or sudo access for the bootstrap step.
  • UDP 27015 (game), UDP 27020 (SourceTV), TCP 27015 (RCON) open at the firewall.
  • A Game Server Login Token from steamcommunity.com/dev/managegameservers registered against appid 440.

Step 1: Install Dependencies

root@host
dpkg --add-architecture i386
apt update
apt install -y curl wget file tar bzip2 gzip unzip bsdmainutils python3 \
util-linux ca-certificates binutils bc jq tmux netcat-openbsd lib32gcc-s1 \
lib32stdc++6 libcurl4-gnutls-dev:i386 libsdl2-2.0-0:i386

Step 2: Bootstrap LinuxGSM and Install TF2

root@host
adduser --system --shell /bin/bash --group --disabled-password --home /home/tf2server tf2server
su - tf2server
wget -O linuxgsm.sh https://linuxgsm.sh
chmod +x linuxgsm.sh
bash linuxgsm.sh tf2server
./tf2server auto-install

The auto installer pulls roughly 18 GB of TF2 binaries and assets, generates a default ~/serverfiles/tf/cfg/server.cfg, and creates a tmux session under ./tf2server start.

Step 3: Competitive server.cfg

The competitive ruleset (UGC, RGL, ETF2L) collapses to three categories of convars: damage determinism, class composition, and game flow. The block below covers all three for a standard 6v6 deployment.

~/serverfiles/tf/cfg/server.cfg
hostname "Pickup #1 | RGL 6v6 | Random Crits Off"
rcon_password "REPLACE_WITH_LONG_PASSWORD"
sv_password ""
// Damage determinism
tf_use_fixed_weaponspreads 1
tf_damage_disablespread 1
tf_weapon_criticals 0
tf_weapon_criticals_melee 0
// Class limits, 6v6 standard
mp_tournament 1
mp_tournament_stopwatch 1
tf_tournament_classlimit_scout 2
tf_tournament_classlimit_soldier 2
tf_tournament_classlimit_pyro 1
tf_tournament_classlimit_demoman 1
tf_tournament_classlimit_heavy 1
tf_tournament_classlimit_engineer 1
tf_tournament_classlimit_medic 1
tf_tournament_classlimit_sniper 1
tf_tournament_classlimit_spy 1
// Game flow
mp_timelimit 30
mp_winlimit 5
mp_maxrounds 0
mp_restartgame 1
mp_tournament_readymode 1
mp_tournament_readymode_min 12
// Networking, 66 tick competitive baseline
sv_minrate 100000
sv_maxrate 0
sv_mincmdrate 66
sv_maxcmdrate 66
sv_minupdaterate 66
sv_maxupdaterate 66
// SourceTV
tv_enable 1
tv_port 27020
tv_maxclients 32
tv_autorecord 1
tv_delay 90
tv_name "Pickup #1 STV"

tf_weapon_criticals 0 and the spread convars are the entire reason competitive players bother with community servers. Leave them in place even for scrimmages, since muscle memory built on deterministic damage breaks against the live matchmaking randomness.

Step 4: GSLT and Start

TF2 will boot without a Game Server Login Token, but it cannot register as a public server without one. Drop the token into the LinuxGSM config file, not into server.cfg, so it survives ./tf2server update overwrites.

~/lgsm/config-lgsm/tf2server/tf2server.cfg
gslt="YOUR_64_CHAR_GSLT_TOKEN"
startparameters="-game tf -strictportbind -ip 0.0.0.0 -port 27015 +map cp_process_final +maxplayers 24 +servercfgfile server.cfg"
tf2server@host
./tf2server start
./tf2server details

Step 5: Recording and Pulling Demos

With tv_autorecord 1, every map produces a .dem file under ~/serverfiles/tf. Pull them off the host with rsync from an admin workstation, or schedule a cron job that uploads demos to S3 nightly so disks never fill up.

admin workstation
rsync -avh --remove-source-files \
tf2server@your.host:/home/tf2server/serverfiles/tf/auto-*.dem \
./demos/

Performance and Tuning

  • Lock fps_max 300 in server.cfg. The TF2 server scales internal tickrate from FPS, and 300 keeps it stable at 66 tick.
  • Pin the server process to a single fast core with taskset -c 2 ./tf2server start on hosts with shared workloads.
  • Disable workshop maps on competitive deployments. They confuse the SourceTV demo parser used by league admins.
  • Schedule a daily restart at low traffic hours via cron to dodge long uptime memory drift in the Source engine.

Conclusion

You now have a deterministic, tournament ready TF2 server with SourceTV demos being captured on every map. The combination of LinuxGSM for lifecycle management and a strict server.cfg for ruleset enforcement is the same pattern competitive leagues have used for over a decade, and it scales effortlessly from a single pickup server to a fleet of 12 league hosts on the same node.