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.

Important — 2026 plugin reality check

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 casevCPURAMRecommended VPS
Single 5v5 / 10-slot competitive, no plugins1 fast4 GBHostinger KVM 1
Single community server (24-slot, light plugins)28 GBHostinger KVM 2
Comp + retake + 1v1 (3 instances)2–48 GBHostinger KVM 2
Busy 64-slot surf / bhop with many plugins416 GBHostinger KVM 4
League / multi-team (5+ instances, SourceTV each)4–816–32 GBHostinger KVM 4 or KVM 8
Recommended Hosting — Self-Managed VPS

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 →
Alternative — Managed Source Engine Hosting

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.

Get GTXGaming →

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:

  1. Go to steamcommunity.com/dev/managegameservers while logged into your Steam account.
  2. Fill in App ID: 730 (Counter-Strike 2).
  3. Memo: anything descriptive (e.g. hostingbuff-comp-01).
  4. Click Create. Copy the token that appears — it looks like a 32-character hex string.
Keep it secret

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.

Re-run after every CS2 update

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
Faster than copy-pasting the blocks below

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
Protect your rcon password

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
Why SIGINT not SIGTERM

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
    ...
}
Indentation matters

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:

  1. Go to steamcommunity.com/dev/apikey, register a domain (any is fine), copy the key.
  2. Pass it to the server with -authkey YOUR_WEB_API_KEY in start.sh.
  3. 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:

Dedicated FastDL Guide

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 with rcon: rcon changelevel de_mirage.
  • Web RCON client — use a browser tool like HostingBuff’s RCON web client (coming soon in our tools section).
  • CLI toolrcon-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"
Harden RCON from public internet

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:

PortProtocolPurposeRequired?
27015UDPGame traffic (players connect here)Yes
27015TCPRCONOptional
27020UDPSourceTV spectatorsIf SourceTV enabled
27005UDPOutbound client port (rarely needed open)No
27016UDPSecond 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
Don’t lock yourself out

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

SymptomCauseFix
Server won’t appear in community browserNo GSLT, invalid GSLT, VAC-banned Steam accountGenerate fresh GSLT, verify Steam account is clean, add to start.sh
couldn’t allocate any server IP portPort already in use by another instancess -ulnp | grep 27015 to find the culprit; change -port in start.sh
Players get “connection failed after 10 retries”Firewall blocking UDP 27015Verify ufw status, check cloud provider security group
Bad challenge on connectGSLT used on multiple servers simultaneouslyOne GSLT per running server. Generate a second for your second instance
Server crashes on map load after Valve updateMetamod or CSS incompatible with new engineUpdate Metamod (dev branch) and CSS to latest; rerun app_update 730 validate
meta list returns Unknown commandMetamod didn’t load — gameinfo.gi edit brokenCheck indentation with tabs; restore gameinfo.gi.bak and try again
CounterStrikeSharp not startingUsing non-runtime build without system .NET 8Use the with-runtime release — it bundles .NET so you don’t need a system install
Players download maps at 20 KB/sNo FastDL configuredSee our FastDL guide
Workshop maps not downloadingNo -authkey passedAdd Steam Web API key to start.sh with -authkey
Server hitches / tick drops under loadCPU throttled, single-thread too slow, or noisy-neighbor VPSCheck cpu MHz — if below 3 GHz sustained, upgrade VPS tier
[CSS] Failed to load pluginPlugin built against old CSS API versionUpdate plugin and/or CSS to matching versions; check plugin’s GitHub compatibility note
SourceTV demos not savingtv_autorecord 0 or directory not writableSet tv_autorecord 1; check ls -la on game/csgo that user cs2 owns it
Server uses 100% of one CPU core idleKnown CS2 dedicated bug — engine busy-loops without throttlePin process to a dedicated core with taskset or CPUAffinity= in systemd unit
High registered ping across all playersServer fps_max too lowSet 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 VPSManaged host (GTXGaming)FaceIt / ESEA pugs
Plugins (MatchZy, Retakes, etc.)UnlimitedSourceMod OK, custom binaries limitedNone (their stack)
Workshop custom mapsYes, unlimitedLimitedNo
Tick / latency controlFull control, 128t possibleProvider-setFaceIt 128t (East/West regions)
Persistent server IP for communityYesYesNo (pug = throwaway)
Cost for 5v5 comp€8.49/mo KVM 2 shared with other use~€10–20/mo per serverFree pugs, paid subs for premium
Setup time (first time)1–2 hours5 minutes0 minutes
Linux skills neededYes (or follow this guide)NoNo
Best forClan/team server, community, tournamentsFriends-only, no-fussSolo ranked practice

16 // Hosting recommendations

Based on the scenarios in section 01, here are the concrete Hostinger plans we recommend for CS2:

Small team / private 5v5 / retake server

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 →
Recommended — Community / multi-instance

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 →
League / tournament host — 5+ instances

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 →
Don’t want Linux? — Managed Source Engine

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.

Get GTXGaming →

17 // Next steps

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.

Prerequisites

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

CommandWhoWhat it does
!ready / !unreadyplayerMark yourself ready before warmup ends
!startadminForce-start the match (skips ready-check)
!pause / !unpauseplayerRequest a tactical pause (consumes a tac timeout)
!techplayerRequest a technical pause (lag, crash, etc.)
!stay / !switchknife winnerStay on side / switch sides after knife round
!surrender / !ffplayerVote to forfeit the match
!stopplayer (vote)Vote to restart the current round
!coachplayerToggle coach slot (spectator with team chat)
!statsplayerShow your match stats so far
!scoreplayerPrint current score in chat
!restartmatchadminRestart the entire match from warmup
!loadmatch <url>adminLoad 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 storage tip

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:

PluginRepoWhy
cs2-retakesyonilerner/cs2-retakesCore retake gameplay loop — spawn allocation, bomb plant, A/B site rotation
cs2-retakes-allocatoryonilerner/cs2-retakes-allocatorPer-player loadout menus (pistol/AWP/SMG/rifle preferences via !gun)
CS2-SimpleAdmindaffyyyy/CS2-SimpleAdminAdmin commands — ban, kick, mute, slay, team-switch (replaces SourceMod admin layer)
K4-System (optional)K4ryuu/K4-SystemPersistent 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:

PluginRepoWhy
cs2-deathmatchB3none/cs2-deathmatchInstant respawn, weapon menus (!ws), spawn protection, distance-based spawns
WeaponPaintsNereziel/cs2-WeaponPaintsPlayer-selectable skins, knives, gloves, agents (the killer feature for retention)
CS2-SimpleAdminsee aboveStandard admin commands
K4-Systemsee abovePairs 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 needs MySQL

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-metamodKZGlobalTeam/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 to mapcycle.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-1v1arenarkpykt/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.

Plugin freshness check

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.

FlagValueWhat it doesWhen to use it
-dedicated(none)Run as a dedicated server (no client window)Always — required for headless
+mapmap nameInitial map to load on bootAlways — e.g. +map de_mirage
-portportGame server UDP portAlways; default 27015. Change for multi-instance hosts
-maxplayers_override1–64Hard cap on slots, overrides game-mode defaultSet explicitly to avoid surprises
+sv_setsteamaccountGSLTGame Server Login Token (registers server in browser)Always for public servers (see section 03)
+game_type0–30 = Casual, 1 = Competitive, 2 = Wingman, 3 = CustomAlways — pair with +game_mode
+game_mode0–2Sub-mode within game_type (varies by type)Always — e.g. competitive 5v5 = +game_type 0 +game_mode 1
+sv_lan0 / 11 = LAN-only, no internet players, no VACUse 0 for public; 1 for private LAN tournaments only
+execcfg nameExecute a config file at boot (e.g. autoexec.cfg)Use to load mode-specific configs without changing server.cfg
+rcon_passwordstringSets RCON password at boot (overrides server.cfg)Avoid — visible in ps; set in server.cfg instead
+hostnamestringServer name shown in browserOptional; usually set in server.cfg
-tickrate64 / 128Server 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 consoleRequired if you want to RCON via rcon-cli or a panel
-secure(none)Enable VAC (Valve Anti-Cheat) on this serverCosmetic on community servers — VAC does not run; see section 21
-insecure(none)Disable VAC explicitlyUse for plugin testing where VAC noise pollutes logs
+mapgroupgroup nameMap group from gamemodes_server.txtMulti-map rotation servers (replaces mapcycle.txt for some modes)
+sv_workshop_collectioncollection IDAuto-mount a Steam Workshop map collectionWorkshop-only servers (see section 09)
-authkeySteam API keyRequired to download Workshop maps on first bootWorkshop 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 uploaderPrivacy-conscious admins — stops crash dumps phoning home to Valve
+logon / offEnable server log file outputAlways +log on — required for log-based admin tools
+sv_logflush0 / 11 = flush log to disk after every lineMatch 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
+ipIPv4Bind to a specific interface IPMulti-NIC hosts or VPS with multiple public IPs
-debug(none)Run under gdb for crash debuggingOnly 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.

Why VAC doesn't help you

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_setsteamaccount with 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 to 180 days blocks freshly-made smurf accounts that cheaters cycle through after bans.
  • Require Prime status. Add sv_prime_accounts_only 1 to server.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>.dem and can be replayed in the CS2 client with playdemo <file>.
  • Pair with a player-report channel (Discord webhook from MatchZy or a manual !report plugin) 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:

ToolTypeWhat it catchesCost
CS2FixesMetamod pluginMany exploit fixes + basic anti-cheat scaffolding (cvar manipulation, fake-name spam, RCON brute-force)Free
CSSharpAntiCheatCSSharp pluginBunny-hop scripts, no-recoil patterns, attack-rate impossibilitiesFree
ImpactGuardSaaS / kernel-modeCheat-loader signatures, memory tampering, hardware bansPaid (per slot/month)
AACGUARDPlugin + serviceBehaviour analytics, cross-server ban sharingFreemium
XPOSEDSaaSCross-server reputation database (think VAC-Net for community servers)Paid
MatchZy demo uploadPlugin + manualWhatever you can spot in the demoFree + reviewer time
A word on "kernel-mode anti-cheat for community servers"

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 (.dll not .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:

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.