A Counter-Strike 2 server is a headless Source 2 binary, one UDP port, a very large install, and one credential you have to fetch yourself. The credential is a Game Server Login Token from Valve, issued to an account that owns the game, and it is why most first servers appear to work in every way except being findable. Everything after that is server.cfg, a couple of files that quietly overwrite it, and - if you want anything the base game does not do - Metamod and CounterStrikeSharp.
This guide covers the whole path: the token, the SteamCMD install, the launch line and the game mode matrix, the cvars worth setting, ports and RCON, GOTV, workshop maps, plugins, and the errors people actually hit.
What a CS2 server is, and what you need before you start#
The dedicated server ships under the same Steam app id as the game, 730. There is no separate "server" app to find. It runs one match, on one map, in one mode, and it is configured by console variables rather than by a single settings file: what looks like configuration is really a stack of .cfg files executing in a fixed order at map load.
Before you start, you need four things.
- A machine or a plan. One fast CPU core does more for a CS2 server than four slow ones. Memory is rarely the limit.
- A Game Server Login Token. Covered in the next section. It is not optional for a public server.
- Disk, far more than you expect. The CS2 server install is in the region of 60 GB, and SteamCMD reserves the space before it starts downloading rather than filling the disk and failing halfway. A Source 1 server was two gigabytes; this is not that. Budget headroom on top for updates, demos and plugins.
- One UDP port, plus a second if you want GOTV.
It is worth deciding at this point which of three servers you are building, because they diverge quickly. A private 5v5 practice server needs almost no configuration beyond the match rules and a password. A community server - deathmatch, retakes, surf, minigames - needs plugins, and plugins are the part that breaks on Valve's update schedule. A public competitive server that strangers join needs the token, moderation and a map rotation. Everything below applies to all three; the plugin section only matters to the second.
Getting the Game Server Login Token#
Valve issues one token per server, to a Steam account, from the Game Server Account Management page at steamcommunity.com/dev/managegameservers. Sign in with an account that owns CS2, enter app id 730 and a memo you will recognise in six months, and you get a 32-character token.
Three rules about that token, all learned the hard way by somebody else:
- It belongs to the account, not to the server. If the token collects a ban, the ban lands on the Steam account that created it. That is the reason no host creates one for you and the reason nobody sane shares one between servers.
- One token per server. Running two servers on the same token gets both of them deregistered from the master servers, usually at the worst moment.
- An unused token can be revoked. Tokens that go a long time without being used are cleared out. If a server that has been off for months will not list any more, look at the token page before you look at anything else.
The token goes on the launch line as +sv_setsteamaccount <token>, or into the Startup or Setup tab of a panel. Do not also set it in server.cfg. Two sources for the same value means one of them is wrong and you will not know which.
A token is a credential. If you paste it into a Discord channel to ask for help, revoke it and make a new one before you read the replies.
Without a token the server still runs, and people can still join it with connect 203.0.113.10:27015 from the console. What it will not do is register with Valve's master servers, which means it never appears in the community browser and workshop content can fail to download. That is the single most common "my server is broken" report, and the server is not broken. Steam game server tokens explained goes through bans, app ids and what happens when a token is revoked mid-match.
Installing the server with SteamCMD#
The install is one SteamCMD command. On your own Linux machine:
$ steamcmd +force_install_dir /home/cs2/server +login anonymous \ +app_update 730 validate +quitAnonymous login works for app 730 today. Early in CS2's life it did not, which is why older guides tell you to log in with an account that owns the game - you can ignore that now. Keep validate in the line you use for updates: it re-checks every file, which is slow but is the only reliable fix for a half-applied update.
The layout that comes out the other end matters, because almost every path in this guide is relative to it:
server/ game/ bin/linuxsteamrt64/cs2 the server binary csgo/ the mod folder, still named csgo cfg/ server.cfg and the gamemode configs addons/ Metamod and plugins, if you add them maps/ workshop maps land here gameinfo.gi the search paths Metamod has to be added toYes, the folder is still called csgo. Valve kept the name through the Source 2 port, and so has every plugin that expects it. SteamCMD explained covers app ids, betas and update scripts if this is your first Steam server.
The launch line, game modes and the first map#
$ ./game/bin/linuxsteamrt64/cs2 -dedicated -usercon \ -port 27015 \ +game_type 0 +game_mode 1 \ +sv_setsteamaccount YOUR_TOKEN_HERE \ +exec server.cfg \ +map de_dust2-dedicated starts it headless. -usercon enables RCON and is easy to forget, since nothing complains about its absence until you try to connect a remote console. -port sets the game port. Put +map last: the mode cvars are read when the map loads, so a map argument earlier in the line loads before the mode is set and you get a competitive server running casual rules.
The mode itself is two numbers, carried over from CS:GO:
| Mode | game_type | game_mode |
|---|---|---|
| Casual | 0 | 0 |
| Competitive | 0 | 1 |
| Wingman (2v2) | 0 | 2 |
| Arms Race | 1 | 0 |
| Deathmatch | 1 | 2 |
| Custom | 3 | 0 |
Not every CS:GO combination survived the port, and Valve has moved modes around since. The server prints the mode it resolved during map load, so read the console on the first start rather than trusting a table - including this one. Custom (3 0) is the one to use when a plugin owns the rules and you want the game to stop applying its own.
On a panel host you do not write that line at all. The same arguments appear as fields on the Startup tab, the token goes on the Setup tab, and the binary path is already right. That is most of the value of a panel for this game: the install is 60 GB of Valve's files and none of it is interesting.
server.cfg and the configs that overwrite it#
game/csgo/cfg/server.cfg executes on every map load. So do the game mode configs - gamemode_competitive.cfg, gamemode_casual.cfg and the rest - and they run after server.cfg. This catches everybody once: you set mp_maxrounds in server.cfg, the map changes, and the mode config resets it.
The fix is the companion file. For each gamemode_<mode>.cfg there is a gamemode_<mode>_server.cfg that Valve ships empty for exactly this purpose and executes last. Mode-specific rules go there; everything else goes in server.cfg.
hostname "Longship 5v5 - EU"rcon_password "a-long-random-string"sv_password ""sv_cheats 0sv_hibernate_when_empty 1sv_allow_votes 1bot_quota 0mp_autokick 0mp_autoteambalance 1mp_limitteams 2mp_friendlyfire 1sv_deadtalk 0mp_maxrounds 24mp_overtime_enable 1mp_overtime_maxrounds 6mp_overtime_startmoney 10000mp_match_can_clinch 1mp_roundtime 1.92mp_roundtime_defuse 1.92mp_freezetime 15mp_startmoney 800mp_maxmoney 16000mp_buytime 20mp_warmuptime 60A few of those deserve a sentence each.
| Cvar | Common value | What it does |
|---|---|---|
mp_maxrounds | 24 | Rounds in regulation. 24 is MR12, the current competitive format |
mp_roundtime_defuse | 1.92 | Round length in minutes on bomb maps. 1.92 is 115 seconds |
mp_overtime_maxrounds | 6 | MR3 overtime, repeated until someone wins |
mp_match_can_clinch | 1 | End the match when the score is unreachable, rather than playing it out |
mp_autokick | 0 | Off. Otherwise idle or team-damaging players are removed automatically |
bot_quota | 0 | Bots. Each one costs real CPU, so keep it at zero unless you want them |
sv_hibernate_when_empty | 1 | Sleep at near-zero CPU with nobody connected |
sv_deadtalk | 0 | Whether dead players can be heard by the living |
sv_hibernate_when_empty is the one with a side effect worth knowing. A hibernating server uses almost nothing, which is the whole point on a shared plan, but it also stops doing work: a scheduled map change will not happen while it sleeps, and the first player to join waits a moment for it to wake. If you run a rotation on a timer, turn hibernation off and accept the CPU. The full list of cvars, with the ones that only exist in CS2, is in CS2 server commands and cvars.
Ports, RCON and GOTV#
| Port | Protocol | Purpose |
|---|---|---|
27015 | UDP | Game traffic and the Steam query the browser uses |
27015 | TCP | RCON, if -usercon is set |
27020 | UDP | GOTV, set by tv_port |
The game port carries both play and the query that the server browser reads, which is why a UDP-only firewall hole is enough for a server to be joinable and findable, and why a TCP-only rule gets you neither. If you change -port, nothing else moves with it; GOTV keeps its own number. Game server ports explained covers what a query port is doing and how to test one from outside.
RCON is a plain TCP connection on the game port, authenticated by a password sent in the clear. It has no rate limiting worth the name. Give it a long random password, never the one you use anywhere else, and prefer running commands from the panel console - which talks to the process directly rather than over the network - when you have that option. Using RCON safely is short and worth the two minutes.
GOTV is the spectator relay and the demo recorder in one:
tv_enable 1tv_port 27020tv_delay 105tv_autorecord 1tv_delaymapchange 1tv_maxclients 10tv_delay in seconds is what stops spectators from calling positions; 105 is the competitive convention. tv_autorecord 1 writes a .dem into game/csgo/ for every match, which is the cheapest anti-cheat measure available to a community server and the only way to settle an argument about round 14. Demos are small but they accumulate, so sweep the folder on a schedule.
Sizing: what actually costs CPU and memory#
Start with the thing you can stop paying for. CS2 has no tick rate to buy. The 64 versus 128 argument belonged to CS:GO. CS2 timestamps player input between ticks - the sub-tick system - so the -tickrate argument is not honoured and a host advertising a "128 tick CS2 server" is selling you a number that the engine ignores. If you want the longer version of why tick rate was never the whole story anyway, what tick rate actually means has it.
What does cost CPU, in rough order:
- Bots. Pathfinding is expensive and a full bot roster can cost more than the human players it replaces.
- Plugin timers. A CounterStrikeSharp plugin running work on every server frame instead of every second is the usual cause of a server that is fine with four players and bad with sixteen.
- Player count in modes with constant respawning. Deathmatch and retakes are heavier per player than competitive.
- GOTV, mildly, plus bandwidth per spectator.
| Server | RAM | CPU | Notes |
|---|---|---|---|
| 10-slot competitive or practice | 1 GB | 1 fast core | The common case, and it is genuinely this small |
| 12-16 casual | 2 GB | 1.5 cores | More entities, more respawns |
| 20-24 deathmatch or retakes | 2-3 GB | 2 cores | Respawn churn is the cost |
| Community server with plugins | 3-4 GB | 2-3 cores | Depends entirely on the plugins |
Memory is almost never the limit for CS2; single-core clock speed is. Before buying more of either, check which one is actually pinned - CPU vs RAM for game servers explains how to read that from a load graph rather than a feeling.
On RE:NODE, CS2 plans start at 1 GB and run to 6 GB, from $7 a month, with two port allocations so GOTV has a number of its own and an RCON password generated per server rather than left blank. The install and its updates are run for you; what you supply is the token on the Setup tab, and the install waits there until you do.
Workshop maps and plugins#
Workshop maps are loaded by id, not by file:
host_workshop_map 3070394480That downloads the map if it is missing, keeps it updated, and loads it. host_workshop_collection <id> does the same for a collection, and ds_workshop_changelevel <mapname> switches between maps already in it. Workshop downloads go through the Steam account behind your token, so a server without a valid token often shows up as "the workshop map will not download" rather than as a token problem.
Plugins are a two-layer stack and neither layer is SourceMod. SourceMod does not support CS2 and there is no sign that it will.
- Metamod:Source is the loader. It unpacks into
game/csgo/addons/metamod, and then - this is the step -game/csgo/gameinfo.gihas to be edited to addcsgo/addons/metamodto its search paths. Nothing loads until it is. - CounterStrikeSharp is the plugin runtime almost everything is written against. Plugins are .NET assemblies under
addons/counterstrikesharp/plugins, each in its own folder.
On top of that sits whatever you actually wanted: MatchZy for 5v5 matches with knife rounds, pauses, per-round backups and automatic demo upload; retake and deathmatch plugins; admin menus. Metamod and CounterStrikeSharp on CS2 walks the install, and a competitive match server config covers the scrim and practice setup end to end.
Troubleshooting#
The server does not appear in the community browser. In order: is the token set and valid, is UDP 27015 open from outside, and is the server actually finished loading a map. Test with connect <ip>:27015 from a client console - if that works, the server is fine and the listing is the problem.
"Your server needs to be restarted in order to receive the latest update." Valve pushed a client update. The server has to be updated to match before anyone can join. Run the SteamCMD line again with validate.
The server starts and exits within seconds. Almost always disk. SteamCMD reserves space for an update and gives up, leaving an install that cannot start. Check free space first, then run validate.
"Invalid Game Server Login Token". The token was regenerated, revoked for inactivity, or is being used by a second server at the same time. Make a new one and replace it in one place only.
Everything is bots, or teams keep shuffling. bot_quota 0 and mp_autoteambalance respectively, and check which file is setting them - a gamemode config executing after server.cfg is the usual culprit.
Warmup never ends. mp_warmuptime is running down but mp_warmup_pausetimer is set, or a plugin is holding warmup open for a match start it never received. mp_warmup_end in RCON forces it.
Plugins stopped working after an update. gameinfo.gi. See the warning above.
FAQ#
Do I need a Game Server Login Token for a private server?
Not if everyone connects by IP with connect <address>. The token is what registers the server with Valve so it appears in the browser and can fetch workshop content. A private practice server with a password works without one.
Can I run a 128 tick CS2 server?
No, and neither can anyone else. CS2 replaced tick rate with sub-tick input timestamps, and the -tickrate argument is ignored by the engine. Any host selling 128 tick CS2 is selling a label.
How much RAM does a CS2 server need?
A 10-slot competitive server is comfortable in 1 GB. Deathmatch and retake servers with 20 or more slots want 2-3 GB, and a plugin-heavy community server 3-4 GB. CPU clock speed limits a CS2 server long before memory does.
Does SourceMod work on CS2?
No. The CS2 plugin stack is Metamod:Source plus CounterStrikeSharp, and plugins have to be written or ported for it. SourceMod plugins from CS:GO do not run.
Why is the server install so large?
Because the dedicated server ships the same asset set as the game rather than a stripped-down version. Expect something in the region of 60 GB, and note that SteamCMD reserves the space up front, so a disk with less free will refuse the install outright instead of getting halfway.
Can I use one token on two servers?
No. Valve issues one token per server and running two on the same one deregisters both. Create a second token with its own memo on the same page.




Comments
Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.