Hosting

How to Host a CS2 Server, and When Do You Really Need It?

Set up your own CS2 dedicated server on a VPS. Covers requirements, installation, configuration, and how to invite friends to your private Counter-Strike 2 matches.

is*hosting team 15 Jan 2026 13 min reading
How to Host a CS2 Server, and When Do You Really Need It?
Table of Contents

A CS2 dedicated server runs 24/7 and keeps whatever you write into the config. Matchmaking gives you none of that: Valve picks the region and the ruleset, your ping is whatever the queue hands you, and public game servers are built to fill a match fast, not to hold praccs, scrims and a Saturday mini-tournament. Hosting off your own PC is the other dead end: it dies on every reboot, and friends two countries away play on ping they complain about.

A VPS removes both. Below is the whole server setup process on Ubuntu: SteamCMD, App ID 730, configs, game modes, RCON and automation, written as step-by-step instructions you can follow on a clean machine.

What a CS2 Dedicated Server Actually Gives You

A CS2 server is a standalone node that runs Counter-Strike 2 matches independently of your game client. Unlike public game servers, it holds every cvar between restarts and does not care whether your desktop is on.

Three things change the moment you run your own gaming server:

  • Full control. Round time, money, overtime, map pool, plugins.
  • A predictable gaming experience. Same region, same ping, same rules every session.
  • Availability. Your game server is online when the team is, not when a queue decides.

If you play solo and never touch custom modes, skip all of this. For everything else, private gaming servers are the only sane option.

VPS or Dedicated Server for CS2?

A VPS is a virtual machine with guaranteed resources; a dedicated server is an entire physical box reserved for you. For 10–20 players a VPS is more than enough, and it is the cheapest sane entry into game hosting.

A dedicated gaming server starts to make sense only when you run several game servers at once, host a public community, or stack heavy plugins on top of Counter-Strike. Until then, a dedicated gaming server means paying for idle server hardware.

Why Linux, Not Windows

A CS2 dedicated server on Linux consumes fewer resources and stays more stable under load. A dedicated gaming server on Windows works, but it burns more RAM for the same slot count. SteamCMD — the dedicated server software Valve ships for downloading and updating game servers — was designed with Linux in mind, so automation, cron jobs and updates are simply easier here. Ubuntu 24.04 LTS is the safest base: Valve's real requirement is glibc 2.31, so anything from 20.04 or Debian 11 up will run.

VPS

Rent a CS2-ready VPS with root access and a dedicated IPv4 — sized right for a 10-20 player server from day one.

Choose VPS

Server Hardware Requirements

Server Hardware Requirements

Size the machine before touching the console. This is the server hardware that matters for CS2 game servers:

Parameter

Minimum (tests, friends)

Recommended (regular play)

CPU

2 vCPU, strong single-core

3–4 vCPU

RAM

4 GB (Valve's own floor is 2 GB)

6–8 GB

Storage

65–80 GB NVMe

80+ GB NVMe

OS

Ubuntu 20.04 LTS (glibc 2.31)

Ubuntu 24.04 LTS

On the is*hosting line-up, CPU and RAM map to three plans:

Plan

vCPU / RAM

Disk (80 GB needed)

Base price

Fits

Medium VPS

3 / 4 GB

40 GB → add 40 GB

$21.24/mo

8–10 players

Premium VPS

4 / 8 GB

50 GB → add 30 GB

$33.99/mo

10–16 players

Elite VPS

6 / 16 GB

80 GB, nothing to add

$50.99/mo

20+ players with plugins

Two of those three plans need extra disk before CS2 will even finish installing. The Counter-Strike 2 build alone is roughly 60 GB in 2026, so on Medium you order another 40 GB and on Premium another 30, both billed on top of the base price. Elite is the only plan that ships enough space as it is. Lite and Start, at 20 and 30 GB, cannot hold the build at all.

Server Region

The closer the machine sits to your players, the lower the ping. Competitive game servers live or die on location: it is the cheapest route to a lag-free match, and no hardware upgrade beats 20 ms of physical distance.

Scaling

A VPS is trivial to upgrade: add CPU or RAM without reinstalling anything. Growing game servers can jump from 4 GB to 8 GB in minutes, which keeps a busy server at optimal performance without a rebuild, and it is why most private gaming servers start on a VPS rather than a dedicated gaming server.

Deploying a Linux VPS

  1. Register on is*hosting and confirm your email.
  2. Take Medium, Premium or Elite VPS from the table above, and add drive space if the plan ships under 80 GB.
  3. Complete the payment and deploy the server.

You immediately receive a public IP address and root access over SSH — everything the rest of the server setup needs.

Connecting and Basic System Setup

Connecting and Basic System Setup

Connect from your local computer — the command is identical on Windows, macOS and Linux:

ssh root@SERVER_IP

On first login, confirm the host key — that is normal. Then update the system:

apt update && apt upgrade -y

Do not interrupt it. If Ubuntu asks about SSH configuration files, choose Keep the local version currently installed and press Enter.

Creating a Separate User

Running game servers as root is not secure. Create a dedicated account:

adduser cs2user
usermod -aG sudo cs2user

From this point on, work as cs2user.

A VPS with a public IP starts collecting SSH brute-force attempts within hours, so close that door now. From your local machine:

ssh-copy-id cs2user@SERVER_IP

Once key login works, turn off password and root access in /etc/ssh/sshd_config — set PermitRootLogin no and PasswordAuthentication no, then reload the daemon:

sudo systemctl restart ssh

About UFW and the Firewall

Critical. If your VPS uses ispmanager or another control panel, do not enable UFW. The panel already manages the firewall; UFW on top of it conflicts, and the usual result is total loss of network and SSH access. Without a panel, we return to ports later.

Installing SteamCMD

Installing SteamCMD

SteamCMD is the server software that downloads and updates CS2. Switch user and verify:

su - cs2user
whoami

Expected output: cs2user. Install the dependencies and the client:

sudo apt update
sudo apt install lib32gcc-s1 -y
mkdir -p ~/steamcmd
cd ~/steamcmd
wget https://media.steampowered.com/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz
./steamcmd.sh

The Steam> prompt means it works. Type quit to exit.

Downloading the CS2 Server Files

Create the target directory and pull the build:

mkdir ~/cs2server
cd ~/steamcmd
./steamcmd.sh

Inside SteamCMD, run the commands in exactly this order:

force_install_dir /home/cs2user/cs2server
login anonymous
app_update 730 validate
quit

App ID 730 is the identifier for Counter-Strike 2, the same App ID you need for the login token. Always add validate on a first install: SteamCMD compares checksums and re-downloads anything broken. It takes longer, and it is also what prevents most 0x202 failures and first-launch crashes. On later updates plain app_update 730 is enough.

Error 0x202 — What It Is and What to Do

Not fatal. SteamCMD throws it on connection failures, freezes at reconfiguring, or a corrupted cache. Recovery:

Error! App '730' state is 0x202 after update job.
quit
whoami
rm -rf ~/steamcmd/package
rm -rf ~/steamcmd/steamapps

Do not touch ~/cs2server — part of the download may already be there. Then repeat the force_install_dirlogin anonymousapp_update 730 validate sequence. If SteamCMD sits silently at reconfiguring, wait — it is usually still working. At roughly 60 GB, patience is part of the server setup process.

Check the result:

ls ~/cs2server

Expected directories: game, bin, csgo. If they exist, the download is complete.

CS2 Server Files Structure

The server files live in /home/cs2user/cs2server. Knowing what you may touch prevents most broken installs.

Your area:

  • game/csgo/cfg/ — server configurations
  • game/csgo/maps/ — maps
  • game/csgo/addons/ — plugins and extensions

Leave alone: bin/, linuxsteamrt64/, steamapps/ and any .so files. These belong to the engine and to Steam.

Already hearing your PC struggle under the gaming load?

It’s the perfect time to switch to a dedicated GPU server.

Watch plans

How to Configure Server Settings

The main config lives here:

/home/cs2user/cs2server/game/csgo/cfg/server.cfg

If the file does not exist, create it manually. A minimal working set of server settings:

hostname "My CS2 Server"
sv_password "mypassword"
rcon_password "strong_rcon_password"
sv_lan 0
sv_cheats 0
  • hostname — the name players see in the browser
  • sv_password — turns the node into a private server
  • rcon_password — remote administration, covered below
  • sv_lan 0 — mandatory for an internet server. Left at 1, the server sends no heartbeat and skips Steam authentication, so nobody outside your LAN can see or join it
  • sv_cheats — always 0 for normal play

Slots are not set here. There is no sv_maxplayers cvar in CS2, so use the launch parameter -maxplayers 10, which applies to every mode, or set maxplayers per mode in game/csgo/gamemodes_server.txt. Either way the real ceiling is the map: one with 5 T and 5 CT spawn points will not take an eleventh player whatever the config says.

A Second Config for Practice

Most teams keep two configs and switch between them. Create practice.cfg in the same folder, starting with the team setup:

sv_cheats 1
mp_limitteams 0
mp_autoteambalance 0
mp_freezetime 0
mp_roundtime 60
mp_roundtime_defuse 60
mp_warmup_end
bot_kick

Then the economy and utility half:

mp_startmoney 65535
mp_maxmoney 65535
mp_buy_anywhere 1
mp_buytime 9999
sv_infinite_ammo 1
sv_grenade_trajectory_prac_pipreview 1
sv_showimpacts 1
sv_full_alltalk 1
mp_restartgame 1

mp_limitteams 0 is what lets all five of you stack on one side, which is the entire point of a pracc. sv_grenade_trajectory_prac_pipreview 1 is the CS2 replacement for the old sv_grenade_trajectory and the reason most teams boot a practice server at all.

Apply it live with exec practice.cfg, or launch with +exec practice.cfg. Being able to configure server settings per session — competitive tonight, nade practice tomorrow — is what matchmaking game servers never allow.

CS2 Game Mode Configuration

A CS2 server picks its mode at launch, not in server.cfg. The clean way is game_alias, which sets game_type and game_mode together and survives changes to Valve's internal numbering:

Game mode

game_alias

game_type

game_mode

Casual

casual

0

0

Competitive

competitive

0

1

Wingman

wingman

0

2

Deathmatch

deathmatch

1

2

Custom

custom

3

0

A competitive instance therefore starts with:

+game_alias competitive +map de_dust2

The numeric pair is still there when you want manual control: +game_type 0 +game_mode 1 is the same thing.

Modes carried over from CS:GO — Demolition, Guardian, Co-op Strike, Training, Weapons Expert — are not on that list. Valve either never brought them back to CS2 or left them half-working, so a launch line built around them produces a server nobody can play on. Arms Race is a special case: it exists in the game, but Valve documents no alias for it, so test it before you build a server around it.

Premier is missing for a different reason. It is Valve matchmaking and cannot be self-hosted at all. The closest thing you can run yourself is Competitive with your own ruleset.

One catch on the configs: each mode also executes its own file — gamemode_competitive.cfg, gamemode_casual.cfg — and Valve overwrites those on every update. Copy the file and add _server to the name (gamemode_casual_server.cfg) instead of editing it. CS2 loads the _server version after the original, so your settings survive updates. Skipping this step is why so many self-hosted game servers silently revert to defaults after a patch.

Game Server Login Token

A Game Server Login Token (GSLT) is mandatory if you want your machine listed among public game servers. Generate it directly through Steam using App ID 730 — one unique token per instance.

The GSLT never goes inside server.cfg; it is applied only in the startup line, via +sv_setsteamaccount. Without it the dedicated server won't register and stays invisible outside your LAN.

Do not paste it into the systemd unit either: everything in /etc/systemd/system/ is world-readable and shows up in systemctl cat. Keep it in a file only cs2user can read:

echo 'GSLT=YOUR_TOKEN' > /home/cs2user/cs2.env
chmod 600 /home/cs2user/cs2.env
chown cs2user:cs2user /home/cs2user/cs2.env

One more thing worth knowing before you go hunting through firewall rules later: a token the server never logs in with eventually expires. After a long break, reissue it.

Starting the CS2 Server

Starting the CS2 Server

First install the Steam Linux Runtime — not CS2 itself, but the environment without which game servers often refuse to start:

cd ~/steamcmd
./steamcmd.sh +login anonymous +app_update 1628350 validate +quit

Two one-time fixes Ubuntu usually needs. Symlink libv8.so:

ln -sfn ~/cs2server/game/bin/linuxsteamrt64/libv8.so \
~/cs2server/game/csgo/bin/linuxsteamrt64/libv8.so

And steamclient.so, without which the Steam API stays dead:

mkdir -p ~/.steam/sdk64
ln -sfn ~/steamcmd/linux64/steamclient.so ~/.steam/sdk64/steamclient.so

If your build happens to start without the symlinks, skip them and come back here only if the server dies with libv8.so: cannot open shared object file.

Now launch. Always through cs2.sh, never the binary in game/bin/linuxsteamrt64 — the script sets up the environment the server needs:

cd ~/cs2server
/home/cs2user/Steam/steamapps/common/SteamLinuxRuntime_sniper/run -- \
./game/cs2.sh -dedicated \
+sv_setsteamaccount YOUR_GSLT \
+game_alias competitive \
+map de_dust2 \
-maxplayers 10 \
+exec server.cfg

Watch the server console for the [STARTUP] lines. If it reaches the map load without crashing, you're done.

Opening Ports and Port Forwarding

The minimum set:

  • UDP 27015 — main game port
  • TCP 27015 — RCON
  • UDP 27020 — SourceTV (optional)

With ispmanager or another panel, open the ports there and leave UFW off. Port forwarding on a router only matters if you host at home — a VPS has a public IP and needs none of it. Home-hosted game servers also expose your residential address, which is one more reason home game hosting stops at LAN parties.

Inviting Friends to Your Game Sessions

Enable the console in CS2: Settings → Game → Enable Developer Console. Then press ~:

connect SERVER_IP:27015

If the node is password-protected, authenticate first:

password "mypassword"
connect SERVER_IP:27015

private cs server

The alternative is Steam → View → Game Servers → Favorites → Add Server. On a LAN players use the local address; over the internet, the public IP.

If nobody connects, check in this order: sv_lan 0 in the config, then the GSLT in the startup line, then ports and firewall. The first two cause most of these failures, and the last two are where everyone looks first.

RCON: Remote Server Management

RCON runs commands on a live instance from your own machine without SSH — the fastest way to get admin access mid-match. Set rcon_password in server.cfg. On Linux or macOS, install a client locally:

sudo apt install rcon

Connect and issue commands:

rcon -H SERVER_IP -p 27015 -P your_rcon_password status
rcon -H SERVER_IP -p 27015 -P your_rcon_password changelevel de_mirage
rcon -H SERVER_IP -p 27015 -P your_rcon_password mp_restartgame 1
rcon -H SERVER_IP -p 27015 -P your_rcon_password kick "PlayerName"

On Windows there is no apt, so use any Source RCON client — or skip the client entirely: authenticate in the game console with rcon_password your_rcon_password and prefix commands with rcon.

The server console under systemd owns the process — logs, restarts, crashes — while RCON owns the match: SSH for infrastructure, RCON for game sessions. Never reuse sv_password as your RCON password; that hands admin access to everyone who joins.

Automation and Maintenance

Autostart via systemd

The unit has to launch the server exactly the way you did by hand. Create it:

sudo nano /etc/systemd/system/cs2.service

Example of a working configuration:

[Unit]
Description=CS2 Dedicated Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=cs2user
Group=cs2user
WorkingDirectory=/home/cs2user/cs2server
EnvironmentFile=/home/cs2user/cs2.env
ExecStart=/home/cs2user/Steam/steamapps/common/SteamLinuxRuntime_sniper/run -- \
/home/cs2user/cs2server/game/cs2.sh -dedicated \
+sv_setsteamaccount $GSLT \
+game_alias competitive \
+map de_dust2 \
-maxplayers 10 \
+exec server.cfg
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target

Three details matter here. ExecStart goes through cs2.sh, not the binary, for the same reason the manual launch did. RestartSec=10 stops systemd from hammering restarts in a crash loop. KillSignal=SIGINT lets the server shut down cleanly instead of being killed. The token comes from cs2.env, so it never sits in a world-readable file.

Activate it:

sudo systemctl daemon-reload
sudo systemctl enable cs2
sudo systemctl start cs2

Automatic Updates via Cron

Valve patches Counter-Strike often, and an outdated build rejects every connection. One thing first: cs2user needs to stop and start the service without a password prompt, or the weekly job dies silently. Grant exactly three commands, not full root:

sudo visudo -f /etc/sudoers.d/cs2
cs2user ALL=(root) NOPASSWD: /usr/bin/systemctl stop cs2, /usr/bin/systemctl start cs2, /usr/bin/systemctl restart cs2

Now create ~/update_cs2.sh:

#!/bin/bash
echo "=== $(date) update start ==="
sudo systemctl stop cs2
/home/cs2user/steamcmd/steamcmd.sh \
+force_install_dir /home/cs2user/cs2server \
+login anonymous \
+app_update 730 \
+quit
RC=$?
sudo systemctl start cs2
echo "=== $(date) update finished, steamcmd exit code: $RC ==="

Make it executable and schedule it weekly:

chmod +x ~/update_cs2.sh
crontab -e
0 5 * * 1 /home/cs2user/update_cs2.sh >> /home/cs2user/update.log 2>&1

Every Monday at 05:00 the instance stops, updates and restarts — the routine commercial game servers run behind the scenes. The exit code in the log is what separates "updated" from "steamcmd failed and systemd restarted the old build".

Monitoring

Two commands cover almost everything. Confirm the port is listening:

sudo ss -tulnp | grep 27015

And follow live server console output:

journalctl -u cs2 -f

Without sudo the process column comes back empty, which makes a healthy server look dead. No line for 27015 at all means the server never started or never bound the port. Running both after every update is the cheapest way to hold optimal performance and catch a crash before your players do.

Backups

Configs are small. Archive them before every change, and take gamemodes_server.txt along — slot limits live there, not in cfg/:

tar -czvf cs2_cfg_backup.tar.gz \
~/cs2server/game/csgo/cfg \
~/cs2server/game/csgo/gamemodes_server.txt

Add game/csgo/addons/ if you run SourceMod, but expect the archive to stop being small.

Weekly VPS backups are the layer above: they don't replace config archives, they protect you from fatal disk or image errors.

How Much Does a CS2 Server Cost?

Option

Price

Best for

Free hosting

$0

Up to 14 players, casual games

VPS

$21–51/mo, plus extra disk on the cheaper plans

Teams, leagues, 10–20 players

Dedicated server

from ~$64/mo

Large communities, multiple instances

Free game servers are real but limited: fshost.me gives up to 14 slots across five European locations, requires an account, and stops the instance when the last player leaves — fine for a weekend, useless for a schedule.

A VPS is the practical middle: $21 a month covers a ten-man roster, $51 runs 20 slots with plugins, and on the cheaper plans you add disk on top. A dedicated gaming server from roughly $64 per month only pays off once you outgrow a single instance.

FAQ

  • A machine with a public IP, 2–4 vCPU, 4–8 GB of RAM, and 80 GB of NVMe, plus SteamCMD, App ID 730, and a Steam GSLT. On Ubuntu 24.04 LTS, that is the entire dependency list for CS2 game servers.

  • Free services such as fshost.me give up to 14 slots at no cost, but the instance stops when it empties, and customization is limited. For a permanent, lag-free gaming experience, you need your own VPS.

  • A CS2-capable VPS runs $21–51 per month, plus extra disk space on the entry plans. Dedicated server hardware starts at $64 per month and is overkill for under 30 concurrent players.

  • Set sv_password in server.cfg and restart. Only players who enter that password with the password command can join, which turns a public node into a private server for your team.

  • Modes are set at launch. +game_alias competitive is the clean way; the equivalent numeric pair is +game_type 0 +game_mode 1, and Wingman is +game_alias wingman. Put mode-specific cvars into a _server copy of the gamemode config so updates don't erase them.

  • Deploy a VPS, install the server software with SteamCMD, open UDP 27015 and share your IP. Friends join with connect SERVER_IP:27015 from the developer console, or via Steam → View → Game Servers → Favorites.

What You Have Now

From a blank console you now have a fully updatable CS2 dedicated server with open ports, a documented server setup, RCON control and systemd keeping it alive around the clock. That baseline is what separates a stable gaming experience from a machine nobody trusts.

Next come comfort and control: map rotations, scheduled restarts, and SourceMod when the built-in cvars run out. If the project goes public, moderation and anti-cheat follow. And because it runs on a VPS, you can add CPU or RAM whenever the load grows. Good luck with the matches on your own hardware.

Bare Metal

No virtualization, no sharing — just raw, dedicated performance. Perfect for demanding workloads and custom setups.

From $66.67/mo