Everything you need to run a real Counter-Strike 2 dedicated server on Linux in 2026 — GSLT, SteamCMD, server.cfg presets for competitive / DM / retake / 1v1 / community, CounterStrikeSharp plugin support (MetaMod + CSS, not SourceMod), Workshop map collections, SourceTV demos, FastDL for custom maps, and a troubleshooting table for the errors everyone actually hits.
SourceMod does not support CS2 and likely never will. The modern CS2 plugin stack is Metamod:Source + CounterStrikeSharp (CSS), which uses C# / .NET 8 instead of SourcePawn. Old CS:GO tutorials telling you to install SourceMod on CS2 are wrong. This guide uses the correct 2026 stack.
01 // Requirements
CS2 is much lighter than Rust or ARK, but tickrate and plugin overhead still matter. Pick hardware based on the kind of server you want to run:
- Operating System — Ubuntu 22.04 LTS or 24.04 LTS (Debian 12 works identically). CS2 dedicated server is Linux/Windows only; Linux is the canonical host.
- Architecture — x86_64 only. CS2 does not run on ARM. Ignore VPS offers with Ampere or Graviton CPUs for this.
- RAM — 4 GB minimum for a single 10-slot competitive server. 8 GB comfortable with plugins, SourceTV, and a second instance.
- CPU — 1 fast modern core per server instance. CS2 is single-thread bound for the tick loop. Clock speed beats core count. Aim for Ryzen 7xxx or Intel 12th gen+.
- Storage — 60 GB SSD. CS2 install is ~35 GB and Workshop maps + demos grow fast.
- Network — 1 Gbps port, unmetered preferred. UDP 27015 open inbound, HTTPS outbound to Steam.
- GSLT — Game Server Login Token, free, one per server. Required for public servers. Generate at steamcommunity.com/dev/managegameservers. App ID 730.
- Root / sudo — only for the initial setup; the server itself runs as a non-root user (we’ll create
cs2).
Hardware scenarios — pick your tier
| Use case | vCPU | RAM | Recommended VPS |
|---|---|---|---|
| Single 5v5 / 10-slot competitive, no plugins | 1 fast | 4 GB | Hostinger KVM 1 |
| Single community server (24-slot, light plugins) | 2 | 8 GB | Hostinger KVM 2 |
| Comp + retake + 1v1 (3 instances) | 2–4 | 8 GB | Hostinger KVM 2 |
| Busy 64-slot surf / bhop with many plugins | 4 | 16 GB | Hostinger KVM 4 |
| League / multi-team (5+ instances, SourceTV each) | 4–8 | 16–32 GB | Hostinger KVM 4 or KVM 8 |
Hostinger KVM 2 — 2 vCPU, 8 GB RAM, 100 GB NVMe
The sweet spot for CS2. Enough headroom for a 24-slot community server, or two to three smaller competitive / retake / 1v1 instances side by side. Full root access so you can install CounterStrikeSharp, SourceTV, FastDL, whatever you want. €8.49/month on the 12-month term.
Get Hostinger KVM 2 →GTXGaming — Source Engine Specialists
If you want a managed CS2 server without touching Linux, GTXGaming is the honest pick for Source engine. Unlike generalist hosts, they actually specialize in CS2 / TF2 / Gmod — pre-configured installs, one-click SourceMod, Workshop map auto-sync, and support staff who know what mp_autokick actually does. Global datacenters (US / EU / AU / SG), DDoS protection, and a proper game panel. Trade-off: per-slot pricing scales faster than a VPS once you pass ~32 slots or run multiple instances — that’s where a Hostinger KVM 2 wins on raw cost.
02 // Pick your server type
Before you write a single line of server.cfg, decide what you’re actually running. The cfg for a ranked 5v5 comp server looks nothing like a 1v1 arena or a bhop server. Use the picker below to get a baseline preset — the full cfg details come in section 5.
// CS2 Server Type Picker
// Recommended preset
03 // Get a GSLT (Game Server Login Token)
A GSLT is a free, per-server token from Steam that authenticates your dedicated server as a legitimate CS2 game server. Without it:
- Your server won’t appear in the public community browser.
- Players outside your LAN may fail to connect (depending on NAT).
- You can’t register for server picker services.
Generating one takes 60 seconds:
- Go to steamcommunity.com/dev/managegameservers while logged into your Steam account.
- Fill in App ID:
730(Counter-Strike 2). - Memo: anything descriptive (e.g.
hostingbuff-comp-01). - Click Create. Copy the token that appears — it looks like a 32-character hex string.
Treat a GSLT like an API key. Don’t paste it in screenshots or commit it to Git. If it leaks and gets abused (e.g. used for griefing), Valve can VAC-ban your Steam account. Store it in an env file with chmod 600.
Your Steam account needs to be in good standing: no VAC bans, no Overwatch bans, no recent cooldowns, and Steam Guard enabled. Limited accounts cannot create GSLTs.
04 // Create a non-root user
Never run a game server as root. It’s a security liability and makes SteamCMD file ownership a mess. Create a dedicated user:
# As root or with sudo
adduser --disabled-password --gecos "" cs2
usermod -aG sudo cs2 # optional, remove sudo if you don't want it later
# Switch to the cs2 user for everything that follows
su - cs2
From now on, every command in this guide runs as the cs2 user unless explicitly marked sudo.
05 // Install SteamCMD and CS2
SteamCMD is Valve’s command-line client for downloading dedicated server files. On Debian/Ubuntu you need to enable the multiverse repo and the i386 architecture (some of SteamCMD’s shim libraries are 32-bit even though CS2 itself is 64-bit):
# Back as root / sudo:
sudo dpkg --add-architecture i386
sudo add-apt-repository multiverse -y
sudo apt update
sudo apt install -y lib32gcc-s1 libstdc++6 libstdc++6:i386 steamcmd curl tar wget
# Back to the cs2 user:
su - cs2
# Create directories
mkdir -p ~/steamcmd ~/cs2-server
cd ~/steamcmd
# Fetch SteamCMD (package above provides a launcher, but a local copy is cleaner)
curl -sSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar -xz
Download CS2 dedicated server (app 730)
cd ~/steamcmd
./steamcmd.sh +force_install_dir /home/cs2/cs2-server \
+login anonymous \
+app_update 730 validate \
+quit
This pulls ~35 GB from Steam. First run takes 10–30 minutes on a 1 Gbps link. When it finishes you should see Success! App "730" fully installed.
Valve pushes CS2 updates frequently. Run the same command again to pull updates. Add validate once a month to repair any corrupted files. If your server refuses to start after an update, re-running with validate fixes 90% of cases.
06 // Write your server.cfg
CS2 reads server.cfg from /home/cs2/cs2-server/game/csgo/cfg/server.cfg at map load. Create it:
mkdir -p /home/cs2/cs2-server/game/csgo/cfg
nano /home/cs2/cs2-server/game/csgo/cfg/server.cfg
Use our CS2 Server Config Generator to build the full server.cfg in your browser — 174 documented cvars, official Valve game-mode presets (Competitive MR12, Wingman, Retakes, Deathmatch, Casual), MatchZy-ready output, and a one-click download. Three blocks of hand-written examples follow if you prefer the manual route.
Baseline competitive 5v5 (MR12) server.cfg
// =============================================
// HostingBuff CS2 competitive server.cfg (MR12)
// =============================================
// --- Identity ---
hostname "HostingBuff | 5v5 Competitive | EU"
sv_password "" // set if you want private
rcon_password "CHANGE-ME-LONG-RANDOM"
sv_region 3 // 0=US-East 1=US-West 2=South America 3=Europe 4=Asia 5=Australia 7=Middle East 8=Africa
sv_tags "competitive, hostingbuff, mr12"
// --- Logging ---
log on
sv_logbans 1
sv_logecho 1
sv_logfile 1
sv_log_onefile 0
// --- Rates / networking (subtick defaults) ---
sv_minrate 196608
sv_maxrate 0
sv_mincmdrate 64
sv_maxcmdrate 128
sv_minupdaterate 64
sv_maxupdaterate 128
fps_max 300
net_maxcleartime 0.001
// --- Match format: MR12 ---
mp_maxrounds 24
mp_overtime_enable 1
mp_overtime_maxrounds 6
mp_overtime_startmoney 12500
mp_halftime 1
mp_match_can_clinch 1
// --- Round timing ---
mp_freezetime 15
mp_roundtime 1.92
mp_roundtime_defuse 1.92
mp_roundtime_hostage 1.92
mp_buytime 20
mp_startmoney 800
mp_maxmoney 16000
mp_friendlyfire 1
mp_tkpunish 0
mp_solid_teammates 1
// --- Warmup ---
mp_warmuptime 60
mp_warmup_pausetimer 1
mp_do_warmup_period 1
// --- Team & spawn ---
mp_autoteambalance 0
mp_limitteams 0
mp_death_drop_gun 1
mp_death_drop_grenade 2
mp_death_drop_defuser 1
mp_molotovusedelay 0
mp_buy_anywhere 0
// --- Cheats / cvars locked ---
sv_cheats 0
sv_pausable 1
sv_allow_wait_command 0
sv_allow_votes 1
sv_vote_allow_spectators 0
sv_vote_issue_kick_allowed 1
// --- VAC + Steam ---
sv_secure 1
sv_pure 1
sv_consistency 1
// --- SourceTV (demos, spectators) ---
tv_enable 1
tv_port 27020
tv_maxclients 10
tv_delay 90
tv_autorecord 1
tv_snapshotrate 64
tv_title "HostingBuff SourceTV"
tv_name "HostingBuff-TV"
// --- Map rotation ---
mapgroup mg_active
// --- Ban policy ---
writebackup_serverbackup_cvars 1
// --- RCON hardening ---
sv_rcon_whitelist_address ""
sv_rcon_banpenalty 1440
sv_rcon_maxfailures 10
sv_rcon_minfailures 5
sv_rcon_minfailuretime 30
Casual community 24-slot server.cfg
hostname "HostingBuff | Community 24/7 Dust2 | EU"
sv_password ""
rcon_password "CHANGE-ME"
sv_region 3
sv_tags "community, hostingbuff, casual, 24-slot"
game_type 0
game_mode 0
mp_maxrounds 16
mp_startmoney 1000
mp_freezetime 6
mp_roundtime 2.17
mp_roundtime_defuse 1.92
mp_buytime 15
mp_buy_anywhere 0
mp_friendlyfire 0
mp_autoteambalance 1
mp_limitteams 2
mp_halftime 1
mp_warmuptime 20
sv_maxplayers 24
sv_visiblemaxplayers 24
sv_competitive_official_5v5 0
sv_allow_votes 1
mp_autokick 0
sv_full_alltalk 0
sv_alltalk 0
sv_deadtalk 1
tv_enable 1
tv_delay 45
tv_maxclients 8
mapgroup mg_active
Deathmatch (respawn) server.cfg
hostname "HostingBuff | DM 16-slot | EU"
rcon_password "CHANGE-ME"
sv_tags "dm, hostingbuff, deathmatch"
game_type 1
game_mode 2
sv_maxplayers 16
mp_timelimit 10
mp_buy_anywhere 1
mp_free_armor 1
mp_ct_default_primary "weapon_m4a1"
mp_t_default_primary "weapon_ak47"
mp_dm_time_between_bonus_weapons 30
mp_dm_bonus_length_min 30
mp_dm_bonus_length_max 30
mp_respawn_immunitytime 2
mp_force_pick_time 1
mp_teammates_are_enemies 0
mapgroup mg_active
Pick a long (20+ character) random rcon password. Anyone with rcon access can change maps, kick players, reload cfgs, and execute arbitrary console commands. If you need team rcon, put it behind an admin plugin with individual logins rather than sharing the master password.
07 // Launch script and systemd service
CS2’s dedicated binary is game/bin/linuxsteamrt64/cs2. It needs the correct working directory and environment. Wrap it in a launch script so you only edit one file when changing params:
nano /home/cs2/cs2-server/start.sh
#!/bin/bash
# HostingBuff CS2 launch script
cd /home/cs2/cs2-server
# Your GSLT (generated at steamcommunity.com/dev/managegameservers)
GSLT="YOUR_32_CHAR_TOKEN_HERE"
# Launch options
START_MAP="de_dust2"
PORT=27015
CLIENTPORT=27005
TV_PORT=27020
MAX_PLAYERS=10
./game/bin/linuxsteamrt64/cs2 \
-dedicated \
-console \
-usercon \
+game_type 0 \
+game_mode 1 \
+mapgroup mg_active \
+map ${START_MAP} \
-port ${PORT} \
-tv_port ${TV_PORT} \
-maxplayers_override ${MAX_PLAYERS} \
+sv_setsteamaccount ${GSLT} \
-authkey YOUR_WORKSHOP_API_KEY_IF_USING_WORKSHOP
chmod +x /home/cs2/cs2-server/start.sh
systemd service (auto-restart, boot-start)
Running inside tmux or screen is fine for testing, but for production you want systemd — it restarts on crash, starts on boot, and writes logs to the journal:
sudo nano /etc/systemd/system/cs2.service
[Unit]
Description=Counter-Strike 2 Dedicated Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=cs2
Group=cs2
WorkingDirectory=/home/cs2/cs2-server
ExecStart=/home/cs2/cs2-server/start.sh
Restart=on-failure
RestartSec=10
TimeoutStopSec=30
KillSignal=SIGINT
LimitNOFILE=65535
# Optional hardening
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now cs2
sudo systemctl status cs2
journalctl -u cs2 -f # tail live logs
The CS2 dedicated binary does a clean shutdown on SIGINT (save demos, flush logs, tell Steam the server is going down). SIGTERM / SIGKILL leaves orphan entries in the Steam master server list for ~5 minutes. Always use systemctl stop cs2, never kill -9.
Keeping CS2 updated
Create a simple update script:
nano /home/cs2/update.sh
#!/bin/bash
sudo systemctl stop cs2
/home/cs2/steamcmd/steamcmd.sh \
+force_install_dir /home/cs2/cs2-server \
+login anonymous \
+app_update 730 \
+quit
sudo systemctl start cs2
chmod +x /home/cs2/update.sh
Run it manually after Valve pushes an update, or wire it to a cron job that polls the Steam API for version changes. Never do unattended auto-updates mid-match — schedule them during off-hours.
08 // Install Metamod:Source and CounterStrikeSharp
This is the part every outdated CS:GO tutorial gets wrong. SourceMod does not work on CS2. The plugin stack you want is:
- Metamod:Source — the low-level loader that hooks CS2’s engine. Required.
- CounterStrikeSharp (CSS) — a .NET 8 runtime that sits on top of Metamod and lets you load C# plugins. Replaces SourcePawn.
Every CS2 plugin in 2026 worth running (MatchZy, Retakes, SharpTimer, CSSAdmin, AntiRush, etc.) is built on CounterStrikeSharp.
Install Metamod:Source (dev build for CS2)
CS2 needs the dev branch of Metamod — the stable 1.12 branch does not support CS2.
cd /tmp
# Get the latest CS2-compatible build from metamodsource.net
# (check https://www.metamodsource.net/downloads.php?branch=dev for current version)
wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1347-linux.tar.gz -O mms.tar.gz
tar -xzf mms.tar.gz -C /home/cs2/cs2-server/game/csgo/
rm mms.tar.gz
Edit the game info file so CS2 actually loads Metamod on startup:
nano /home/cs2/cs2-server/game/csgo/gameinfo.gi
Find the SearchPaths section and add one line above the existing Gamecsgo entry:
SearchPaths
{
Game_LowViolencecsgo_lv
Game+Mod csgo/addons/metamod // <-- ADD THIS LINE
Game csgo
Game csgo_core
Game csgo_imported
...
}
Use tabs, not spaces, and keep the exact same column alignment as the existing entries. If CS2 crashes on startup after editing gameinfo.gi, you almost certainly broke the indentation. Keep a backup: cp gameinfo.gi gameinfo.gi.bak before editing.
Verify in console when you start CS2:
meta version
meta list
You should see Metamod:Source version 2.x.x-dev. If Unknown command, Metamod didn’t load — re-check the gameinfo.gi edit.
Install CounterStrikeSharp
cd /tmp
# Fetch the latest WITH RUNTIME build (includes .NET 8 runtime bundled - no system dotnet needed)
wget https://github.com/roflmuffin/CounterStrikeSharp/releases/latest/download/counterstrikesharp-with-runtime-build-XXX-linux-latest.zip -O css.zip
# Replace XXX with the current build number from the release page
unzip css.zip -d /home/cs2/cs2-server/game/csgo/
rm css.zip
# Fix permissions
chown -R cs2:cs2 /home/cs2/cs2-server/game/csgo/addons
Restart the CS2 server. In console you should see:
[CSS] CounterStrikeSharp is starting up...
[CSS] Plugin loader: initialized
[CSS] Core API loaded. Version: 1.x.x
Verify Metamod and CSS are loaded
In the CS2 server console (or via rcon):
meta list
Expected output:
Listing 1 plugin:
[01] "CounterStrikeSharp" (1.x.x) by roflmuffin
If you see that line, you’re ready to install plugins.
Install CounterStrikeSharp plugins
Most CS# plugins install the same way: download, extract, drop folder into addons/counterstrikesharp/plugins/, reload.
# Example: install MatchZy (competitive match automation — knife round, pause,
# stats, .ready / .notready, GOTV forward, veto, etc.)
cd /tmp
wget https://github.com/shobhit-pathak/MatchZy/releases/latest/download/MatchZy-vX.X.X.zip -O matchzy.zip
unzip matchzy.zip -d /home/cs2/cs2-server/game/csgo/addons/counterstrikesharp/
chown -R cs2:cs2 /home/cs2/cs2-server/game/csgo/addons
# In-game console (or rcon):
css_plugins reload
Useful plugins to pair with MatchZy: CS2-SimpleAdmin (admin menu + bans), Retakes (4v4 retakes game mode), SharpTimer (surf/bhop timer), AntiRush (stop T rushing from spawn in warmup), PlayerSpeedometer (kz / surf quality of life).
09 // Workshop maps and custom map rotation
CS2 uses the Steam Workshop for custom maps. Unlike CS:GO, the server needs a Steam Web API key to fetch Workshop content:
- Go to steamcommunity.com/dev/apikey, register a domain (any is fine), copy the key.
- Pass it to the server with
-authkey YOUR_WEB_API_KEYinstart.sh. - Add maps by ID with
+host_workshop_map 3070335208(or whatever collection/map Workshop ID you want).
For a map collection (most community servers want this):
+host_workshop_collection 3070335208 // example collection ID
Find your Workshop map/collection IDs in the URL: steamcommunity.com/sharedfiles/filedetails/?id=3070335208.
Map rotation is controlled by mapcycle.txt inside game/csgo/cfg/, one map per line:
de_dust2
de_mirage
de_inferno
workshop/3070335208/de_cache_remastered
workshop/3070335208/de_season
10 // FastDL — get custom content to players instantly
The default in-game download from the server maxes out at 20 KB/s. For a 40 MB custom map, that’s a half-hour wait — players just disconnect.
FastDL solves this: a lightweight HTTP server hosts compressed copies of your maps/materials/sounds, and CS2 downloads them via HTTP at 10–100 MB/s instead of the game-protocol trickle.
Minimal server.cfg additions:
sv_downloadurl "https://fastdl.yourserver.com/csgo"
sv_allowdownload 1
sv_allowupload 0
But FastDL done badly causes more problems than it solves: wrong MIME types, missing bz2 compression, wrong folder structure, stale files. We wrote a full dedicated FastDL setup guide that covers the nginx config, bz2 compression, auto-sync cron script, and the permission traps that eat hours of debugging:
Step-by-step FastDL on the same VPS — nginx config, bz2 compression, cron auto-sync, troubleshooting.
Read: FastDL Setup for CS2 & TF2 →11 // SourceTV / GOTV — demos and spectators
SourceTV (branded “GOTV” in-game) lets spectators watch your server with a configurable delay, and auto-records every match to a .dem file. Essential for any competitive server — demos are how players review rounds and how you investigate cheat reports.
Minimum SourceTV cfg (already in the competitive example above):
tv_enable 1
tv_port 27020 // UDP, must be open on firewall
tv_maxclients 10 // max simultaneous spectators
tv_delay 90 // seconds — 90 is tournament standard
tv_autorecord 1 // auto-save demos per match
tv_snapshotrate 64 // spectator tick rate
tv_title "My SourceTV"
tv_name "SourceTV"
tv_password "" // set if you want private spectators
Demos land in /home/cs2/cs2-server/game/csgo/ with filenames like auto-20260418-de_dust2.dem. Rotate them so you don’t fill the disk:
# Delete demos older than 14 days, weekly
(crontab -l; echo "0 5 * * 0 find /home/cs2/cs2-server/game/csgo -name 'auto-*.dem' -mtime +14 -delete") | crontab -
12 // Remote admin (RCON)
RCON lets you run console commands remotely — change map, kick players, reload cfgs — without being in the server. Three ways to use it:
- In-game console — type
rcon_password YOUR_PASS, then prefix commands withrcon:rcon changelevel de_mirage. - Web RCON client — use a browser tool like HostingBuff’s RCON web client (coming soon in our tools section).
- CLI tool —
rcon-cli, a small Go binary that speaks the Source RCON protocol.
# Install rcon-cli on your laptop
wget https://github.com/gorcon/rcon-cli/releases/latest/download/rcon-linux_amd64.tar.gz
tar -xzf rcon-linux_amd64.tar.gz
sudo mv rcon /usr/local/bin/rcon-cli
# Use it
rcon-cli -a your.server.ip:27015 -p YOUR_RCON_PASSWORD "status"
rcon-cli -a your.server.ip:27015 -p YOUR_RCON_PASSWORD "changelevel de_mirage"
RCON is unencrypted plain text. If you expose port 27015 to the public (which you have to for players), attackers can brute-force the password. Mitigations: use a 24+ character random password, set sv_rcon_maxfailures 5 and sv_rcon_banpenalty 1440 (the cvars we put in the sample cfg), and consider binding RCON to a VPN interface with sv_rcon_whitelist_address.
13 // Firewall and ports
CS2 uses UDP, not TCP. Open these ports inbound on your VPS:
| Port | Protocol | Purpose | Required? |
|---|---|---|---|
| 27015 | UDP | Game traffic (players connect here) | Yes |
| 27015 | TCP | RCON | Optional |
| 27020 | UDP | SourceTV spectators | If SourceTV enabled |
| 27005 | UDP | Outbound client port (rarely needed open) | No |
| 27016 | UDP | Second CS2 instance (if running two) | Per instance |
Using ufw on Ubuntu:
sudo ufw allow 27015/udp
sudo ufw allow 27015/tcp # only if you need remote rcon
sudo ufw allow 27020/udp # only if SourceTV
sudo ufw allow 22/tcp # keep SSH open!
sudo ufw enable
sudo ufw status numbered
Always sudo ufw allow 22/tcp before ufw enable, otherwise you’ll instantly disconnect from SSH with no way back in except the VPS console. On Hostinger you can regain access via the browser VNC console, but it’s avoidable.
14 // Troubleshooting — common CS2 server problems
| Symptom | Cause | Fix |
|---|---|---|
| Server won’t appear in community browser | No GSLT, invalid GSLT, VAC-banned Steam account | Generate fresh GSLT, verify Steam account is clean, add to start.sh |
couldn’t allocate any server IP port | Port already in use by another instance | ss -ulnp | grep 27015 to find the culprit; change -port in start.sh |
| Players get “connection failed after 10 retries” | Firewall blocking UDP 27015 | Verify ufw status, check cloud provider security group |
Bad challenge on connect | GSLT used on multiple servers simultaneously | One GSLT per running server. Generate a second for your second instance |
| Server crashes on map load after Valve update | Metamod or CSS incompatible with new engine | Update Metamod (dev branch) and CSS to latest; rerun app_update 730 validate |
meta list returns Unknown command | Metamod didn’t load — gameinfo.gi edit broken | Check indentation with tabs; restore gameinfo.gi.bak and try again |
| CounterStrikeSharp not starting | Using non-runtime build without system .NET 8 | Use the with-runtime release — it bundles .NET so you don’t need a system install |
| Players download maps at 20 KB/s | No FastDL configured | See our FastDL guide |
| Workshop maps not downloading | No -authkey passed | Add Steam Web API key to start.sh with -authkey |
| Server hitches / tick drops under load | CPU throttled, single-thread too slow, or noisy-neighbor VPS | Check cpu MHz — if below 3 GHz sustained, upgrade VPS tier |
[CSS] Failed to load plugin | Plugin built against old CSS API version | Update plugin and/or CSS to matching versions; check plugin’s GitHub compatibility note |
| SourceTV demos not saving | tv_autorecord 0 or directory not writable | Set tv_autorecord 1; check ls -la on game/csgo that user cs2 owns it |
| Server uses 100% of one CPU core idle | Known CS2 dedicated bug — engine busy-loops without throttle | Pin process to a dedicated core with taskset or CPUAffinity= in systemd unit |
| High registered ping across all players | Server fps_max too low | Set fps_max 300 in server.cfg |
15 // Self-hosted vs FaceIt / ESEA / managed panels
Why self-host CS2 instead of renting a slot on FaceIt / ESEA / a managed panel?
| Self-hosted VPS | Managed host (GTXGaming) | FaceIt / ESEA pugs | |
|---|---|---|---|
| Plugins (MatchZy, Retakes, etc.) | Unlimited | SourceMod OK, custom binaries limited | None (their stack) |
| Workshop custom maps | Yes, unlimited | Limited | No |
| Tick / latency control | Full control, 128t possible | Provider-set | FaceIt 128t (East/West regions) |
| Persistent server IP for community | Yes | Yes | No (pug = throwaway) |
| Cost for 5v5 comp | €8.49/mo KVM 2 shared with other use | ~€10–20/mo per server | Free pugs, paid subs for premium |
| Setup time (first time) | 1–2 hours | 5 minutes | 0 minutes |
| Linux skills needed | Yes (or follow this guide) | No | No |
| Best for | Clan/team server, community, tournaments | Friends-only, no-fuss | Solo ranked practice |
16 // Hosting recommendations
Based on the scenarios in section 01, here are the concrete Hostinger plans we recommend for CS2:
Hostinger KVM 1 — 1 vCPU, 4 GB RAM, 50 GB NVMe
Fine for a single 10-slot competitive server with no plugins, or friends-only 5v5 with minimal admin plugins. €5.99/month. Tight, but workable — you’ll feel it if you add SourceTV + plugins.
Get Hostinger KVM 1 →Hostinger KVM 2 — 2 vCPU, 8 GB RAM, 100 GB NVMe
The sweet spot. Run a 24-slot community server + comp instance + SourceTV + CounterStrikeSharp plugins without breaking a sweat. Or run 2–3 separate CS2 instances side by side. €8.49/month.
Get Hostinger KVM 2 →Hostinger KVM 4 — 4 vCPU, 16 GB RAM, 200 GB NVMe
For league ops running 5+ concurrent match servers, each with their own SourceTV stream and MatchZy instance. Plenty of storage for weeks of demos. €12.99/month.
Get Hostinger KVM 4 →GTXGaming — Managed CS2 Hosting
Source engine specialists with pre-configured CS2 installs, one-click SourceMod / MetaMod, Workshop auto-sync, and support staff who’ve actually debugged sv_pure before. Good for friends-only 5v5 or community servers where you just want to play, not ssh. Per-slot pricing — scales worse than a VPS past ~32 slots or multi-instance setups.
17 // Next steps
- FastDL — so players download custom maps in seconds, not minutes. FastDL Setup for CS2 & TF2 →
- Panel management — tired of SSH? Put CS2 behind a panel for easy starts/stops/log tailing. Pterodactyl setup →
- Windows alternative — same server stack on Windows with a GUI panel. WindowsGSM setup →
- TF2 server — same engine family, same tooling, different gameplay. TF2 community server guide →
- RCON web tool — upcoming in our tools section. Tools →
18 // MatchZy — the modern competitive 5v5 / PUG framework
What it is: MatchZy is a CounterStrikeSharp plugin that turns a vanilla CS2 dedicated server into a fully featured match server — knife rounds, map vetoes, pause/unpause, tactical timeouts, automatic demo recording, surrender votes, BO1/BO3/BO5 series, optional Get5/G5API webhook integration, and a practice mode with grenade lineup save/load. It is the de-facto Get5 successor in 2026 and what every serious community CS2 PUG/scrim/league server runs.
If you only install one CS2 plugin, install this one. It is the single biggest quality-of-life upgrade you can make to a competitive 5v5 server.
MatchZy requires Metamod:Source and CounterStrikeSharp installed and working — see section 08. Verify !css shows up in chat as an admin before continuing.
Install MatchZy
Always pull the latest stable release rather than hard-coding a version — MatchZy ships frequent updates and the GitHub release page is the canonical source.
# SSH in as your csgo user (the non-root user from section 04)
cd ~/cs2-server/game/csgo/addons/counterstrikesharp/plugins
# Replace VERSION with the latest from https://github.com/shobhit-pathak/MatchZy/releases
wget https://github.com/shobhit-pathak/MatchZy/releases/download/vVERSION/MatchZy-with-cssharp-vVERSION.zip
unzip MatchZy-with-cssharp-vVERSION.zip -d MatchZy
rm MatchZy-with-cssharp-vVERSION.zip
# Verify the plugin folder structure
ls MatchZy/
# expected: MatchZy.dll MatchZy.deps.json config/ ...
# Restart the server
sudo systemctl restart cs2-server
On startup MatchZy creates ~/cs2-server/game/csgo/MatchZy/config.cfg. Open it to set sane defaults.
Minimal MatchZy config
The defaults are reasonable but a few values are worth changing immediately:
# ~/cs2-server/game/csgo/MatchZy/config.cfg (excerpts worth setting)
matchzy_admin_chat_prefix "[ADMIN]"
matchzy_chat_prefix "[MatchZy]"
# Rounds and overtime
matchzy_minimum_ready_required 5 # players per side ready before match start
matchzy_kniferound_enabled true
matchzy_kniferound_allowed_weapons "weapon_knife"
# Pauses
matchzy_max_tac_pause_duration 60 # tactical timeout seconds
matchzy_max_tac_pauses_per_half 4
matchzy_max_tech_pauses 2 # technical pauses per half
matchzy_pause_after_round_end true # don't pause mid-round
# Demos
matchzy_demo_path "MatchZy/demos"
matchzy_demo_upload_url "" # optional: webhook URL for auto-upload
matchzy_demo_upload_header_key "" # optional: auth header name
matchzy_demo_upload_header_value "" # optional: auth header value
# Stats
matchzy_stats_print_chat true
matchzy_save_match_stats true
matchzy_save_per_round_stats true
# Surrender / forfeit
matchzy_surrender_enabled true
matchzy_surrender_vote_threshold 1.0 # 1.0 = unanimous
Player & admin chat commands
| Command | Who | What it does |
|---|---|---|
!ready / !unready | player | Mark yourself ready before warmup ends |
!start | admin | Force-start the match (skips ready-check) |
!pause / !unpause | player | Request a tactical pause (consumes a tac timeout) |
!tech | player | Request a technical pause (lag, crash, etc.) |
!stay / !switch | knife winner | Stay on side / switch sides after knife round |
!surrender / !ff | player | Vote to forfeit the match |
!stop | player (vote) | Vote to restart the current round |
!coach | player | Toggle coach slot (spectator with team chat) |
!stats | player | Show your match stats so far |
!score | player | Print current score in chat |
!restartmatch | admin | Restart the entire match from warmup |
!loadmatch <url> | admin | Load a match config from URL or local file |
Loading a match (the JSON config)
MatchZy reads a JSON config that defines the series format, teams, players, and map pool. This is the same shape as Get5 / G5API match configs, so existing tooling continues to work.
// Example BO1 match: team_alpha vs team_bravo on de_mirage
{
"matchid": "alpha-vs-bravo-1",
"team1": {
"name": "Team Alpha",
"players": {
"STEAM_1:0:11111111": "Alpha-Player1",
"STEAM_1:0:22222222": "Alpha-Player2",
"STEAM_1:0:33333333": "Alpha-Player3",
"STEAM_1:0:44444444": "Alpha-Player4",
"STEAM_1:0:55555555": "Alpha-Player5"
} },
"team2": {
"name": "Team Bravo",
"players": {
"STEAM_1:0:66666666": "Bravo-Player1",
"STEAM_1:0:77777777": "Bravo-Player2",
"STEAM_1:0:88888888": "Bravo-Player3",
"STEAM_1:0:99999999": "Bravo-Player4",
"STEAM_1:0:00000000": "Bravo-Player5"
}
},
"num_maps": 1,
"maplist": ["de_mirage"],
"map_sides": ["team1_ct"],
"clinch_series": true,
"players_per_team": 5,
"coaches_per_team": 1,
"min_players_to_ready": 5,
"skip_veto": true,
"veto_first": "team1",
"side_type": "standard",
"spectators": { "players": {} },
"cvars": {
"hostname": "PUG: Alpha vs Bravo",
"mp_friendlyfire": "1",
"sv_deadtalk": "1"
}
}
Save this as match.json, then load it from RCON or as admin in chat:
# From RCON
matchzy_loadmatch_url "https://example.com/matches/match.json"
# Or from chat as admin
!loadmatch https://example.com/matches/match.json
# Or from a local file (path is relative to game/csgo/)
matchzy_loadmatch "MatchZy/configs/match.json"
BO3 with veto and Get5/G5API integration
For a BO3 with map veto, set num_maps: 3, leave maplist as your full pool (typically the seven Active Duty maps), set skip_veto: false, and pick which side starts. MatchZy walks the captains through the standard ban-pick-ban-pick-ban sequence in chat.
If you run a league with G5API as your match orchestrator, MatchZy speaks the same webhook and stats format as Get5, so existing G5V/G5API web frontends keep working without modification. Set matchzy_demo_upload_url to your G5API ingest endpoint and matchzy_stats_print_chat false to keep chat clean.
Practice mode (grenade lineups)
MatchZy includes a built-in practice mode — map-specific grenade lineup save/load, instant respawn, infinite ammo, and bot management. Players save flashes / smokes / molotovs in T or CT spawn and recall them mid-round.
# Enter practice mode (admin only)
!prac
# Save current grenade as a named lineup
!save mirage_ct_smoke_window
# List all saved lineups for the current map
!lineups
# Load a saved lineup (teleports you to position + facing angle)
!load mirage_ct_smoke_window
# Spawn bots
!bot ct
!bot t
!nobots
# Exit practice mode
!exitprac
Lineups are stored under ~/cs2-server/game/csgo/MatchZy/practice/<mapname>.json and survive server restarts.
Demo files (.dem) accumulate fast on a busy match server — expect 30–80 MB per match. Either set matchzy_demo_upload_url to push them to S3/R2/Backblaze, or run a weekly cron that moves files older than 14 days into a cold-storage tier. Without rotation a single VPS will fill up in months.
19 // Per-mode plugin recipes — Retakes, DM, Surf, 1v1
MatchZy covers competitive 5v5. For everything else — retakes, deathmatch, surf, 1v1, executes, KZ — you assemble a plugin stack. Below are the verified recipes the major community servers actually run in 2026. All plugins listed are CounterStrikeSharp-based and assume you completed section 08.
Recipe 1: Retakes (the most popular pug mode)
Retake servers spawn a pre-planted bomb each round; T defends, CT attacks. Players queue up and rotate; weapons are picked from preset loadouts. A complete stack:
| Plugin | Repo | Why |
|---|---|---|
| cs2-retakes | yonilerner/cs2-retakes | Core retake gameplay loop — spawn allocation, bomb plant, A/B site rotation |
| cs2-retakes-allocator | yonilerner/cs2-retakes-allocator | Per-player loadout menus (pistol/AWP/SMG/rifle preferences via !gun) |
| CS2-SimpleAdmin | daffyyyy/CS2-SimpleAdmin | Admin commands — ban, kick, mute, slay, team-switch (replaces SourceMod admin layer) |
| K4-System (optional) | K4ryuu/K4-System | Persistent rank/XP/stats — gives players a reason to keep coming back |
Tweaks worth making in the retakes config:
# cfg/cs2-retakes/retakes.json (or equivalent)
{
"MaxPlayers": 9, // 4v5 retakes; bump to 10 for 5v5
"RoundsToScramble": 5, // re-balance teams every N rounds
"IsAutoPlantEnabled": true,
"ShouldBreakBreakables": false, // keep glass intact for consistent angles
"EnableFallbackAllocation": true, // give a default loadout if a player has no prefs
"EnableFallbackBombsite": true
}
Recipe 2: Deathmatch (DM / FFA / TDM)
DM is the warmup-server staple. Players respawn instantly with a chosen weapon, no buying, no rounds. The standard stack:
| Plugin | Repo | Why |
|---|---|---|
| cs2-deathmatch | B3none/cs2-deathmatch | Instant respawn, weapon menus (!ws), spawn protection, distance-based spawns |
| WeaponPaints | Nereziel/cs2-WeaponPaints | Player-selectable skins, knives, gloves, agents (the killer feature for retention) |
| CS2-SimpleAdmin | see above | Standard admin commands |
| K4-System | see above | Pairs naturally with WeaponPaints — rank up to unlock skins |
Key cvars in server.cfg for a DM server:
mp_maxrounds 0
mp_timelimit 30 // map rotates every 30 minutes
mp_warmuptime 9999
mp_warmup_pausetimer 1
mp_respawn_on_death_t 1
mp_respawn_on_death_ct 1
mp_buy_anywhere 1
mp_buytime 9999
mp_startmoney 16000
mp_friendlyfire 0
mp_teammates_are_enemies 0 // set to 1 for FFA mode
WeaponPaints stores per-player skin selections in MySQL. Either run MariaDB on the same VPS (apt install mariadb-server, lock it to 127.0.0.1) or point at an external DB. Same applies to K4-System — both expect the same DB by default.
Recipe 3: Surf and KZ (movement servers)
Surf and KZ are the niche-but-loyal corner of CS2 community hosting. The 2026 stack is built around cs2kz and timer plugins:
- cs2kz-metamod — KZGlobalTeam/cs2kz-metamod — the official kz movement plugin (Metamod, not CSSharp). Replaces server movement to match CSGO-era kz physics.
- cs2-surftimer — community timer plugin for surf maps with stage records, top times, replay bots.
- Map pack — you cannot rely on Workshop for kz/surf; mount the maps manually under
game/csgo/maps/and add them tomapcycle.txt.
Surf and KZ servers benefit massively from a high-tickrate config (see section 22 on the tickrate myth) and benefit from sv_maxrate 0 + sv_minrate 80000 to give clients headroom.
Recipe 4: 1v1 arena
1v1 arena servers pair players into mini-rounds across multiple arenas on one map. Currently the dominant CS2 1v1 plugin is:
- cs2-1v1arena — rkpykt/cs2-1v1arena — ladder system, multi-arena spawn management, weapon rounds (rifle / AWP / pistol / knife), arena chat.
1v1 maps are themselves a category — download aim_map_1v1, 1v1_lobby and aim_redline from Workshop and add them to your mapcycle.txt.
CS2 plugins evolve quickly — what compiled against CSSharp 1.0.270 may not work on 1.0.300. Before installing any plugin, check the GitHub repo's last commit date and open issues. A plugin with no commits in 6 months is usually broken on the current CS2 build. The links above are all maintained as of mid-2026; revisit before each install.
20 // Launch flag reference
The CS2 dedicated server binary accepts a long list of command-line flags. Most guides only show the half-dozen everyone copy-pastes; the table below documents every flag worth knowing in 2026, what it does, and when you'd use it. Use this as a reference when tuning your systemd unit.
| Flag | Value | What it does | When to use it |
|---|---|---|---|
-dedicated | (none) | Run as a dedicated server (no client window) | Always — required for headless |
+map | map name | Initial map to load on boot | Always — e.g. +map de_mirage |
-port | port | Game server UDP port | Always; default 27015. Change for multi-instance hosts |
-maxplayers_override | 1–64 | Hard cap on slots, overrides game-mode default | Set explicitly to avoid surprises |
+sv_setsteamaccount | GSLT | Game Server Login Token (registers server in browser) | Always for public servers (see section 03) |
+game_type | 0–3 | 0 = Casual, 1 = Competitive, 2 = Wingman, 3 = Custom | Always — pair with +game_mode |
+game_mode | 0–2 | Sub-mode within game_type (varies by type) | Always — e.g. competitive 5v5 = +game_type 0 +game_mode 1 |
+sv_lan | 0 / 1 | 1 = LAN-only, no internet players, no VAC | Use 0 for public; 1 for private LAN tournaments only |
+exec | cfg name | Execute a config file at boot (e.g. autoexec.cfg) | Use to load mode-specific configs without changing server.cfg |
+rcon_password | string | Sets RCON password at boot (overrides server.cfg) | Avoid — visible in ps; set in server.cfg instead |
+hostname | string | Server name shown in browser | Optional; usually set in server.cfg |
-tickrate | 64 / 128 | Server tickrate (CS2 ignores this — see section 22) | Cosmetic only on CS2; left in for muscle-memory compatibility |
-usercon | (none) | Enable RCON over TCP from outside the server console | Required if you want to RCON via rcon-cli or a panel |
-secure | (none) | Enable VAC (Valve Anti-Cheat) on this server | Cosmetic on community servers — VAC does not run; see section 21 |
-insecure | (none) | Disable VAC explicitly | Use for plugin testing where VAC noise pollutes logs |
+mapgroup | group name | Map group from gamemodes_server.txt | Multi-map rotation servers (replaces mapcycle.txt for some modes) |
+sv_workshop_collection | collection ID | Auto-mount a Steam Workshop map collection | Workshop-only servers (see section 09) |
-authkey | Steam API key | Required to download Workshop maps on first boot | Workshop servers — get from steamcommunity.com/dev/apikey |
-norestart | (none) | Don't auto-restart on crash (lets systemd handle it) | Always pair with a Restart=on-failure systemd unit |
-nobreakpad | (none) | Disable Google Breakpad crash uploader | Privacy-conscious admins — stops crash dumps phoning home to Valve |
+log | on / off | Enable server log file output | Always +log on — required for log-based admin tools |
+sv_logflush | 0 / 1 | 1 = flush log to disk after every line | Match servers (so you don't lose the last 30 lines on crash) |
-console | (none) | Force console output to stdout (helps with screen / tmux) | If running outside systemd; redundant with systemd |
+ip | IPv4 | Bind to a specific interface IP | Multi-NIC hosts or VPS with multiple public IPs |
-debug | (none) | Run under gdb for crash debugging | Only when actively debugging; massive overhead |
The recommended public-server launch line
Most production CS2 community servers boil down to this pattern:
./cs2 -dedicated \
-console -usercon -norestart -nobreakpad \
-port 27015 \
-maxplayers_override 12 \
+sv_setsteamaccount YOUR_GSLT_HERE \
+game_type 0 +game_mode 1 \
+mapgroup mg_active \
+map de_mirage \
+exec autoexec.cfg \
+log on +sv_logflush 1
Adjust game_type/game_mode, slots, and the executed config for your mode. Everything else stays constant.
21 // Community anti-cheat — the honest layered approach
This is the question every CS2 community admin asks within the first month of running a server, and it is the question nobody publishes a clear answer to: how do you stop cheaters on a community server when VAC does not run?
The honest answer is: there is no single drop-in CS2 anti-cheat in 2026 that matches VAC-Live or FaceIt's kernel-mode AC. Anything that promises to is either a placebo or a paid SaaS with hidden caveats. What community admins actually do is build a layered defense — multiple lightweight detections that each catch a different category of cheater. Below is the full picture.
VAC (Valve Anti-Cheat) only runs on Valve's own matchmaking and Premier servers. On a community server, the -secure flag is cosmetic — the client connects, but Valve's signature scanner is not active. A cheater banned by VAC on Premier can still join your server. This is not a configuration issue you can fix; it is how Valve designed the system.
Layer 1: Reduce attack surface (free, do this first)
Most cheaters in community lobbies are casual cheaters running rented public cheats. They do not bring custom loaders. Three settings remove 60-70% of them at zero cost:
- Require a connected Steam account in good standing. Set
sv_setsteamaccountwith a valid GSLT (section 03) so VAC-banned and trade-banned accounts cannot connect. - Set a minimum Steam account age. A small Metamod plugin CS2Fixes exposes
cs2f_min_steam_account_age— setting it to180days blocks freshly-made smurf accounts that cheaters cycle through after bans. - Require Prime status. Add
sv_prime_accounts_only 1toserver.cfg. Prime is now bundled with CS2 ownership so this is not the gatekeeper it once was, but it still filters out the cheapest throwaway accounts.
Layer 2: Demo review (free, post-game accountability)
For PUG/match servers, automatic demo recording plus an obligation to review on suspicion is the single most effective deterrent — cheaters know they cannot delete the demo and will be reviewed if reported.
- MatchZy (section 18) records every match automatically.
- Demos are stored under
game/csgo/MatchZy/demos/<matchid>.demand can be replayed in the CS2 client withplaydemo <file>. - Pair with a player-report channel (Discord webhook from MatchZy or a manual
!reportplugin) and review queue.
This catches blatant aimbot/wallhack but not subtle triggerbot/spinbot variants.
Layer 3: Behaviour-detection plugins
A handful of community plugins run lightweight statistical checks — impossible reaction times, 180-degree snaps, perfect-pixel tracking through smoke. They are not bulletproof but raise the cost for cheaters:
| Tool | Type | What it catches | Cost |
|---|---|---|---|
| CS2Fixes | Metamod plugin | Many exploit fixes + basic anti-cheat scaffolding (cvar manipulation, fake-name spam, RCON brute-force) | Free |
| CSSharpAntiCheat | CSSharp plugin | Bunny-hop scripts, no-recoil patterns, attack-rate impossibilities | Free |
| ImpactGuard | SaaS / kernel-mode | Cheat-loader signatures, memory tampering, hardware bans | Paid (per slot/month) |
| AACGUARD | Plugin + service | Behaviour analytics, cross-server ban sharing | Freemium |
| XPOSED | SaaS | Cross-server reputation database (think VAC-Net for community servers) | Paid |
| MatchZy demo upload | Plugin + manual | Whatever you can spot in the demo | Free + reviewer time |
If a vendor markets kernel-mode anti-cheat for CS2 community servers, the kernel module runs on the player's machine, not yours — meaning players have to install a driver to join your server. Adoption is brutal. Unless you run a paid league with mandatory tooling (FaceIt's model), you will lose 80%+ of casual players the moment they see a driver-install prompt. For most community servers, sticking to layers 1–3 plus active moderation is the realistic path.
Layer 4: Active moderation (the unglamorous answer)
Every honest CS2 community admin will tell you the same thing: the most effective anti-cheat in 2026 is still a Discord with active admins who watch demos when reports come in. The successful community servers all run on this model:
- MatchZy + auto-demo upload to a Discord webhook.
- Ban appeals via Discord (CS2-SimpleAdmin's web panel or a custom Discord bot).
- Cross-server ban list shared with allied communities (XPOSED, custom ban-sync, or just a shared Google sheet for small networks).
- 3-strike rule for borderline cases — first warning, second 7-day ban, third permanent.
This sounds like a lot of work because it is. The communities that handle it well treat moderation like a part-time volunteer job, with rotating admin shifts. The communities that try to automate everything end up with toxic lobbies because every system has a false-negative rate, and players notice.
What CS2-SimpleAdmin gives you for moderation
CS2-SimpleAdmin is the de-facto admin plugin in 2026 (replacing the SourceMod admin layer that does not exist on CS2). It provides:
- Persistent admin database (MySQL) with role-based permissions
- Ban / kick / mute / silence / gag / slay / team-switch chat commands and menus
- Web panel for ban management and admin assignment
- Optional discord-webhook integration for ban notifications
- Ban appeals workflow
If you only install one admin plugin, this is it. The migration path from SourceMod admin commands is intentionally familiar — !ban, !kick, !mute all work as expected.
22 // Myths and clarifications
Five things people repeatedly get wrong about CS2 server hosting in 2026. Worth getting right because each one wastes hours of confused debugging.
Myth 1: "I need to set 128 tick"
You don't, and you can't. CS2 runs at sub-tick — tickrate is no longer a server-side dial. The legacy -tickrate 128 flag from CSGO is silently ignored. Your server is not faster or slower for setting it; community claims of "128 tick CS2 servers" are using the term out of habit. Sub-tick records the exact moment of input within a tick, so the player-perceived responsiveness is closer to the old 128-tick feel than to old 64-tick — even though every server runs at the same internal rate.
If you want to optimise for low-latency feel, the levers that actually matter are: low-jitter network, fps_max 0 on the server, sufficient CPU headroom (CS2 is single-threaded for the simulation loop), and clients with cl_interp_ratio 1 + cl_interp 0.
Myth 2: "I'll just use SourceMod"
SourceMod does not exist on CS2. The Source 2 engine is binary-incompatible with the SourceMod runtime, and there is no port roadmap. Every CSGO admin plugin, every .smx you used to drop in addons/sourcemod/plugins/, every SourcePawn script — none of it works.
The CS2 ecosystem replaced SourceMod with two layers:
- Metamod:Source — the same Metamod you remember; provides the engine hook layer. Required for any plugin.
- CounterStrikeSharp (CSSharp) — a managed runtime running C#/.NET plugins on top of Metamod. This is where all modern plugins live (
.dllnot.smx).
If you find yourself searching for "SourceMod CS2 download" — stop. Install Metamod + CSSharp instead (section 08) and re-install your plugins from their CSSharp equivalents (section 19).
Myth 3: "Workshop maps need a separate plugin"
Workshop map mounting is built into the dedicated server — you do not need a plugin for it. You need a Steam Web API key (free at steamcommunity.com/dev/apikey) passed via -authkey, and either a single map's Workshop ID via +host_workshop_map <id> or a collection ID via +sv_workshop_collection <id>. See section 09 for the full setup.
Pre-built CS2 server repositories — should you use them?
Several maintained GitHub repos package the entire CS2 server stack into a single docker compose up or one-shot install script. They are useful, especially for developers spinning up disposable test servers, and they are honest about what they include:
- joedwards32/CS2 — the most popular Docker image. Pure CS2 server, no plugins.
- kus/docker-cs2-modded-server — opinionated stack with Metamod, CSSharp, and a curated plugin set baked in.
- dasisdormax/cs2-server — minimal Docker setup; bring-your-own plugins.
The trade-off: when something breaks, you are debugging someone else's layered abstraction. The manual install in this guide takes longer up front but pays back the moment a CS2 update breaks a plugin and you need to read logs and understand which layer is at fault. For learners, do the manual install once. For experienced admins running disposable test environments, Docker is fine.
OS notes for 2026
The official Valve recommendation is still based on Ubuntu 22.04 LTS, but most production CS2 servers in 2026 run on Ubuntu 24.04 LTS (Noble Numbat) without issue. The two libraries the CS2 binary actually depends on at runtime — libstdc++6 and libc6 — are newer on 24.04 and pose no compatibility problems. Debian 12 (Bookworm) also works. The only edge case: if you compile a custom Metamod plugin yourself, target the same glibc version as the CS2 binary (currently glibc 2.31) for maximum portability across hosts.
23 // Frequently asked questions
The questions that come up over and over in CS2 admin Discords. Each answer is short on purpose; the long version is in the corresponding section above.
Why is my CS2 server not showing up in the community server browser?
Almost always one of three things: (1) you didn't set sv_setsteamaccount with a valid GSLT, (2) your firewall is blocking UDP 27015 inbound, or (3) your VPS is behind a NAT and the public IP differs from the bind IP. Check with ss -ulpn | grep 27015 from the server, then test from outside with nmap -sU -p 27015 your.public.ip. See section 13 for the full firewall checklist.
Is CS2 64 tick or 128 tick?
Neither in the way you mean. CS2 uses sub-tick — the server records the exact moment of every input within a tick, so the player-perceived responsiveness is closer to the old 128-tick feel. The -tickrate launch flag is silently ignored. See section 22.
How do I reduce my CS2 server's CPU usage?
CS2 server simulation is single-threaded, so a server fully utilising one core is normal under load and not a bug. Reduce CPU pressure by: (1) lowering slot count, (2) trimming heavy plugins (one heavy CSSharp plugin can double CPU usage), (3) running fps_max 0 on the server, and (4) ensuring the host VPS has dedicated vCPU rather than shared/burstable. If you are CPU-bound on Hostinger KVM 1, step up to KVM 2 (section 16).
Can I run a CS2 server without a GSLT?
Yes for LAN-only servers (sv_lan 1), no for public servers. Without a GSLT your server will not appear in the community browser and players cannot connect from the in-game UI. Generate one for free at steamcommunity.com/dev/managegameservers using a Steam account with no VAC bans (section 03).
Does SourceMod work on CS2?
No. The Source 2 engine is binary-incompatible with SourceMod, and there is no port. The CS2 ecosystem replaced it with Metamod:Source + CounterStrikeSharp. Your old .smx plugins won't load — you need C#/.NET equivalents from the CSSharp plugin ecosystem. See section 08 and section 19.
How do I add Workshop maps to my server?
Built-in to the dedicated server. Get a free Steam Web API key, then either pass +host_workshop_map <id> for a single map or +sv_workshop_collection <id> for a collection. See section 09.
What anti-cheat should I install?
There is no single VAC-equivalent for community servers. Build a layered defense: GSLT-only + minimum-account-age + Prime-only at the connection layer, MatchZy auto-demos for accountability, lightweight detection plugins (CS2Fixes, CSSharpAntiCheat) for behaviour, and active human moderation as the backstop. See section 21.
How much RAM does a CS2 server actually need?
Vanilla 5v5 uses ~600 MB-1 GB RAM. With Metamod, CSSharp and a half-dozen plugins, expect 1.5-2.5 GB. A single CS2 server fits comfortably on 2 GB; a panel running 3-4 CS2 instances wants 8 GB. See section 16 for the full sizing.
Can I run CS2, MatchZy, and a web panel on one VPS?
Yes — this is the most common single-VPS setup. Hostinger KVM 2 (8 GB / 2 vCPU) handles a 12-slot CS2 server + Pterodactyl panel + MatchZy webhook receiver comfortably. Move to KVM 4 (16 GB / 4 vCPU) once you're hosting 2+ game instances simultaneously.
Is it cheaper to host CS2 myself or rent from a managed host?
Self-hosting on Hostinger KVM 2 (~€8.49/mo) is roughly half the cost of an equivalent managed CS2 host, and you get full root for plugin experimentation. Managed hosts make sense if you want one-click updates, free DDoS protection, and zero Linux exposure — the trade-off is locked-down configuration and locked-in pricing.
How do I migrate a CSGO server config to CS2?
Most cvars carry over (sv_cheats, mp_warmup_pausetimer, sv_pausable) but a meaningful subset was removed or renamed. Strip out anything tickrate-related, anything in the cl_ family from your server.cfg, and anything referencing SourceMod/Metamod plugins from the CSGO era. The minimal CS2 server.cfg in section 06 is a clean starting point — copy that and re-add only the cvars you actually need.