Competitive TF2 Server Configuration via LinuxGSM
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/managegameserversregistered against appid 440.
Step 1: Install Dependencies
dpkg --add-architecture i386apt updateapt 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:i386Step 2: Bootstrap LinuxGSM and Install TF2
adduser --system --shell /bin/bash --group --disabled-password --home /home/tf2server tf2serversu - tf2serverwget -O linuxgsm.sh https://linuxgsm.shchmod +x linuxgsm.shbash linuxgsm.sh tf2server./tf2server auto-installThe 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.
hostname "Pickup #1 | RGL 6v6 | Random Crits Off"rcon_password "REPLACE_WITH_LONG_PASSWORD"sv_password ""// Damage determinismtf_use_fixed_weaponspreads 1tf_damage_disablespread 1tf_weapon_criticals 0tf_weapon_criticals_melee 0// Class limits, 6v6 standardmp_tournament 1mp_tournament_stopwatch 1tf_tournament_classlimit_scout 2tf_tournament_classlimit_soldier 2tf_tournament_classlimit_pyro 1tf_tournament_classlimit_demoman 1tf_tournament_classlimit_heavy 1tf_tournament_classlimit_engineer 1tf_tournament_classlimit_medic 1tf_tournament_classlimit_sniper 1tf_tournament_classlimit_spy 1// Game flowmp_timelimit 30mp_winlimit 5mp_maxrounds 0mp_restartgame 1mp_tournament_readymode 1mp_tournament_readymode_min 12// Networking, 66 tick competitive baselinesv_minrate 100000sv_maxrate 0sv_mincmdrate 66sv_maxcmdrate 66sv_minupdaterate 66sv_maxupdaterate 66// SourceTVtv_enable 1tv_port 27020tv_maxclients 32tv_autorecord 1tv_delay 90tv_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.
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 start./tf2server detailsStep 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.
rsync -avh --remove-source-files \ tf2server@your.host:/home/tf2server/serverfiles/tf/auto-*.dem \ ./demos/Performance and Tuning
- Lock
fps_max 300inserver.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 starton 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.