<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tf2classified.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Webb</id>
	<title>TF2 Classified Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tf2classified.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Webb"/>
	<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/wiki/Special:Contributions/Webb"/>
	<updated>2026-05-31T20:57:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0-beta</generator>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10302</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10302"/>
		<updated>2026-05-23T00:21:40Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add Heapons&amp;#039; RTD.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Some existing plugins have dependencies which need to be rebuilt to work with post-Steam builds. This section contains a list of extensions that are rebuilt or otherwise fixed to work with modern TF2C.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| TF2 Tools || Azzy || AlliedModders&#039; TF2 Tools extension patched to work with TF2C. || https://discord.gg/3zMk4vn || https://discord.com/channels/196337717267791874/1011914229307166780/1467172013637636327&lt;br /&gt;
|-&lt;br /&gt;
| SteamWorks || IRQL_NOT_LESS_OR_EQUAL || SteamWorks extension built for amd64. || https://github.com/irql-notlessorequal/SteamWorks || https://github.com/irql-notlessorequal/SteamWorks/actions&lt;br /&gt;
|-&lt;br /&gt;
| SMJansson || bottiger || JSON extension recompiled for Linux on amd64. Community build with no corresponding source code, use with caution. || https://forums.alliedmods.net/showpost.php?p=2822313&amp;amp;postcount=80 || https://forums.alliedmods.net/attachment.php?attachmentid=204314&amp;amp;d=1715116049 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Chat bridge between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Spraytime || Jester || Adds a server playtime requirement before players are allowed to spray. || https://github.com/magisjester/spraytime || https://github.com/magisjester/spraytime/raw/refs/heads/master/compiled/spraytime.smx&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| MiniSentryFix || Maxim766 || Plugin that fixes various problems with mini-sentries. || https://github.com/Maxim766/TF2Classified_MiniSentryFix || https://github.com/Maxim766/TF2Classified_MiniSentryFix/archive/refs/heads/main.zip&lt;br /&gt;
|-&lt;br /&gt;
| Roll the Dice (Heapons Fork) || Heapons || Roll the Dice forked to work with TF2 mods. || https://github.com/Heapons/RTD || https://github.com/Heapons/RTD/raw/refs/heads/master/scripting/rtd.smx&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=User:Webb/Better_GitHub_FastDL&amp;diff=10301</id>
		<title>User:Webb/Better GitHub FastDL</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=User:Webb/Better_GitHub_FastDL&amp;diff=10301"/>
		<updated>2026-04-21T16:35:16Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article outlines a better method for hosting your FastDL on GitHub. Both the spider den and Moon&#039;s Pub have been successfully using this for many months.&lt;br /&gt;
&lt;br /&gt;
First of all, upload your files to a GitHub repository. Unlike the GitHub Pages method there is a total repository size limit of about 100GB and individual files can be up to 100MB (you can use bzip2 compression like any other FastDL to get around this limitation somewhat.) You do not need to wait for GitHub Actions so file uploads/changes will be instant. Most maps should work this way.&lt;br /&gt;
&lt;br /&gt;
First, create a GitHub repository and upload your files using the typical FastDL file structure. You can find the repository I use [here https://github.com/webbongithub/fastdl]. &lt;br /&gt;
&lt;br /&gt;
Next you&#039;ll need to set your &amp;lt;code&amp;gt;sv_downloadurl&amp;lt;/code&amp;gt; console variable to a specific value to have it download directly from the repository. In the case of my repository, that is &amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c/&amp;lt;/code&amp;gt;. You may need to adjust this value depending on the name of your branch (which is by default &amp;quot;main&amp;quot;) and what subfolder you chose (or if you chose one at all,) and your username/repository name. A simple way of getting it is to go to, say a map file and copy the raw link:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c/maps/4arena_downtown_rc.bsp.bz2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then strip the end off until it&#039;s the root of where the files are stored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you do this, then it should just work.&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=User:Webb/Better_GitHub_FastDL&amp;diff=10300</id>
		<title>User:Webb/Better GitHub FastDL</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=User:Webb/Better_GitHub_FastDL&amp;diff=10300"/>
		<updated>2026-04-21T16:33:50Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article outlines a better method for hosting your FastDL on GitHub. Both the spider den and Moon&#039;s Pub have been successfully using this for many months.&lt;br /&gt;
&lt;br /&gt;
First of all, upload your files to a GitHub repository. Unlike the GitHub Pages method there is a total repository size limit of about 100GB and individual files can be up to 100MB (you can use bzip2 compression like any other FastDL to get around this limitation somewhat.) You do not need to wait for GitHub Actions so file uploads/changes will be instant. Most maps should work this way.&lt;br /&gt;
&lt;br /&gt;
First, create a GitHub repository and upload your files using the typical FastDL file structure. You can find the repository I use [here https://github.com/webbongithub/fastdl]. &lt;br /&gt;
&lt;br /&gt;
Next you&#039;ll need to set your &amp;lt;code&amp;gt;sv_downloadurl&amp;lt;/code&amp;gt; console variable to a specific value to have it download directly from the repository. In the case of my repository, that is &amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c/&amp;lt;/code&amp;gt;. You may need to adjust this value depending on the name of your branch (which is by default &amp;quot;main&amp;quot;) and what subfolder you chose (or if you chose one at all.) A simple way of getting it is to go to, say a map file and copy the raw link:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c/maps/4arena_downtown_rc.bsp.bz2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then strip the end off until it&#039;s the root of where the files are stored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you do this, then it should just work.&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=User:Webb/Better_GitHub_FastDL&amp;diff=10299</id>
		<title>User:Webb/Better GitHub FastDL</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=User:Webb/Better_GitHub_FastDL&amp;diff=10299"/>
		<updated>2026-04-21T16:32:29Z</updated>

		<summary type="html">&lt;p&gt;Webb: Created page with &amp;quot;This article outlines a better method for hosting your FastDL on GitHub.  First of all, upload your files to a GitHub repository. Unlike the GitHub Pages method there is a total repository size limit of about 100GB and individual files can be up to 100MB (you can use bzip2 compression like any other FastDL to get around this limitation somewhat.) You do not need to wait for GitHub Actions so file uploads/changes will be instant. Most maps should work this way.  First, cr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article outlines a better method for hosting your FastDL on GitHub.&lt;br /&gt;
&lt;br /&gt;
First of all, upload your files to a GitHub repository. Unlike the GitHub Pages method there is a total repository size limit of about 100GB and individual files can be up to 100MB (you can use bzip2 compression like any other FastDL to get around this limitation somewhat.) You do not need to wait for GitHub Actions so file uploads/changes will be instant. Most maps should work this way.&lt;br /&gt;
&lt;br /&gt;
First, create a GitHub repository and upload your files using the typical FastDL file structure. You can find the repository I use [here https://github.com/webbongithub/fastdl]. &lt;br /&gt;
&lt;br /&gt;
Next you&#039;ll need to set your &amp;lt;code&amp;gt;sv_downloadurl&amp;lt;/code&amp;gt; console variable to a specific value to have it download directly from the repository. In the case of my repository, that is &amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c/&amp;lt;/code&amp;gt;. You may need to adjust this value depending on the name of your branch (which is by default &amp;quot;main&amp;quot;) and what subfolder you chose (or if you chose one at all.) A simple way of getting it is to go to, say a map file and copy the raw link:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c/maps/4arena_downtown_rc.bsp.bz2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then strip the end off until it&#039;s the root of where the files are stored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://github.com/webbongithub/fastdl/raw/refs/heads/main/tf2c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you do this, then it should just work.&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10298</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10298"/>
		<updated>2026-04-21T16:15:26Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;a development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, the latest known working development build is 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
==== Installing the patched TF2 Tools extension ====&lt;br /&gt;
&lt;br /&gt;
Many plugins depend on the built-in TF2 Tools extension that comes with Sourcemod. This isn&#039;t compatible with TF2C. Instead, we can use a patched version of the extension which enables the use of many plugins.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently no public download link for this extension. After joining the Team Fortress 2 Classified Discord server you can find the files you need in [https://discordapp.com/channels/196337717267791874/1011914229307166780/1467172013637636327 this message]. Specifically, you need &amp;lt;code&amp;gt;game.tf2.ext.2.tf2.so&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sm-tf2.games.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First, we&#039;ll need to disable automatic game data updating to prevent our gamedata file from being removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nano ~/classified/tf2classified/addons/sourcemod/configs/core.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt; in this part of the file with &amp;lt;code&amp;gt;&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        /**&lt;br /&gt;
         * Enables or Disables SourceMod&#039;s automatic gamedata updating.&lt;br /&gt;
         *&lt;br /&gt;
         * The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
         */&lt;br /&gt;
        &amp;quot;DisableAutoUpdate&amp;quot;                     &amp;quot;no&amp;quot; // Change to &amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll add both the gamedata file and the plugin to our installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/sm-tf2.games.txt ~/classified/tf2classified/addons/gamedata/sm-tf2.games.txt&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/game.tf2.ext.2.tf2.so ~/classified/tf2classified/addons/extensions/x64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create an empty file so that the extension is automatically loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ touch ~/classified/tf2classified/addons/sourcemod/extensions/game.tf2.autoload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10232</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10232"/>
		<updated>2026-04-08T01:12:04Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Some existing plugins have dependencies which need to be rebuilt to work with post-Steam builds. This section contains a list of extensions that are rebuilt or otherwise fixed to work with modern TF2C.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| TF2 Tools || Azzy || AlliedModders&#039; TF2 Tools extension patched to work with TF2C. || https://discord.gg/3zMk4vn || https://discord.com/channels/196337717267791874/1011914229307166780/1467172013637636327&lt;br /&gt;
|-&lt;br /&gt;
| SteamWorks || IRQL_NOT_LESS_OR_EQUAL || SteamWorks extension built for amd64. || https://github.com/irql-notlessorequal/SteamWorks || https://github.com/irql-notlessorequal/SteamWorks/actions&lt;br /&gt;
|-&lt;br /&gt;
| SMJansson || bottiger || JSON extension recompiled for Linux on amd64. Community build with no corresponding source code, use with caution. || https://forums.alliedmods.net/showpost.php?p=2822313&amp;amp;postcount=80 || https://forums.alliedmods.net/attachment.php?attachmentid=204314&amp;amp;d=1715116049 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Chat bridge between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Spraytime || Jester || Adds a server playtime requirement before players are allowed to spray. || https://github.com/magisjester/spraytime || https://github.com/magisjester/spraytime/raw/refs/heads/master/compiled/spraytime.smx&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| MiniSentryFix || Maxim766 || Plugin that fixes various problems with mini-sentries. || https://github.com/Maxim766/TF2Classified_MiniSentryFix || https://github.com/Maxim766/TF2Classified_MiniSentryFix/archive/refs/heads/main.zip&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10231</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10231"/>
		<updated>2026-04-08T00:39:41Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Some existing plugins have dependencies which need to be rebuilt to work with post-Steam builds. This section contains a list of extensions that are rebuilt or otherwise fixed to work with modern TF2C.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| TF2 Tools || Azzy || AlliedModders&#039; TF2 Tools extension patched to work with TF2C. || https://discord.gg/3zMk4vn || https://discord.com/channels/196337717267791874/1011914229307166780/1467172013637636327&lt;br /&gt;
|-&lt;br /&gt;
| SteamWorks || IRQL_NOT_LESS_OR_EQUAL || SteamWorks extension built for amd64.  || https://github.com/irql-notlessorequal/SteamWorks || https://github.com/irql-notlessorequal/SteamWorks/actions&lt;br /&gt;
|-&lt;br /&gt;
| SMJansson || bottiger || JSON extension recompiled for amd64. Community build with no corresponding source code, use with caution. || https://forums.alliedmods.net/showpost.php?p=2822313&amp;amp;postcount=80 || https://forums.alliedmods.net/attachment.php?attachmentid=204314&amp;amp;d=1715116049 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Chat bridge between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Spraytime || Jester || Adds a server playtime requirement before players are allowed to spray. || https://github.com/magisjester/spraytime || https://github.com/magisjester/spraytime/raw/refs/heads/master/compiled/spraytime.smx&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| MiniSentryFix || Maxim766 || Plugin that fixes various problems with mini-sentries. || https://github.com/Maxim766/TF2Classified_MiniSentryFix || https://github.com/Maxim766/TF2Classified_MiniSentryFix/archive/refs/heads/main.zip&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10230</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10230"/>
		<updated>2026-04-08T00:39:02Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add spraytime&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Some existing plugins have dependencies which need to be rebuilt to work with post-Steam builds. This section contains a list of extensions that are rebuilt or otherwise fixed to work with modern TF2C.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| TF2 Tools || Azzy || AlliedModders&#039; TF2 Tools extension patched to work with TF2C. || https://discord.gg/3zMk4vn || https://discord.com/channels/196337717267791874/1011914229307166780/1467172013637636327&lt;br /&gt;
|-&lt;br /&gt;
| SteamWorks || IRQL_NOT_LESS_OR_EQUAL || SteamWorks extension built for amd64.  || https://github.com/irql-notlessorequal/SteamWorks || https://github.com/irql-notlessorequal/SteamWorks/actions&lt;br /&gt;
|-&lt;br /&gt;
| SMJansson || bottiger || JSON extension recompiled for amd64. Community build with no corresponding source code, use with caution. || https://forums.alliedmods.net/showpost.php?p=2822313&amp;amp;postcount=80 || https://forums.alliedmods.net/attachment.php?attachmentid=204314&amp;amp;d=1715116049 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Spraytime || Jester || Adds a server playtime requirement before players are allowed to spray. || https://github.com/magisjester/spraytime || https://github.com/magisjester/spraytime/raw/refs/heads/master/compiled/spraytime.smx&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| MiniSentryFix || Maxim766 || Plugin that fixes various problems with mini-sentries. || https://github.com/Maxim766/TF2Classified_MiniSentryFix || https://github.com/Maxim766/TF2Classified_MiniSentryFix/archive/refs/heads/main.zip&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10229</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10229"/>
		<updated>2026-04-08T00:34:57Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add MiniSentryFix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Some existing plugins have dependencies which need to be rebuilt to work with post-Steam builds. This section contains a list of extensions that are rebuilt or otherwise fixed to work with modern TF2C.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| TF2 Tools || Azzy || AlliedModders&#039; TF2 Tools extension patched to work with TF2C. || https://discord.gg/3zMk4vn || https://discord.com/channels/196337717267791874/1011914229307166780/1467172013637636327&lt;br /&gt;
|-&lt;br /&gt;
| SteamWorks || IRQL_NOT_LESS_OR_EQUAL || SteamWorks extension built for amd64.  || https://github.com/irql-notlessorequal/SteamWorks || https://github.com/irql-notlessorequal/SteamWorks/actions&lt;br /&gt;
|-&lt;br /&gt;
| SMJansson || bottiger || JSON extension recompiled for amd64. Community build with no corresponding source code, use with caution. || https://forums.alliedmods.net/showpost.php?p=2822313&amp;amp;postcount=80 || https://forums.alliedmods.net/attachment.php?attachmentid=204314&amp;amp;d=1715116049 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| MiniSentryFix || Maxim766 || Plugin that fixes various problems with mini-sentries. || https://github.com/Maxim766/TF2Classified_MiniSentryFix || https://github.com/Maxim766/TF2Classified_MiniSentryFix/archive/refs/heads/main.zip&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10228</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10228"/>
		<updated>2026-04-08T00:27:47Z</updated>

		<summary type="html">&lt;p&gt;Webb: Use permalink for SMJansson&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Some existing plugins have dependencies which need to be rebuilt to work with post-Steam builds. This section contains a list of extensions that are rebuilt or otherwise fixed to work with modern TF2C.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| TF2 Tools || Azzy || AlliedModders&#039; TF2 Tools extension patched to work with TF2C. || https://discord.gg/3zMk4vn || https://discord.com/channels/196337717267791874/1011914229307166780/1467172013637636327&lt;br /&gt;
|-&lt;br /&gt;
| SteamWorks || IRQL_NOT_LESS_OR_EQUAL || SteamWorks extension built for amd64.  || https://github.com/irql-notlessorequal/SteamWorks || https://github.com/irql-notlessorequal/SteamWorks/actions&lt;br /&gt;
|-&lt;br /&gt;
| SMJansson || bottiger || JSON extension recompiled for amd64. Community build with no corresponding source code, use with caution. || https://forums.alliedmods.net/showpost.php?p=2822313&amp;amp;postcount=80 || https://forums.alliedmods.net/attachment.php?attachmentid=204314&amp;amp;d=1715116049 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10227</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10227"/>
		<updated>2026-04-08T00:25:52Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add dependencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Some existing plugins have dependencies which need to be rebuilt to work with post-Steam builds. This section contains a list of extensions that are rebuilt or otherwise fixed to work with modern TF2C.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| TF2 Tools || Azzy || AlliedModders&#039; TF2 Tools extension patched to work with TF2C. || https://discord.gg/3zMk4vn || https://discord.com/channels/196337717267791874/1011914229307166780/1467172013637636327&lt;br /&gt;
|-&lt;br /&gt;
| SteamWorks || IRQL_NOT_LESS_OR_EQUAL || SteamWorks extension built for amd64.  || https://github.com/irql-notlessorequal/SteamWorks || https://github.com/irql-notlessorequal/SteamWorks/actions&lt;br /&gt;
|-&lt;br /&gt;
| SMJansson || bottiger || JSON extension recompiled for amd64. Community build with no corresponding source code, use with caution. || https://forums.alliedmods.net/showthread.php?t=184604&amp;amp;page=8 || https://forums.alliedmods.net/attachment.php?attachmentid=204314&amp;amp;d=1715116049 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10226</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10226"/>
		<updated>2026-04-08T00:09:14Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community plugins and tools that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=User:Webb/Dedicated_server_plugins&amp;diff=10225</id>
		<title>User:Webb/Dedicated server plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=User:Webb/Dedicated_server_plugins&amp;diff=10225"/>
		<updated>2026-04-08T00:09:00Z</updated>

		<summary type="html">&lt;p&gt;Webb: Webb moved page User:Webb/Dedicated server plugins to List of dedicated server tools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[List of dedicated server tools]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10224</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10224"/>
		<updated>2026-04-08T00:09:00Z</updated>

		<summary type="html">&lt;p&gt;Webb: Webb moved page User:Webb/Dedicated server plugins to List of dedicated server tools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10223</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10223"/>
		<updated>2026-04-08T00:08:18Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux || https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10222</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10222"/>
		<updated>2026-04-08T00:08:01Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add SRCDS Discord Redux&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| SRCDS Discord Redux || Heapons || Adds chat bridging between srcds and Discord. || https://github.com/Serider-Lounge/SRCDS-Discord-Redux| https://github.com/Serider-Lounge/SRCDS-Discord-Redux/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10221</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10221"/>
		<updated>2026-04-08T00:06:50Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
==== Installing the patched TF2 Tools extension ====&lt;br /&gt;
&lt;br /&gt;
Many plugins depend on the built-in TF2 Tools extension that comes with Sourcemod. This isn&#039;t compatible with TF2C. Instead, we can use a patched version of the extension which enables the use of many plugins.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently no public download link for this extension. After joining the Team Fortress 2 Classified Discord server you can find the files you need in [https://discordapp.com/channels/196337717267791874/1011914229307166780/1467172013637636327 this message]. Specifically, you need &amp;lt;code&amp;gt;game.tf2.ext.2.tf2.so&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sm-tf2.games.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First, we&#039;ll need to disable automatic game data updating to prevent our gamedata file from being removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nano ~/classified/tf2classified/addons/sourcemod/configs/core.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt; in this part of the file with &amp;lt;code&amp;gt;&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        /**&lt;br /&gt;
         * Enables or Disables SourceMod&#039;s automatic gamedata updating.&lt;br /&gt;
         *&lt;br /&gt;
         * The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
         */&lt;br /&gt;
        &amp;quot;DisableAutoUpdate&amp;quot;                     &amp;quot;no&amp;quot; // Change to &amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll add both the gamedata file and the plugin to our installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/sm-tf2.games.txt ~/classified/tf2classified/addons/gamedata/sm-tf2.games.txt&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/game.tf2.ext.2.tf2.so ~/classified/tf2classified/addons/extensions/x64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create an empty file so that the extension is automatically loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ touch ~/classified/tf2classified/addons/sourcemod/extensions/game.tf2.autoload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10220</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10220"/>
		<updated>2026-04-07T21:19:44Z</updated>

		<summary type="html">&lt;p&gt;Webb: Fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scramble  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10219</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10219"/>
		<updated>2026-04-07T21:10:20Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata. Check each plugin&#039;s page for their respective dependencies.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scrmable  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10218</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10218"/>
		<updated>2026-04-07T21:09:46Z</updated>

		<summary type="html">&lt;p&gt;Webb: Adjust wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scrmable  || BitsE9 || A simple team scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10217</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10217"/>
		<updated>2026-04-07T21:08:46Z</updated>

		<summary type="html">&lt;p&gt;Webb: Fix basic chat fork&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scrmable  || BitsE9 || A simple player scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModders&#039; Basic Chat plugin forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10216</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10216"/>
		<updated>2026-04-07T21:08:03Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add simple scramble&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|-&lt;br /&gt;
| Simple-Scrmable  || BitsE9 || A simple player scramble plugin. || https://github.com/BitsE9/simple-scramble || https://github.com/BitsE9/simple-scramble/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModder&#039;s Basechat forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10215</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10215"/>
		<updated>2026-04-07T21:00:38Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add MCP chat plugins&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Basic Chat (MCP Fork) || DosMike || AlliedModder&#039;s Basechat forked to work with MCP. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Chat Tags || DosMike || Allows for chat tags and coloring of player&#039;s chat messages. Backwards compatible with Custom Chat Colors configs. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| MCP Mentions || DosMike || Allows players to ping others in chat using their name. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| MCP SayRedirects || DosMike || Common redirects for chat messages. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10214</id>
		<title>List of dedicated server tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=List_of_dedicated_server_tools&amp;diff=10214"/>
		<updated>2026-04-07T20:34:25Z</updated>

		<summary type="html">&lt;p&gt;Webb: Initial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of community SourceMod plugins that are known to work with &#039;&#039;Team Fortress 2 Classified&#039;&#039; or are designed for it. Many plugins require the patched TF2 Tools extension and appropriate gamedata.&lt;br /&gt;
&lt;br /&gt;
== General == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Drug Test || webb || Provides command targets for GRN and YLW (i.e. &amp;lt;code&amp;gt;sm_slay @yellow&amp;lt;/code&amp;gt;). || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| NativeVotes (Heapons Fork) || Heapons || Allows servers to use native menus for voting. || https://github.com/Heapons/sourcemod-nativevotes-updated || https://github.com/Heapons/sourcemod-nativevotes-updated/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Chat ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|- &lt;br /&gt;
| Meta Chat Processor || DosMike || A chat processor known to work well with Team Fortress 2 Classified that includes backwards compatibility with other chat processors like Simple Chat Processor Redux. Includes its own suite of chat tools. || https://forums.alliedmods.net/showthread.php?p=2777572 || https://github.com/DosMike/SM-MetaChatProcessor/releases&lt;br /&gt;
|-&lt;br /&gt;
| Zensitive || webb || Provides the ability to mark messages as &amp;quot;sensitive&amp;quot; which are not visible unless opted in, similar to spoilered messages. Can work standalone or in conjunction with Meta Chat Processor. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Admin Caboose || webb || Provides small utility commands to admins such as the ability to get information like spray hexes and traditional Steam IDs from players, as well as generate steamhistory.net links. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| CIDR Blocker || rumblefrog || Can block IP ranges from joining your server, useful for blocking proxies. || https://cidr-blocker.github.io/ || https://github.com/CIDR-Blocker/CIDR-Blocker/releases&lt;br /&gt;
|-&lt;br /&gt;
| IDlesslessness || webb || Makes players without Steam IDs unable to chat or spray. Includes a command to kick all IDless players. Optionally can kick them after a period of time after being put in game if they don&#039;t still have one. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Lumberjack || webb || Provides logging of chat and other information to Discord via webhooks. Optionally can work with CallAdmin to ping admins. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Rat Poison || webb || Allows admins to specify a whitelist of players who can spray. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| SM Utilities || Heapons || A variety of tools for various games, including Team Fortress 2 Classified. || https://github.com/Serider-Lounge/SM-Utilities || https://github.com/Serider-Lounge/SM-Utilities/releases/&lt;br /&gt;
|-&lt;br /&gt;
| Sourcebans++ || Sourcebans++ Dev Team || A suite of tools for managing bans, comm blocks, and more across multiple servers. Requires special setup outside of SourceMod. || https://sbpp.github.io/ || https://github.com/sbpp/sourcebans-pp/releases&lt;br /&gt;
|-&lt;br /&gt;
| Stuffify || webb || Provides commands to change certain attributes of players like class, team, as well as regenerate them and respawn them. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|-&lt;br /&gt;
| VPNBlock || PwnK || Blocks IPs with poor reputations using the Blackbox API. || https://forums.alliedmods.net/showthread.php?t=312792 || Unavailable from original author&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom gamemodes/fun ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Author !! Description !! Web page !! Download&lt;br /&gt;
|-&lt;br /&gt;
| Class Consciousness || webb || Configurable and stable Class Wars/per-team class enforcement plugin. || https://codeberg.org/spiderden/sp || https://codeberg.org/spiderden/sp/releases&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10104</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10104"/>
		<updated>2026-03-14T08:40:13Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
==== Installing the patched TF Tools extension ====&lt;br /&gt;
&lt;br /&gt;
Many plugins depend on the built-in TF Tools extension that comes with Sourcemod. This isn&#039;t compatible with TF2C. Instead, we can use a patched version of the extension which enables the use of many plugins.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently no public download link for this extension. After joining the Team Fortress 2 Classified Discord server you can find the files you need in [https://discordapp.com/channels/196337717267791874/1011914229307166780/1467172013637636327 this message]. Specifically, you need &amp;lt;code&amp;gt;game.tf2.ext.2.tf2.so&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sm-tf2.games.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First, we&#039;ll need to disable automatic game data updating to prevent our gamedata file from being removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nano ~/classified/tf2classified/addons/sourcemod/configs/core.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt; in this part of the file with &amp;lt;code&amp;gt;&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        /**&lt;br /&gt;
         * Enables or Disables SourceMod&#039;s automatic gamedata updating.&lt;br /&gt;
         *&lt;br /&gt;
         * The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
         */&lt;br /&gt;
        &amp;quot;DisableAutoUpdate&amp;quot;                     &amp;quot;no&amp;quot; // Change to &amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll add both the gamedata file and the plugin to our installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/sm-tf2.games.txt ~/classified/tf2classified/addons/gamedata/sm-tf2.games.txt&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/game.tf2.ext.2.tf2.so ~/classified/tf2classified/addons/extensions/x64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create an empty file so that the extension is automatically loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ touch ~/classified/tf2classified/addons/sourcemod/extensions/game.tf2.autoload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10103</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10103"/>
		<updated>2026-03-14T08:38:22Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
==== Installing the patched TF Tools extension ====&lt;br /&gt;
&lt;br /&gt;
Many plugins depend on the built-in TF Tools extension that comes with Sourcemod. This isn&#039;t compatible with TF2C. Instead, we can use a patched version of the extension which enables the use of many plugins.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently no public download link for this extension. After joining the Team Fortress 2 Classified Discord server you can find the files you need in [https://discordapp.com/channels/196337717267791874/1011914229307166780/1467172013637636327 this message]. Specifically, you need &amp;lt;code&amp;gt;game.tf2.ext.2.tf2.so&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sm-tf2.games.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First, we&#039;ll need to disable automatic game data updating to prevent our gamedata file from being removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nano ~/classified/tf2classified/addons/sourcemod/configs/core.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt; in this part of the file with &amp;lt;code&amp;gt;&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        /**&lt;br /&gt;
         * Enables or Disables SourceMod&#039;s automatic gamedata updating.&lt;br /&gt;
         *&lt;br /&gt;
         * The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
         */&lt;br /&gt;
        &amp;quot;DisableAutoUpdate&amp;quot;                     &amp;quot;no&amp;quot; // Change to &amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll add both the gamedata file and the plugin to our installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/sm-tf2.games.txt ~/classified/tf2classified/addons/sm-tf2.games.txt&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/game.tf2.ext.2.tf2.so ~/classified/tf2classified/addons/extensions/x64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create an empty file so that the extension is automatically loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ touch ~/classified/tf2classified/addons/sourcemod/extensions/game.tf2.autoload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10102</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10102"/>
		<updated>2026-03-14T08:37:46Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
==== Installing the patched TF Tools extension ====&lt;br /&gt;
&lt;br /&gt;
Many plugins depend on the built-in TF Tools extension that comes with Sourcemod. This isn&#039;t compatible with TF2C. Instead, we can use a patched version of the extension which enables the use of many plugins.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently no public download link for this extension. After joining the Team Fortress 2 Classified Discord server you can find the files you need in [https://discordapp.com/channels/196337717267791874/1011914229307166780/1467172013637636327 this message]. Specifically, you need &amp;lt;code&amp;gt;game.tf2.ext.2.tf2.so&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sm-tf2.games.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First, we&#039;ll need to disable automatic game data updating to prevent our gamedata file from being removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nano ~/classified/tf2classified/addons/sourcemod/configs/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt; in this part of the file with &amp;lt;code&amp;gt;&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        /**&lt;br /&gt;
         * Enables or Disables SourceMod&#039;s automatic gamedata updating.&lt;br /&gt;
         *&lt;br /&gt;
         * The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
         */&lt;br /&gt;
        &amp;quot;DisableAutoUpdate&amp;quot;                     &amp;quot;no&amp;quot; // Change to &amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll add both the gamedata file and the plugin to our installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/sm-tf2.games.txt ~/classified/tf2classified/addons/sm-tf2.games.txt&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/game.tf2.ext.2.tf2.so ~/classified/tf2classified/addons/extensions/x64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create an empty file so that the extension is automatically loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ touch ~/classified/tf2classified/addons/sourcemod/extensions/game.tf2.autoload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10101</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10101"/>
		<updated>2026-03-14T08:37:11Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
==== Installing the patched TF Tools extension ====&lt;br /&gt;
&lt;br /&gt;
Many plugins depend on the built-in TF Tools extension that comes with Sourcemod. This isn&#039;t compatible with TF2C. Instead, we can use a patched version of the extension which enables the use of many plugins.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently no public download link for this extension. After joining the Team Fortress 2 Classified Discord server you can find the files you need in [https://discordapp.com/channels/196337717267791874/1011914229307166780/1467172013637636327 this message]. Specifically, you need &amp;lt;code&amp;gt;game.tf2.ext.2.tf2.so&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sm-tf2.games.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First, we&#039;ll need to disable automatic game data updating to prevent our gamedata file from being removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nano ~/classified/tf2classified/addons/sourcemod/configs/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt; in this part of the file with &amp;lt;code&amp;gt;&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        /**&lt;br /&gt;
         * Enables or Disables SourceMod&#039;s automatic gamedata updating.&lt;br /&gt;
         *&lt;br /&gt;
         * The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
         */&lt;br /&gt;
        &amp;quot;DisableAutoUpdate&amp;quot;                     &amp;quot;no&amp;quot; // Change to &amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll add both the gamedata file and the plugin to our installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/sm-tf2.games.txt ~/classified/tf2classified/addons/sm-tf2.games.txt&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/game.tf2.ext.2.tf2.so ~/classified/tf2classified/addons/extensions/x64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create an empty file so that the extension is automatically loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ touch ~/classified/tf2classified/addons/sourcemod/extensions/game.tf2.autoload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10100</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10100"/>
		<updated>2026-03-14T08:36:03Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
==== Installing the patched TF Tools extension ====&lt;br /&gt;
&lt;br /&gt;
Many plugins depend on the built-in TF Tools extension that comes with Sourcemod. This isn&#039;t compatible with TF2C. Instead, we can use a patched version of the extension which enables the use of many plugins.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently no public download link for this extension. After joining the Team Fortress 2 Classified Discord server you can find the files you need in [this message https://discordapp.com/channels/196337717267791874/1011914229307166780/1467172013637636327]. Specifically, you need &amp;lt;code&amp;gt;game.tf2.ext.2.tf2.so&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sm-tf2.games.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First, we&#039;ll need to disable automatic game data updating to prevent our gamedata file from being removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nano ~/classified/tf2classified/addons/sourcemod/configs/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt; in this part of the file with &amp;lt;code&amp;gt;&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        /**&lt;br /&gt;
         * Enables or Disables SourceMod&#039;s automatic gamedata updating.&lt;br /&gt;
         *&lt;br /&gt;
         * The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
         */&lt;br /&gt;
        &amp;quot;DisableAutoUpdate&amp;quot;                     &amp;quot;no&amp;quot; // Change to &amp;quot;yes&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll add both the gamedata file and the plugin to our installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/sm-tf2.games.txt ~/classified/tf2classified/addons/sm-tf2.games.txt&lt;br /&gt;
$ mv $WHEREVER_YOU_PUT_IT/game.tf2.ext.2.tf2.so ~/classified/tf2classified/addons/extensions/x64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, create an empty file so that the extension is automatically loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ touch ~/classified/tf2classified/addons/sourcemod/extensions/game.tf2.autoload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10099</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10099"/>
		<updated>2026-03-14T07:56:25Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10098</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10098"/>
		<updated>2026-03-14T07:55:57Z</updated>

		<summary type="html">&lt;p&gt;Webb: Fix capitalisation on SourceMod in subtitle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing SourceMod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10097</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10097"/>
		<updated>2026-03-14T07:55:28Z</updated>

		<summary type="html">&lt;p&gt;Webb: Initial Sourcemod setup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.&lt;br /&gt;
&lt;br /&gt;
=== Installing Sourcemod ===&lt;br /&gt;
&lt;br /&gt;
SourceMod is a server modding platform that provides admin tools, permissions, and plugin support. Installing it is strongly recommended if you plan to run a publicly-facing server.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to install the &#039;&#039;&#039;latest development version&#039;&#039;&#039; of SourceMod, as well as MetaMod which SourceMod depends on to work. &#039;&#039;&#039;It will not work with stable releases currently&#039;&#039;&#039;. As of writing this article, it&#039;s 7301 and 1389 respectively..&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1389-linux.tar.gz -O /tmp/mm.tar.gz&lt;br /&gt;
$ wget https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7301-linux.tar.gz -O /tmp/sm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/mm.tar.gz&lt;br /&gt;
$ tar -xf /tmp/sm.tar.gz&lt;br /&gt;
$ mv addons ~/classified/tf2classified&lt;br /&gt;
$ mv cfg/sourcemod ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -r cfg&lt;br /&gt;
$ rm /tmp/mm.tar.gz&lt;br /&gt;
$ rm /tmp/sm.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the server starts it should work. A good way to test if everything is running properly is to use the &amp;lt;code&amp;gt;!motd&amp;lt;/code&amp;gt; command in chat. If the MOTD pops up after the command that means SourceMod is working. For further information on setting up SourceMod, read [https://wiki.alliedmods.net/Category:SourceMod_Documentation the documentation].&lt;br /&gt;
&lt;br /&gt;
Existing SourceMod plugins are not guaranteed to work and may require special steps or patching to get working.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10096</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10096"/>
		<updated>2026-03-13T19:13:03Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add troubleshooting about CPU usage with service file workaround&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.   &lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Server using high levels of CPU when ran via the service file ===&lt;br /&gt;
&lt;br /&gt;
The service file included in this guide has a workaround for Source servers refusing to log without a TTY present. There has been at least one report of this causing unusually high CPU usage. It&#039;s believed this happens on servers with slower SSDs and spinning hard drives. You can disable it, but it will mean there will be no journald logs for your server and you can&#039;t use features like Systemd sockets.&lt;br /&gt;
&lt;br /&gt;
To disable it, unwrap the &amp;lt;code&amp;gt;srcds_linux64&amp;lt;/code&amp;gt; command from &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ExecStart=/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10091</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10091"/>
		<updated>2026-03-12T06:30:39Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.   &lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10051</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10051"/>
		<updated>2026-03-05T19:28:27Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [https://steamcommunity.com/dev/managegameservers this page]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.   &lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read the last paragraph of [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10050</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10050"/>
		<updated>2026-03-05T19:26:05Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [[https://steamcommunity.com/dev/managegameservers|this page]]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.   &lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read the last paragraph of [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10049</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10049"/>
		<updated>2026-03-05T19:25:44Z</updated>

		<summary type="html">&lt;p&gt;Webb: Fix link formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [[this page|https://steamcommunity.com/dev/managegameservers]]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.   &lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read the last paragraph of [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_legacy_Linux_server_extras&amp;diff=10045</id>
		<title>Dedicated legacy Linux server extras</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_legacy_Linux_server_extras&amp;diff=10045"/>
		<updated>2026-03-02T12:28:57Z</updated>

		<summary type="html">&lt;p&gt;Webb: Ditto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
{{Ambox|contents=This guide is written for the old &#039;&#039;Team Fortress 2 Classic&#039;&#039; non-Steam builds. This guide will not work for the modern &#039;&#039;Team Fortress 2 Classified&#039;&#039; Steam builds as it requires special steps.}}&lt;br /&gt;
&lt;br /&gt;
== SourceMod+Metamod setup ==&lt;br /&gt;
&lt;br /&gt;
SourceMod+Metamod is powerful administrator tool for dedicated server owners and operators. SourceMod lets you add administrators easily based on SteamID, control and authenticate to the server securely and even add additional functionality to everyone on server like extended map voting functionality.&lt;br /&gt;
&lt;br /&gt;
SourceMod isn’t necessarily drag-and-drop like supported SM games are such as live TF2 and CS:Source due to this simply being a mod built off of Source SDK 2013 with things like a different game name (&amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt;), offsets, signatures, etc.&lt;br /&gt;
&lt;br /&gt;
While the process of getting SM to work isn’t that hard, generic source server guides do not cover few unique factors that come with setting up fully working MM+SM for mods like TF2 Classic.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
This guide assumes you already have a dedicated Linux server installed that can run without issues. If not you should follow [[Dedicated Linux server|this guide]] to setup your server first.&lt;br /&gt;
&lt;br /&gt;
This guide will use a &amp;lt;code&amp;gt;/opt/&amp;lt;/code&amp;gt;-based installation, so feel free to follow this guide directly if you use the same directory too. We&#039;ll refer to it as &amp;lt;code&amp;gt;/opt/tf2classic/server/&amp;lt;/code&amp;gt;, sometimes just &amp;lt;code&amp;gt;../server/&amp;lt;/code&amp;gt;. Otherwise remember to use your own path instead.&lt;br /&gt;
&lt;br /&gt;
=== Getting SourceMod and MetaMod ===&lt;br /&gt;
Visit the Stable builds section of [https://www.sourcemod.net/downloads.php?branch=stable sourcemod.net] and grab the latest Linux build and upload it to your server using SFTP. If you do not have SFTP on your server, download it to your server using wget or similar tool.&lt;br /&gt;
&lt;br /&gt;
Using Terminal or SSH instead of SFTP, first navigate to your server tf2classic folder. We&#039;ll navigate to &amp;lt;code&amp;gt;/opt/tf2classic/server/tf2classic/&amp;lt;/code&amp;gt; first.&lt;br /&gt;
&amp;lt;br&amp;gt;Then you can run wget to download SourceMod archive to your current directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$ wget https://sm.alliedmods.net/smdrop/1.11/sourcemod-1.11.0-git6917-linux.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You’ll also need stable [https://www.sourcemm.net/downloads.php?branch=stable Metamod:Source]. Download it with one of the ways you did.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$ wget https://mms.alliedmods.net/mmsdrop/1.11/mmsource-1.11.0-git1148-linux.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;These links in wget examples may be outdated. You can check both SourceMod &amp;amp; metamod:source downloads page for the newest version and replace any outdated URL&#039;s from there.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can now extract both inside your &amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt; folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; tar -xf sourcemod-1.11.0-git6917-linux.tar.gz&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; tar -xf mmsource-1.11.0-git1148-linux.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can delete the archive files after the extracted files are in correct place.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem sourcemod-1.11.0-git6917-linux.tar.gz&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem mmsource-1.11.0-git1148-linux.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replacing &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Correct &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; is necessary for metamod:source to start correctly. Since this is a third party mod, we can use a web tool to generate a custom metamod.vdf file that points to &amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt;. Otherwise, we create one from scratch in text editor.&lt;br /&gt;
&lt;br /&gt;
You should navigate to your &amp;lt;code&amp;gt;../server/tf2classic/addons/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You can now delete &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;metamod_x64.vdf&amp;lt;/code&amp;gt; in this directory. No need to back up these or anything, they are less than useless for TF2C server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem metamod.vdf&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem metamod_x64.vdf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Head over to [https://www.sourcemm.net/vdf sourcemm.net/vdf].&lt;br /&gt;
You’re going to leave the “Game:” blank, or as “—”. In the “Game Folder” box, enter &amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt;. After downloading generated file with these variables, use SFTP to transfer it to your server&#039;s &amp;lt;code&amp;gt;../server/tf2classic/addons/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
If you currently do not have SFTP available on your game server, you can alternatively do everything from Command Line/SSH, provided you have a text editor like &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; installed.&lt;br /&gt;
&lt;br /&gt;
Make sure that you are working in &amp;lt;code&amp;gt;../server/tf2classic/addons&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
First create a &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; file in this directory with following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; touch metamod.vdf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Followed by opening the file in your favorite command line text editor, &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; in this example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; nano metamod.vdf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And type in the following to this blank file:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;quot;Plugin&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;file&amp;quot;	&amp;quot;../tf2classic/addons/metamod/bin/server&amp;quot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before saving and exitting.&lt;br /&gt;
&lt;br /&gt;
===Importing custom gamedata===&lt;br /&gt;
To fix many functions of SourceMod when running under Team Fortress 2 Classic, we need to import custom gamedata.&lt;br /&gt;
&amp;lt;br&amp;gt;Move first to work under &amp;lt;code&amp;gt;../server/tf2classic/&amp;lt;/code&amp;gt; directory.  (&amp;lt;code&amp;gt;/opt/tf2classic/server/tf2classic/&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
If you are working with Ubuntu Server, you might have &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; installed. Try first the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; git clone &amp;lt;nowiki&amp;gt;https://github.com/tf2classic/SM-TF2Classic-Tools.git&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you do not have &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, download the repo with wget directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;wget https://github.com/tf2classic/SM-TF2Classic-Tools/archive/master.zip&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then unzip it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; unzip master.zip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into the directory, being either &amp;lt;code&amp;gt;SM-TF2Classic-Tools&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SM-TF2Classic-Tools-master&amp;lt;/code&amp;gt; depending on how you downloaded it.&lt;br /&gt;
&amp;lt;br&amp;gt;Run the following command to copy &amp;lt;code&amp;gt;sourcemod&amp;lt;/code&amp;gt; directory to your server&#039;s &amp;lt;code&amp;gt;addons&amp;lt;/code&amp;gt; folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; cp -r sourcemod/ ../addons/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, we need to stop sourcemod from auto-updating its gamedata. Locate the sourcemod &amp;lt;code&amp;gt;core.cfg&amp;lt;/code&amp;gt; config file (located in &amp;lt;code&amp;gt;addons/configs&amp;lt;/code&amp;gt;) and change:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;DisableAutoUpdate&amp;quot;			&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;DisableAutoUpdate&amp;quot;			&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we have the necessary gamedata for plugins and core SM and MM functions to work with TF2C.&lt;br /&gt;
&lt;br /&gt;
===Setting yourself as the “root” admin user and finalizing.===&lt;br /&gt;
&lt;br /&gt;
To register yourself as an administrator on your server&#039;s SourceMod, we have to add people to &amp;lt;code&amp;gt;admins_simple.ini&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
You want to find out your and/or your to-be administrator&#039;s SteamID using a website like [https://steamid.io/ steamid.io]. Enter your steam community URL to the site and you should get set of info that includes your &amp;lt;code&amp;gt;steamID&amp;lt;/code&amp;gt;, which should be in &amp;lt;code&amp;gt;STEAM_0:1:16&amp;lt;/code&amp;gt; format.&lt;br /&gt;
&lt;br /&gt;
Open the file &amp;lt;code&amp;gt;../server/tf2classic/addons/sourcemod/configs/admins_simple.ini&amp;lt;/code&amp;gt; with a text editor, &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; for example. The file will be full of guidance and additional information about how the file works after slashes. Do not worry about leaving it all in as every line beginning with number of slashes are simply ignored, so this filled looking file is empty as it comes to how SourceMod handles it. Punch a new line at the bottom of this file and enter the following:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;STEAM_0:1:16&amp;quot;		&amp;quot;99:z&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;STEAM_0:1:16&amp;lt;/code&amp;gt; with your own or your master administrator&#039;s steamID that you extracted with afformentioned [https://steamid.io steamid.io] for example. &amp;quot;99:z&amp;quot; in this case assigns high immunity level and root (full) access for administration and server control. You can add more people to &amp;lt;code&amp;gt;admins_simple.ini&amp;lt;/code&amp;gt; file but you should limit their access to the server appropriately by using examples within the file itself and documentation from SourceMod&#039;s wiki: https://wiki.alliedmods.net/Adding_Admins_(SourceMod)&lt;br /&gt;
&lt;br /&gt;
Save, exit and start/restart your server and everything should be running fine. You can test this by typing &amp;lt;code&amp;gt;meta version&amp;lt;/code&amp;gt; in your server console (or RCON). You should see a line like &amp;lt;code&amp;gt;&amp;quot;Loaded As: Valve Server Plugin.&amp;quot;&amp;lt;/code&amp;gt;. Additionally, if you assigned yourself as an administrator for the server, typing &amp;lt;code&amp;gt;!admin&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/admin&amp;lt;/code&amp;gt; in chat should bring up administrative menu on player hud. &amp;lt;code&amp;gt;sm_admin&amp;lt;/code&amp;gt; should additionally work when typed in to your client console window, and you can use &amp;lt;code&amp;gt;sm_rcon&amp;lt;/code&amp;gt; to use SourceMod to relay any console command to the server, if you set yourself up with &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; flag. &lt;br /&gt;
&lt;br /&gt;
Further tweaking of SourceMod to suit your needs is out of scope for this guide. You can get familiar with SourceMod&#039;s other functions and configuration in their wiki: [https://wiki.alliedmods.net/Category:SourceMod_Documentation wiki.alliedmods.net/Category:SourceMod_Documentation]&lt;br /&gt;
&lt;br /&gt;
Additionally, if you have setup RCON on your server before setting up SourceMod, you should disable it by wiping &amp;lt;code&amp;gt;rcon_password &amp;quot;&amp;quot;&amp;lt;/code&amp;gt; empty in &amp;lt;code&amp;gt;server.cfg&amp;lt;/code&amp;gt;. After it is working, using SourceMod and &amp;lt;code&amp;gt;sm_rcon&amp;lt;/code&amp;gt; for RCON commands is more secure for publicly hosted servers.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10044</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10044"/>
		<updated>2026-03-02T12:26:19Z</updated>

		<summary type="html">&lt;p&gt;Webb: Move notice to Ambox&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [[https://steamcommunity.com/dev/managegameservers|this page]]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.   &lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read the last paragraph of [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_legacy_Linux_server&amp;diff=10043</id>
		<title>Dedicated legacy Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_legacy_Linux_server&amp;diff=10043"/>
		<updated>2026-03-02T12:24:42Z</updated>

		<summary type="html">&lt;p&gt;Webb: Add notice that this is for legacy version, change notices to ambox&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|contents=This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].}}&lt;br /&gt;
{{Ambox|contents=This guide is written for the old &#039;&#039;Team Fortress 2 Classic&#039;&#039; non-Steam builds. For the latest &#039;&#039;Team Fortress 2 Classified&#039;&#039; on Steam see [[Dedicated Linux server|this guide]].}}&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an x86_64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 20GB of free storage&lt;br /&gt;
* A minimum of a 10Mbps upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: A port that&#039;s been forwarded for the server if you wish to have it accessible over the internet&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other distros may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; Using an x86 compatibility layer like Box86 for another architecture is unsupported and may not work.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required packages and tools for our server to work, as well as for installation.&lt;br /&gt;
&lt;br /&gt;
Since the legacy TF2C branch, Source SDK, and SteamCMD are built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell. &lt;br /&gt;
&lt;br /&gt;
=== Installing Source SDK Base 2013 Dedicated Server (SDK 2013) ===&lt;br /&gt;
&lt;br /&gt;
Switch to the new &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user you made, and run SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should be dropped into a SteamCMD shell. We can install the SDK 2013 now. Note that &amp;lt;code&amp;gt;force_install_dir&amp;lt;/code&amp;gt; must be ran before &amp;lt;code&amp;gt;login anonymous&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/sdk&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 244310 -beta previous2021&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If everything went well, &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; should be installed and you should be back at your user shell.&lt;br /&gt;
Before we continue we&#039;ll need to fix some files.&lt;br /&gt;
&lt;br /&gt;
Valve changed some shared object file names in the SDK, but the objects included with our install of SDK 2013 have not adopted the new names. &lt;br /&gt;
Since these are simply renames, we can symlink them. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Your server will not start without doing this.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/sdk/bin&lt;br /&gt;
$ ln -s datacache_srv.so datacache.so&lt;br /&gt;
$ ln -s dedicated_srv.so dedicated.so&lt;br /&gt;
$ ln -s engine_srv.so engine.so&lt;br /&gt;
$ ln -s materialsystem_srv.so materialsystem.so&lt;br /&gt;
$ ln -s replay_srv.so replay.so&lt;br /&gt;
$ ln -s scenefilecache_srv.so scenefilecache.so&lt;br /&gt;
$ ln -s shaderapiempty_srv.so shaderapiempty.so&lt;br /&gt;
$ ln -s studiorender_srv.so studiorender.so&lt;br /&gt;
$ ln -s vphysics_srv.so vphysics.so&lt;br /&gt;
$ ln -s soundemittersystem_srv.so soundemittersystem.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, we&#039;ll also symlink &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory to prevent bugs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk32&lt;br /&gt;
$ ln -s ~/sdk/bin/steamclient.so ~/.steam/sdk32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing TF2C ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ll be downloading the archived verison of TF2C, since it&#039;s unlikely to get updates. You have the option of using TF2CDownloader, but we won&#039;t cover it here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wget https://wiki.tf2classic.com/kachemak/tf2classic.zip -O /tmp/tf2classic.zip&lt;br /&gt;
$ mkdir ~/sdk/tf2classic&lt;br /&gt;
$ cd ~/sdk/tf2classic&lt;br /&gt;
$ 7z x /tmp/tf2classic.zip &amp;amp;&amp;amp; rm /tmp/tf2classic.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will download the latest archive, create its directory, and extract it. If extraction succeeds it will also delete the downloaded archive.&lt;br /&gt;
&lt;br /&gt;
We&#039;ll also need to do a quick symlink in TF2C&#039;s bin folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/sdk/tf2classic/bin&lt;br /&gt;
$ ln -s server.so server_srv.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing the server ==&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/sdk&lt;br /&gt;
$ ./srcds_run -game tf2classic +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start.&lt;br /&gt;
&lt;br /&gt;
== Server Configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;sdk/tf2classic/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/sdk/tf2classic/cfg/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/srcds/sdk/tf2classic/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an SDK 2013 update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update SDK 2013 for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update SDK 2013 on our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-sdk.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/sdk&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 244310 -beta previous2021&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-sdk.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/sdk&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=/usr/games/steamcmd +runscript /home/srcds/bin/update-sdk.steamcmd # Exclude or comment this if you don&#039;t want to check for an update on each restart&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/sdk/srcds_linux +map ctf_2fort -game tf2classic +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;/br&amp;gt;See also [[Dedicated_Linux_server_extras|Dedicated Linux Server Extras]].&#039;&#039;&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10042</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=10042"/>
		<updated>2026-03-02T12:11:41Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you want your server to appear on the server browser with SDR enabled you will need to supply a GLST token. You can acquire a key by going to [[https://steamcommunity.com/dev/managegameservers|this page]]. Once you&#039;ve got it, put &amp;lt;code&amp;gt;sv_setsteamaccount $KEY&amp;lt;/code&amp;gt; in your configuration, replacing $KEY with the token from the page.   &lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server not showing up on the server browser while using SDR ===&lt;br /&gt;
&lt;br /&gt;
This is likely happening because you enabled use of the SDR but didn&#039;t supply a game key. Read the last paragraph of [[#Enabling the Steam Datagram Relay|the last paragraph of this section]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9858</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9858"/>
		<updated>2026-02-06T08:21:32Z</updated>

		<summary type="html">&lt;p&gt;Webb: Re-add steamclient.so link part.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before continuing, we&#039;ll need to symlink the install&#039;s &amp;lt;code&amp;gt;steamclient.so&amp;lt;/code&amp;gt; to a special directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9849</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9849"/>
		<updated>2026-02-04T21:48:21Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other Linux distributions may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are unsupported. Compatibility layers like FEX or Box64 may not work or cause unexpected problems.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9848</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9848"/>
		<updated>2026-02-04T21:42:30Z</updated>

		<summary type="html">&lt;p&gt;Webb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* An opened port on your firewall for the server if you want a persistent IP address (unless using SDR, see [[#Enabling the Steam Datagram Relay|this section on enabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other distros may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are not supported. Using an x86 compatibility layer like Box86 for another architecture may not work.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -port 27015 -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -port 27015 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
Servers can use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting and IP bans.&lt;br /&gt;
&lt;br /&gt;
You can enable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9847</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9847"/>
		<updated>2026-02-04T21:36:43Z</updated>

		<summary type="html">&lt;p&gt;Webb: Make test a subsection of install&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An opened port on your firewall for the server if you want a persistent IP address (see [[#Disabling the Steam Datagram Relay|this section on disabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other distros may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are not supported. Using an x86 compatibility layer like Box86 for another architecture may not work.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the server ===&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Disabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
By default, the dedicated server will use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting.&lt;br /&gt;
&lt;br /&gt;
You can disable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 0&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;. You should also manually assign a port to the server by adding the &amp;lt;code&amp;gt;-port&amp;lt;/code&amp;gt; argument to the server launch command. You will need the assigned port forwarded in your router and allowed in your firewall.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9846</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9846"/>
		<updated>2026-02-04T21:36:07Z</updated>

		<summary type="html">&lt;p&gt;Webb: No longer need to symlink at all.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An opened port on your firewall for the server if you want a persistent IP address (see [[#Disabling the Steam Datagram Relay|this section on disabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other distros may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are not supported. Using an x86 compatibility layer like Box86 for another architecture may not work.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing the server ==&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Disabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
By default, the dedicated server will use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting.&lt;br /&gt;
&lt;br /&gt;
You can disable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 0&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;. You should also manually assign a port to the server by adding the &amp;lt;code&amp;gt;-port&amp;lt;/code&amp;gt; argument to the server launch command. You will need the assigned port forwarded in your router and allowed in your firewall.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is likely due to a problem with &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt;. It&#039;s possible it wasn&#039;t updated or is corrupted. Validate your install.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9687</id>
		<title>Dedicated Linux server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server&amp;diff=9687"/>
		<updated>2026-01-31T23:36:35Z</updated>

		<summary type="html">&lt;p&gt;Webb: No longer necessary to symlink server.so&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is based on a guide written by Raizo, the original of which can be found [https://blog.raizo.dev/posts/tf2-classic-linux-server-tutorial/ here].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Reading this article ==&lt;br /&gt;
&amp;lt;!-- Originally from https://wiki.teamfortress.com/wiki/Linux_dedicated_server#Reading_this_article --&amp;gt;&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; is meant to be run as &#039;&#039;&#039;root&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; is meant to be run as a &#039;&#039;&#039;regular user&#039;&#039;&#039; without root permissions. In this case the &amp;lt;code&amp;gt;srcds&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
A command prefixed by &amp;lt;code&amp;gt;Steam&amp;gt;&amp;lt;/code&amp;gt; is meant to be run inside of a SteamCMD shell.&lt;br /&gt;
&lt;br /&gt;
Some commands are listed in-line with the rest of a paragraph and lack this symbol, in which case you should run the command as whichever account you&#039;re currently logged in with.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A Linux server running Ubuntu Server&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; on an amd64 CPU&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt; with root access&lt;br /&gt;
* At least 25GB of free storage&lt;br /&gt;
* A minimum of a ten megabit upload speed if you intend on hosting a server over the Internet, more will be needed if you host custom content&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An opened port on your firewall for the server if you want a persistent IP address (see [[#Disabling the Steam Datagram Relay|this section on disabling the Steam Datagram Relay]])&lt;br /&gt;
* &#039;&#039;Optional&#039;&#039;: An SSH/SFTP client if doing remote access/file management&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; This guide was written for and tested on Ubuntu Server 24.04 LTS Minimal. Other distros may use different package names and conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;Architectures other than amd64 (including 32-bit x86) are not supported. Using an x86 compatibility layer like Box86 for another architecture may not work.&lt;br /&gt;
&lt;br /&gt;
== Preparing for install ==&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
We&#039;ll need to install some required software and tools for our server first. Let&#039;s start with SteamCMD, which we&#039;ll use to download and update the server software.&lt;br /&gt;
&lt;br /&gt;
Since SteamCMD is built for 32-bit, we&#039;ll need to enable 32-bit packages. We&#039;ll also add the &amp;lt;code&amp;gt;multiverse&amp;lt;/code&amp;gt; repository which has SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# add-apt-repository multiverse&lt;br /&gt;
# dpkg --add-architecture i386&lt;br /&gt;
# apt update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we&#039;ll install the &amp;lt;code&amp;gt;dialog&amp;lt;/code&amp;gt; package so the Steam Subscriber Agreement dialog works, and then the rest of the packages we need.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install dialog&lt;br /&gt;
# apt install steamcmd p7zip aria2 tilde lib32z1 libbz2-1.0:i386 lib32gcc-s1 lib32stdc++6 libcurl3-gnutls:i386 libsdl2-2.0-0:i386 wget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your version of Ubuntu doesn&#039;t come with a text editor, you may install one now. For this guide we&#039;ll use &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# apt install nano&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a user for the server ===&lt;br /&gt;
&lt;br /&gt;
Pick a directory to install your server into. Many put it under a directory in &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt;, but for this guide we&#039;ll be using &amp;lt;code&amp;gt;/home/srcds&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Create a disabled user with a home directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# useradd -s /bin/false -mr srcds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; creates a home directory for the new user, &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; specifies that it&#039;s a system account that will not have a password, and &amp;lt;code&amp;gt;-s /bin/false&amp;lt;/code&amp;gt; prevents the account from having a default shell.&lt;br /&gt;
&lt;br /&gt;
=== Installing the live TF2 server ===&lt;br /&gt;
&lt;br /&gt;
The live version of TF2&#039;s dedicated server is required to run a Classified server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo -Hu srcds bash&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/tf&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 232250 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing the dedicated server ==&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;ve quit SteamCMD before continuing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd&lt;br /&gt;
Steam&amp;gt;force_install_dir /home/srcds/classified&lt;br /&gt;
Steam&amp;gt;login anonymous&lt;br /&gt;
Steam&amp;gt;app_update 3557020 validate&lt;br /&gt;
Steam&amp;gt;quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fixing libraries with symlinks ===&lt;br /&gt;
&lt;br /&gt;
Next we&#039;ll need to make some symlinks, since there&#039;s some issues with the installed libraries. Your server&lt;br /&gt;
will not run unless these steps are followed.&lt;br /&gt;
&lt;br /&gt;
First, let&#039;s remove the existing libvstdlib.so and replace it with a symlink &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified/bin/linux64&lt;br /&gt;
$ rm libvstdlib.so&lt;br /&gt;
$ ln -s libvstdlib_srv.so libvstdlib.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We&#039;ll also need to symlink one of SteamCMD&#039;s libraries to a special Steam directory. Note that&lt;br /&gt;
it&#039;s not from within the bin folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir -p ~/.steam/sdk64&lt;br /&gt;
$ ln -s ~/classified/linux64/steamclient.so ~/.steam/sdk64/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing the server ==&lt;br /&gt;
&lt;br /&gt;
Before proceeding, we can manually run the server to make sure the install was successful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified&lt;br /&gt;
$ ./srcds.sh -tf_path ~/tf +map ctf_2fort +sv_password changethis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all goes well, it should start and be accessible over the internet.&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
&lt;br /&gt;
For a basic, private server, you should only need to set a password in &amp;lt;code&amp;gt;classified/tf2classified/cfg/server.cfg&amp;lt;/code&amp;gt; by appending the file with &amp;lt;code&amp;gt;sv_password yourpassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
You can also make it LAN-only by appending &amp;lt;code&amp;gt;sv_lan 1&amp;lt;/code&amp;gt; in the same file.&lt;br /&gt;
&lt;br /&gt;
If you want a more complicated setup, consider using [https://cfg.tf/ cfg.tf]. If you don&#039;t need this you can skip to the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure the server type is set to “Internet and LAN” if you want players outside your LAN to be able to join (you may need to port forward if you’re on consumer broadband or open ports on your firewall).&lt;br /&gt;
&lt;br /&gt;
Upload the generated ZIP file to your server, perhaps using SFTP, and unzip the folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /tmp&lt;br /&gt;
$ unzip $PATH_TO_ARCHIVE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And merge the &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; folder with &amp;lt;code&amp;gt;/home/srcds/classified/tf2classified/cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync /tmp/cfg ~/classified/tf2classified/cfg&lt;br /&gt;
$ rm -rf /tmp/cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing the server via Systemd ==&lt;br /&gt;
&lt;br /&gt;
Systemd is a program that will automatically handle things like logging, restarts, and starting your server when your machine boots. We&#039;ll use this to run our server, instead of manually running commands.&lt;br /&gt;
&lt;br /&gt;
=== Creating an update script ===&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to create a script that will update the dedicated server for us instead of typing it out manually each time. Later, we&#039;ll optionally use this script to check and update our server automatically when the server starts. &lt;br /&gt;
&lt;br /&gt;
First, let&#039;s create a directory for the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir ~/bin&lt;br /&gt;
$ nano ~/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fill the file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/classified&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 3557020&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can execute this script manually by using the +runscript argument on SteamCMD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ . /etc/environment&lt;br /&gt;
$ steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, we will create one for the live TF2 server as that will need to be updated occasionally. We&#039;ll put&lt;br /&gt;
it at &amp;lt;code&amp;gt;/home/srcds/bin/update-tf.steamcmd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ShutdownOnFailedCommand 1 //set to 0 if updating multiple servers at once&lt;br /&gt;
@NoPromptForPassword 1&lt;br /&gt;
force_install_dir /home/srcds/tf&lt;br /&gt;
login anonymous&lt;br /&gt;
app_update 232250&lt;br /&gt;
quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating a service file ===&lt;br /&gt;
&lt;br /&gt;
Create a service file in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt; as root. For this guide we&#039;ll use &amp;lt;code&amp;gt;/etc/systemd/system/tf2c.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=TF2C Server&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=srcds&lt;br /&gt;
StandardError=journal&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
WorkingDirectory=/home/srcds/classified&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-tf.steamcmd&lt;br /&gt;
ExecStartPre=-/usr/games/steamcmd +runscript /home/srcds/bin/update-classified.steamcmd&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=&amp;quot;.:bin/linux64:$LD_LIBRARY_PATH&amp;quot;&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/script -e -c &amp;quot;/home/srcds/classified/srcds_linux64 -tf_path /home/srcds/tf +map ctf_2fort +maxplayers 24&amp;quot; /dev/null&lt;br /&gt;
TimeoutStartSec=infinity&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, enable the service to start with Systemd on boot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl enable tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may create as many services as you have TF2C servers but remember to name the service files uniquely. When modifying existing service files, remember to run &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt; before restarting the service.&lt;br /&gt;
&lt;br /&gt;
=== Automatic restarts using crontab ===&lt;br /&gt;
&lt;br /&gt;
Cron is a program built into most Linux distros that runs scheduled commands.&lt;br /&gt;
&lt;br /&gt;
As root, execute &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt;. This will open a special file in your editor where you can declare what jobs you want to run and when. Let&#039;s add a job to run at 04:00 that will restart our server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 4 * * * systemctl restart tf2c.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manually managing services ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t wish to use the service files above to automatically boot servers, or you need to perform these actions for maintenance: you may issue commands to manually &#039;&#039;start&#039;&#039;, &#039;&#039;stop&#039;&#039;, &#039;&#039;restart&#039;&#039;, or &#039;&#039;update&#039;&#039; the server(s) through systemd. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl restart tf2c # in case you need to restart manually or to grab updates!! &lt;br /&gt;
# systemctl stop tf2c # in case you need to stop the server manually&lt;br /&gt;
# systemctl start tf2c # in case you need to start the server manually&lt;br /&gt;
# systemctl disable tf2c # in case you need to stop the server from booting as your system initializes &lt;br /&gt;
# systemctl enable tf2c # in case you need to start the server to boot as your system initializes &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Disabling the Steam Datagram Relay ===&lt;br /&gt;
&lt;br /&gt;
By default, the dedicated server will use the Steam Datagram Relay. It masks your server&#039;s IP address, helps prevent DDoS attacks, and allows you to run a server without port forwarding or configuring firewalls. However, this comes at the cost of added latency and using ephemeral IP addresses for your server, the latter breaking server favoriting.&lt;br /&gt;
&lt;br /&gt;
You can disable this by adding &amp;lt;code&amp;gt;sv_use_steam_networking 0&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;classified/tf2classified/cfg/default.cfg&amp;lt;/code&amp;gt;. You should also manually assign a port to the server by adding the &amp;lt;code&amp;gt;-port&amp;lt;/code&amp;gt; argument to the server launch command. You will need the assigned port forwarded in your router and allowed in your firewall.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Sounds are missing/only stock weapons are usable ===&lt;br /&gt;
&lt;br /&gt;
This is due to a missing &amp;lt;code&amp;gt;libvstdlib.so&amp;lt;/code&amp;gt; symlink. Ensure that it&#039;s symlinked properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/classified/bin/linux64&lt;br /&gt;
$ rm libvstdlib.so&lt;br /&gt;
$ ln -s libvstdlib_srv.so libvstdlib.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=User:Webb/Steam_dedicated_server&amp;diff=9683</id>
		<title>User:Webb/Steam dedicated server</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=User:Webb/Steam_dedicated_server&amp;diff=9683"/>
		<updated>2026-01-31T12:53:23Z</updated>

		<summary type="html">&lt;p&gt;Webb: Make redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Dedicated_Linux_server]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server_extras&amp;diff=9682</id>
		<title>Dedicated Linux server extras</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_Linux_server_extras&amp;diff=9682"/>
		<updated>2026-01-31T12:52:16Z</updated>

		<summary type="html">&lt;p&gt;Webb: Webb moved page Dedicated Linux server extras to Dedicated legacy Linux server extras: Now legacy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Dedicated legacy Linux server extras]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
	<entry>
		<id>https://wiki.tf2classified.com/w/index.php?title=Dedicated_legacy_Linux_server_extras&amp;diff=9681</id>
		<title>Dedicated legacy Linux server extras</title>
		<link rel="alternate" type="text/html" href="https://wiki.tf2classified.com/w/index.php?title=Dedicated_legacy_Linux_server_extras&amp;diff=9681"/>
		<updated>2026-01-31T12:52:16Z</updated>

		<summary type="html">&lt;p&gt;Webb: Webb moved page Dedicated Linux server extras to Dedicated legacy Linux server extras: Now legacy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Note: This guide was adapted and revised from a guide written by Raizo, the original of which can be found here: https://iraizo.github.io/tf2-classic-sourcemod-setup/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== SourceMod+Metamod setup ==&lt;br /&gt;
&lt;br /&gt;
SourceMod+Metamod is powerful administrator tool for dedicated server owners and operators. SourceMod lets you add administrators easily based on SteamID, control and authenticate to the server securely and even add additional functionality to everyone on server like extended map voting functionality.&lt;br /&gt;
&lt;br /&gt;
SourceMod isn’t necessarily drag-and-drop like supported SM games are such as live TF2 and CS:Source due to this simply being a mod built off of Source SDK 2013 with things like a different game name (&amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt;), offsets, signatures, etc.&lt;br /&gt;
&lt;br /&gt;
While the process of getting SM to work isn’t that hard, generic source server guides do not cover few unique factors that come with setting up fully working MM+SM for mods like TF2 Classic.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
This guide assumes you already have a dedicated Linux server installed that can run without issues. If not you should follow [[Dedicated Linux server|this guide]] to setup your server first.&lt;br /&gt;
&lt;br /&gt;
This guide will use a &amp;lt;code&amp;gt;/opt/&amp;lt;/code&amp;gt;-based installation, so feel free to follow this guide directly if you use the same directory too. We&#039;ll refer to it as &amp;lt;code&amp;gt;/opt/tf2classic/server/&amp;lt;/code&amp;gt;, sometimes just &amp;lt;code&amp;gt;../server/&amp;lt;/code&amp;gt;. Otherwise remember to use your own path instead.&lt;br /&gt;
&lt;br /&gt;
=== Getting SourceMod and MetaMod ===&lt;br /&gt;
Visit the Stable builds section of [https://www.sourcemod.net/downloads.php?branch=stable sourcemod.net] and grab the latest Linux build and upload it to your server using SFTP. If you do not have SFTP on your server, download it to your server using wget or similar tool.&lt;br /&gt;
&lt;br /&gt;
Using Terminal or SSH instead of SFTP, first navigate to your server tf2classic folder. We&#039;ll navigate to &amp;lt;code&amp;gt;/opt/tf2classic/server/tf2classic/&amp;lt;/code&amp;gt; first.&lt;br /&gt;
&amp;lt;br&amp;gt;Then you can run wget to download SourceMod archive to your current directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$ wget https://sm.alliedmods.net/smdrop/1.11/sourcemod-1.11.0-git6917-linux.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You’ll also need stable [https://www.sourcemm.net/downloads.php?branch=stable Metamod:Source]. Download it with one of the ways you did.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$ wget https://mms.alliedmods.net/mmsdrop/1.11/mmsource-1.11.0-git1148-linux.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;These links in wget examples may be outdated. You can check both SourceMod &amp;amp; metamod:source downloads page for the newest version and replace any outdated URL&#039;s from there.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can now extract both inside your &amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt; folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; tar -xf sourcemod-1.11.0-git6917-linux.tar.gz&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; tar -xf mmsource-1.11.0-git1148-linux.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can delete the archive files after the extracted files are in correct place.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem sourcemod-1.11.0-git6917-linux.tar.gz&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem mmsource-1.11.0-git1148-linux.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replacing &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Correct &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; is necessary for metamod:source to start correctly. Since this is a third party mod, we can use a web tool to generate a custom metamod.vdf file that points to &amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt;. Otherwise, we create one from scratch in text editor.&lt;br /&gt;
&lt;br /&gt;
You should navigate to your &amp;lt;code&amp;gt;../server/tf2classic/addons/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You can now delete &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;metamod_x64.vdf&amp;lt;/code&amp;gt; in this directory. No need to back up these or anything, they are less than useless for TF2C server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem metamod.vdf&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; rem metamod_x64.vdf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Head over to [https://www.sourcemm.net/vdf sourcemm.net/vdf].&lt;br /&gt;
You’re going to leave the “Game:” blank, or as “—”. In the “Game Folder” box, enter &amp;lt;code&amp;gt;tf2classic&amp;lt;/code&amp;gt;. After downloading generated file with these variables, use SFTP to transfer it to your server&#039;s &amp;lt;code&amp;gt;../server/tf2classic/addons/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
If you currently do not have SFTP available on your game server, you can alternatively do everything from Command Line/SSH, provided you have a text editor like &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; installed.&lt;br /&gt;
&lt;br /&gt;
Make sure that you are working in &amp;lt;code&amp;gt;../server/tf2classic/addons&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
First create a &amp;lt;code&amp;gt;metamod.vdf&amp;lt;/code&amp;gt; file in this directory with following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; touch metamod.vdf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Followed by opening the file in your favorite command line text editor, &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; in this example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; nano metamod.vdf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And type in the following to this blank file:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;quot;Plugin&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;file&amp;quot;	&amp;quot;../tf2classic/addons/metamod/bin/server&amp;quot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before saving and exitting.&lt;br /&gt;
&lt;br /&gt;
===Importing custom gamedata===&lt;br /&gt;
To fix many functions of SourceMod when running under Team Fortress 2 Classic, we need to import custom gamedata.&lt;br /&gt;
&amp;lt;br&amp;gt;Move first to work under &amp;lt;code&amp;gt;../server/tf2classic/&amp;lt;/code&amp;gt; directory.  (&amp;lt;code&amp;gt;/opt/tf2classic/server/tf2classic/&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
If you are working with Ubuntu Server, you might have &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; installed. Try first the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; git clone &amp;lt;nowiki&amp;gt;https://github.com/tf2classic/SM-TF2Classic-Tools.git&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you do not have &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, download the repo with wget directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;wget https://github.com/tf2classic/SM-TF2Classic-Tools/archive/master.zip&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then unzip it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; unzip master.zip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into the directory, being either &amp;lt;code&amp;gt;SM-TF2Classic-Tools&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SM-TF2Classic-Tools-master&amp;lt;/code&amp;gt; depending on how you downloaded it.&lt;br /&gt;
&amp;lt;br&amp;gt;Run the following command to copy &amp;lt;code&amp;gt;sourcemod&amp;lt;/code&amp;gt; directory to your server&#039;s &amp;lt;code&amp;gt;addons&amp;lt;/code&amp;gt; folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$&amp;lt;/nowiki&amp;gt; cp -r sourcemod/ ../addons/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, we need to stop sourcemod from auto-updating its gamedata. Locate the sourcemod &amp;lt;code&amp;gt;core.cfg&amp;lt;/code&amp;gt; config file (located in &amp;lt;code&amp;gt;addons/configs&amp;lt;/code&amp;gt;) and change:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;DisableAutoUpdate&amp;quot;			&amp;quot;no&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;DisableAutoUpdate&amp;quot;			&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we have the necessary gamedata for plugins and core SM and MM functions to work with TF2C.&lt;br /&gt;
&lt;br /&gt;
===Setting yourself as the “root” admin user and finalizing.===&lt;br /&gt;
&lt;br /&gt;
To register yourself as an administrator on your server&#039;s SourceMod, we have to add people to &amp;lt;code&amp;gt;admins_simple.ini&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
You want to find out your and/or your to-be administrator&#039;s SteamID using a website like [https://steamid.io/ steamid.io]. Enter your steam community URL to the site and you should get set of info that includes your &amp;lt;code&amp;gt;steamID&amp;lt;/code&amp;gt;, which should be in &amp;lt;code&amp;gt;STEAM_0:1:16&amp;lt;/code&amp;gt; format.&lt;br /&gt;
&lt;br /&gt;
Open the file &amp;lt;code&amp;gt;../server/tf2classic/addons/sourcemod/configs/admins_simple.ini&amp;lt;/code&amp;gt; with a text editor, &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; for example. The file will be full of guidance and additional information about how the file works after slashes. Do not worry about leaving it all in as every line beginning with number of slashes are simply ignored, so this filled looking file is empty as it comes to how SourceMod handles it. Punch a new line at the bottom of this file and enter the following:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;STEAM_0:1:16&amp;quot;		&amp;quot;99:z&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;STEAM_0:1:16&amp;lt;/code&amp;gt; with your own or your master administrator&#039;s steamID that you extracted with afformentioned [https://steamid.io steamid.io] for example. &amp;quot;99:z&amp;quot; in this case assigns high immunity level and root (full) access for administration and server control. You can add more people to &amp;lt;code&amp;gt;admins_simple.ini&amp;lt;/code&amp;gt; file but you should limit their access to the server appropriately by using examples within the file itself and documentation from SourceMod&#039;s wiki: https://wiki.alliedmods.net/Adding_Admins_(SourceMod)&lt;br /&gt;
&lt;br /&gt;
Save, exit and start/restart your server and everything should be running fine. You can test this by typing &amp;lt;code&amp;gt;meta version&amp;lt;/code&amp;gt; in your server console (or RCON). You should see a line like &amp;lt;code&amp;gt;&amp;quot;Loaded As: Valve Server Plugin.&amp;quot;&amp;lt;/code&amp;gt;. Additionally, if you assigned yourself as an administrator for the server, typing &amp;lt;code&amp;gt;!admin&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/admin&amp;lt;/code&amp;gt; in chat should bring up administrative menu on player hud. &amp;lt;code&amp;gt;sm_admin&amp;lt;/code&amp;gt; should additionally work when typed in to your client console window, and you can use &amp;lt;code&amp;gt;sm_rcon&amp;lt;/code&amp;gt; to use SourceMod to relay any console command to the server, if you set yourself up with &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; flag. &lt;br /&gt;
&lt;br /&gt;
Further tweaking of SourceMod to suit your needs is out of scope for this guide. You can get familiar with SourceMod&#039;s other functions and configuration in their wiki: [https://wiki.alliedmods.net/Category:SourceMod_Documentation wiki.alliedmods.net/Category:SourceMod_Documentation]&lt;br /&gt;
&lt;br /&gt;
Additionally, if you have setup RCON on your server before setting up SourceMod, you should disable it by wiping &amp;lt;code&amp;gt;rcon_password &amp;quot;&amp;quot;&amp;lt;/code&amp;gt; empty in &amp;lt;code&amp;gt;server.cfg&amp;lt;/code&amp;gt;. After it is working, using SourceMod and &amp;lt;code&amp;gt;sm_rcon&amp;lt;/code&amp;gt; for RCON commands is more secure for publicly hosted servers.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Webb</name></author>
	</entry>
</feed>