Skip to main contentSkip to navigation
[email protected]
Client AreaSupport
Hosting Mammoth
HostingMammothYour Data, Our Responsibility
Home
Solutions
Hosting Services
Store
Pricing
About
Blog
API
Contact

Stay Ahead of the Curve

Get the latest insights on cybersecurity, AI innovations, and enterprise data solutions delivered to your inbox.

Hosting Mammoth
HostingMammothEnterprise Solutions

Enterprise-grade data solutions. Hosting, recovery, cybersecurity, and AI-powered services for businesses worldwide.

[email protected]
Sun - Fri, 9:00am - 5:00pm

Services

  • Cloud Hosting
  • Data Recovery
  • Cybersecurity
  • Legal Support
  • MSP Services
  • Web Development
  • AI Services
  • Free Server Migration

Hosting

  • VPS Hosting (NVMe SSD)
  • VDS Hosting (NVMe)
  • Storage VPS (High SSD)
  • GPU Servers
  • Managed Services
  • Cloud Firewall
  • Load Balancer
  • One-Click Apps
  • n8n Hosting
  • Object Storage
  • FAQ

Company

  • Store
  • Pricing
  • About Us
  • Locations
  • Blog
  • Testimonials
  • Contact
  • Affiliate Program
  • White-Label
  • Terms of Service
  • Privacy Policy
  • Browser Cookies
  • SLA

Support

  • Client Area
  • Submit Ticket
  • Knowledge Base
  • Server Status
  • API Documentation

© 2026 Hosting Mammoth. All rights reserved.

Knowledge Base
Getting StartedAccount ManagementVPS HostingGPU ServersStorage VPSCloud FirewallLoad BalancerServer ManagementBilling & PaymentsSupport & TicketsAffiliate ProgramReseller ProgramMarketplace & Appsn8n HostingManaged ServicesServer MigrationAPI & DevelopersSecurityTroubleshootingGlossaryInstall Guides
  1. Home
  2. /
  3. Support
  4. /
  5. Install Guides
  6. /
  7. How To Install Cs2 Server Ubuntu
GUIDEInstall Guides

How to Install a Counter-Strike 2 Dedicated Server on Ubuntu 24.04 VPS

22 min read

How to Install a Counter-Strike 2 Dedicated Server on Ubuntu 24.04 VPS

Running your own Counter-Strike 2 dedicated server puts you in full control of tick rate, map rotation, plugin stack, and who you play with. Whether you are hosting a low-latency public server for your Discord, running competitive 5v5 scrims with custom configs, or building a community around workshop maps and retake modes, a self-hosted CS2 server on a properly sized VPS will outperform almost anything Valve matchmaking can give you. This guide walks you through provisioning SteamCMD, installing the CS2 dedicated server (app id 730), generating a Game Server Login Token (GSLT), layering Metamod:Source and CounterStrikeSharp for plugins, and running everything under systemd so it survives reboots.

Want a production-ready CS2 host with DDoS protection baked in? Our CloudCore Business VPS ships with 4 vCPU, 8 GB RAM, NVMe storage, and a low-latency European network — exactly what a 10-slot 128-tick CS2 server needs. Deploy in minutes and follow this guide.

Table of Contents

  • Why Self-Host a Counter-Strike 2 Server?
  • System Requirements
  • Prerequisites
  • Step 1: Update the System and Install Dependencies
  • Step 2: Create a Dedicated steam User
  • Step 3: Install SteamCMD
  • Step 4: Download the CS2 Dedicated Server (App ID 730)
  • Step 5: Generate a GSLT (Game Server Login Token)
  • Step 6: Create the Start Script and server.cfg
  • Step 7: Open the Firewall (UDP 27015)
  • Step 8: Install Metamod:Source
  • Step 9: Install CounterStrikeSharp for C# Plugins
  • Step 10: Add Match Orchestration with MatchZy or Get5
  • Step 11: Subscribe to Workshop Maps and Build a Rotation
  • Step 12: Run CS2 as a systemd Service
  • Step 13: Update Script and Backups
  • Troubleshooting
  • FAQ
  • Next Steps
  • Why Self-Host a Counter-Strike 2 Server?

    Self-hosting solves problems official matchmaking cannot. On Valve's servers you get a fixed 64-tick experience, no choice of region peers, and no ability to run plugins or custom maps. With your own dedicated box you decide everything:

    • Higher tick rate and lower latency — Run 128-tick (or experiment with Valve's sub-tick internals) on a VPS located in the same region as your players. A well-peered European or North American VPS regularly delivers sub-20 ms ping for your entire group, which makes a noticeable difference on peekers-advantage-sensitive duels.
    • Custom public and competitive modes — Host a casual 5v5 competitive server, a 10-player retake server, a surf or bhop community, or a practice range. Your rules, your maps, your config.
    • Workshop maps and rotations — Subscribe to any Steam Workshop CS2 map collection, auto-download maps for connecting clients, and rotate through them on timer or vote.
    • Plugin ecosystem — Layer Metamod:Source and CounterStrikeSharp to run admin menus, stats, retake logic, !ws knife/glove commands, warmup tooling, pause/unpause, coaching slots, GOTV demo uploaders, and more.
    • Match orchestration — Drop in MatchZy or Get5 to turn any server into a fully automated scrim/pug/league host with knife rounds, side switches, pause limits, stats JSON, and demo uploads.
    • Privacy and password control — Private slot for your friends, SourceTV for spectators, no Valve anti-cheat bans leaking your gameplay data to third parties.
    • Predictable, flat-rate cost — A CS2 server runs comfortably on a single VPS for less than most people spend on Prime subscriptions and skins per month. No per-hour cloud billing surprises.

    Use Cases at a Glance

    Use CaseTick RateSlotsSuggested Plugins
    Public community (MM-style)6410-12Metamod + CSS + admin menu
    Competitive 5v5 scrims12812 (10 + 2 coach)Metamod + CSS + MatchZy or Get5
    Retakes12810Metamod + CSS + RetakesPlugin
    DM / warmup / aim12816Metamod + CSS + MultiAddonManager
    Surf / KZ / bhop12832Metamod + CSS + timer plugin

    System Requirements

    CS2 is more demanding than CS:GO was. Budget accordingly:

    • CPU: 4 vCPU with high single-thread performance. CS2's simulation is still largely single-thread-bound, so clock speed and IPC matter more than core count. Avoid oversubscribed shared CPU instances.
    • RAM: 8 GB minimum for a single instance with workshop maps. The server itself uses 2-3 GB, but workshop map downloads, GOTV, and plugins chew through more over time.
    • Disk: 50 GB NVMe. The CS2 dedicated server install is ~35 GB after updates. Demos and logs add up fast on an active server.
    • Network: A stable, low-latency connection with at least 100 Mbps symmetric. CS2 uses only a few Mbps per player, but jitter and packet loss ruin the experience instantly. Pick a VPS region close to your players.
    • OS: Ubuntu 24.04 LTS (this guide). Debian 12 works with minor changes.
    Recommended Plan: CloudCore Business
    >
    For a 10-slot 128-tick competitive CS2 server with plugins, workshop maps, and GOTV, we recommend our CloudCore Business VPS:
    >
    - 4 vCPU cores (high-clock)
    - 8 GB RAM
    - 100 GB NVMe SSD
    - 1 Gbps network with DDoS protection
    >
    This leaves enough headroom for Metamod + CounterStrikeSharp + MatchZy, plus a second SourceTV relay if you want to stream casts without hurting server tick.

    Prerequisites

    Before you begin, make sure you have:

    • A VPS running Ubuntu 24.04 LTS with root or sudo access
    • SSH access to your server
    • A Steam account to generate a Game Server Login Token (the account must have no VAC bans and must be at least Steam Guard enabled)
    • Open UDP port 27015 on both your VPS firewall and any upstream provider firewall
    • ~40 GB of free disk space for the CS2 install plus workshop maps
    Connect to your server:

    bash
    ssh root@your-server-ip

    Step 1: Update the System and Install Dependencies

    Refresh the package index and install the 32-bit compatibility libraries SteamCMD and CS2 need. Even though CS2 is 64-bit, SteamCMD itself is 32-bit.

    bash
    sudo dpkg --add-architecture i386
    sudo apt update && sudo apt upgrade -y
    sudo apt install -y \
      curl wget tar unzip ca-certificates lib32gcc-s1 \
      libncurses6:i386 libstdc++6:i386 libcurl4-gnutls-dev:i386 \
      software-properties-common screen nano jq

    Expected output (abbreviated):

    text
    Setting up lib32gcc-s1 (13.2.0-...)
    Setting up libcurl4-gnutls-dev:i386 (...)
    ...
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

    If the kernel was upgraded, reboot:

    bash
    sudo reboot

    Step 2: Create a Dedicated steam User

    Never run game servers as root. Create an unprivileged steam user — CS2 will live entirely inside its home directory.

    bash
    sudo useradd -m -s /bin/bash steam
    sudo passwd steam

    Switch to the new user:

    bash
    sudo -iu steam

    From now on, all SteamCMD and CS2 commands in this guide run as steam unless stated otherwise.

    Step 3: Install SteamCMD

    SteamCMD is Valve's command-line client that downloads and updates any Steam game or dedicated server. It logs in anonymously for server installs — no personal Steam credentials required.

    Create a directory structure and download the Linux tarball:

    bash
    mkdir -p ~/steamcmd ~/cs2 ~/backups
    cd ~/steamcmd
    curl -sSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar -xz

    Verify the binary is present and runnable:

    bash
    ./steamcmd.sh +quit

    Expected output:

    text
    Redirecting stderr to '/home/steam/Steam/logs/stderr.txt'
    [  0%] Checking for available updates...
    [----] Verifying installation...
    ...
    Loading Steam API...OK
    Steam>

    The first run downloads the latest SteamCMD updates, then exits cleanly. You now have ~/steamcmd/steamcmd.sh ready to use.

    Step 4: Download the CS2 Dedicated Server (App ID 730)

    Counter-Strike 2 and its dedicated server share app id 730. Unlike CS:GO which used a separate app id (740) for the server, CS2 installs the dedicated server through the same app id as the client, using anonymous Steam login.

    Run SteamCMD and install CS2 into ~/cs2:

    bash
    ~/steamcmd/steamcmd.sh \
      +force_install_dir /home/steam/cs2 \
      +login anonymous \
      +app_update 730 validate \
      +quit

    Expected output:

    text
    Logging in user 'anonymous' to Steam Public...OK
    Waiting for client config... OK
    Waiting for user info... OK
     Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
     Update state (0x5) validating, progress: 0.12 (...)
     Update state (0x61) downloading, progress: 14.22 (5234567890 / 36812345678)
    ...
    Success! App '730' fully installed.

    The first install downloads ~35 GB and usually takes 5-20 minutes depending on your VPS bandwidth. Subsequent app_update runs only download the delta for the latest patch.

    Confirm the server binary is in place:

    bash
    ls -lh ~/cs2/game/bin/linuxsteamrt64/cs2

    You should see the cs2 executable (tens of MB). This is the process you will launch.

    Step 5: Generate a GSLT (Game Server Login Token)

    A Game Server Login Token (GSLT) lets your dedicated server appear on the official server browser and accept players connecting through the internet rather than only LAN. Without a GSLT, only LAN clients can connect.

  • Log in to https://steamcommunity.com/dev/managegameservers with a Steam account that has no VAC or game bans and is at least Steam Guard protected.
  • Under Create a new game server account:
  • - App ID: 730 - Memo: e.g. cs2-server-01
  • Click Create and copy the resulting token (32 hex characters). Store it somewhere safe — it is effectively a password.
  • You can create up to 1000 tokens per Steam account. If the server violates Valve's rules (cheat hosting, abuse) the token gets revoked, not your main account.

    You will pass this token to CS2 with +sv_setsteamaccount YOUR_TOKEN in the start script.

    Step 6: Create the Start Script and server.cfg

    Now wire up a reusable launch script and the canonical server.cfg that CS2 executes after each map change.

    server.cfg

    bash
    mkdir -p ~/cs2/game/csgo/cfg
    nano ~/cs2/game/csgo/cfg/server.cfg

    Paste a solid public competitive baseline:

    cfg
    // ---- Server identity ----
    hostname                  "My CS2 Server | EU 128t"
    sv_password               ""                        // "" = public
    rcon_password             "CHANGE_ME_LONG_RANDOM_STRING"
    sv_contact                "[email protected]"
    sv_region                 3                         // 3 = Europe, 0 = US East, 1 = US West, 5 = Asia

    // ---- Networking / rate ---- sv_minrate 786432 sv_maxrate 0 sv_mincmdrate 64 sv_maxcmdrate 128 sv_minupdaterate 64 sv_maxupdaterate 128 fps_max 400

    // ---- Gameplay ---- mp_autoteambalance 1 mp_limitteams 2 mp_friendlyfire 0 mp_roundtime 1.92 mp_roundtime_defuse 1.92 mp_freezetime 15 mp_maxrounds 24 mp_overtime_enable 1 mp_overtime_maxrounds 6 mp_warmup_pausetimer 0

    // ---- GOTV / demos ---- tv_enable 1 tv_delay 105 tv_port 27020 tv_maxclients 10 tv_autorecord 1

    // ---- Logging ---- log on sv_logfile 1 sv_logecho 1 sv_logflush 0

    Save and exit (Ctrl+O, Enter, Ctrl+X).

    Start script

    bash
    nano ~/cs2/start.sh
    bash
    #!/usr/bin/env bash
    

    CS2 dedicated server launcher

    cd /home/steam/cs2/game/bin/linuxsteamrt64

    GSLT="PASTE_YOUR_GSLT_HERE" API_KEY="" # optional Steam Web API key for workshop PORT=27015 TVPORT=27020 SLOTS=12 MAP="de_mirage"

    exec ./cs2 -dedicated \ -console \ -usercon \ +ip 0.0.0.0 \ -port ${PORT} \ +tv_port ${TVPORT} \ +maxplayers ${SLOTS} \ +game_type 0 +game_mode 1 \ +map ${MAP} \ +sv_setsteamaccount ${GSLT} \ +sv_logfile 1 \ +sv_logecho 1 \ -tickrate 128 \ -authkey ${API_KEY}

    Make it executable and replace the placeholders:

    bash
    chmod +x ~/cs2/start.sh

    Key flags explained:

    • -dedicated — run headless, no client window
    • -usercon — enable RCON over the game port
    • -tickrate 128 — CS2 respects this flag on community servers
    • +game_type 0 +game_mode 1 — classic competitive (5v5)
    • +sv_setsteamaccount — your GSLT from Step 5
    • -authkey — optional Steam Web API key from steamcommunity.com/dev/apikey, required for some workshop features and MatchZy uploads
    Start it once manually inside a screen session to confirm everything works:

    bash
    screen -S cs2
    ~/cs2/start.sh

    You should see map load logs ending with something like:

    text
    Server is hibernating
    Connection to Steam servers successful.
       Public IP is X.X.X.X.
       Assigned anonymous gameserver Steam ID [G:1:123456].
       GS Token is Valid.
    VAC secure mode is activated.

    Detach the screen with Ctrl+A D. Reattach later with screen -r cs2. We will replace screen with systemd in Step 12.

    Step 7: Open the Firewall (UDP 27015)

    CS2 uses UDP (not TCP) for game traffic. The default port is 27015, with GOTV on 27020. If you have UFW enabled, allow them:

    bash
    # Run as root / sudo user, not as steam
    exit   # drop out of the steam shell first
    sudo ufw allow 27015/udp comment "CS2 game"
    sudo ufw allow 27020/udp comment "CS2 GOTV"
    sudo ufw reload
    sudo ufw status

    Expected output:

    text
    Status: active

    To Action From -- ------ ---- 22/tcp ALLOW Anywhere 27015/udp (CS2 game) ALLOW Anywhere 27020/udp (CS2 GOTV) ALLOW Anywhere

    If your VPS provider has an upstream firewall (Hetzner Cloud firewall, OVH edge filter, DM network ACLs), open the same UDP ports there as well. Connecting players will get "Server not responding" if any layer in between drops UDP.

    Verify from outside the server — from your local machine:

    bash
    nc -u -v -z your-server-ip 27015

    UDP scans are not 100% reliable, so the definitive test is joining the server in the CS2 client:

    text
    Open the console (~) in CS2:
    connect your-server-ip:27015

    Step 8: Install Metamod:Source

    Metamod:Source is the plugin loader that sits between the Source 2 engine and higher-level frameworks. Almost every CS2 plugin (including CounterStrikeSharp) needs Metamod first.

    Switch back to the steam user:

    bash
    sudo -iu steam

    Download the latest Metamod:Source 2.0 dev build for CS2 (check https://www.sourcemm.net/downloads.php?branch=dev for the newest version):

    bash
    cd /tmp
    wget https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1333-linux.tar.gz
    tar -xzf mmsource-2.0.0-git1333-linux.tar.gz -C ~/cs2/game/csgo/

    Metamod needs to be loaded by the engine. Edit the gameinfo:

    bash
    nano ~/cs2/game/csgo/gameinfo.gi

    Find the FileSystem -> SearchPaths block and add the Metamod line before the existing Game csgo line:

    text
    FileSystem
    {
        SearchPaths
        {
            Game_LowViolence    csgo_lv // Perfect World content override

    Game csgo/addons/metamod // <-- ADD THIS LINE Game csgo Game csgo_imported Game csgo_core Game core

    Mod csgo AddonRoot csgo_addons } }

    Save and exit. Restart the CS2 server and check Metamod loads:

    bash
    screen -r cs2    # or restart the systemd service once you have one
    

    In the CS2 console:

    meta version

    Expected output:

    text
    Metamod:Source version 2.0.0-git1333
    Plugin interface version: 16:14
    SourceHook version: 5:5
    Loaded as: Source Engine plugin
    Compiled on: ...
    Built from: https://github.com/alliedmodders/metamod-source/commit/...

    If meta version returns "Unknown command", the gameinfo edit did not apply — double-check indentation and the path.

    Step 9: Install CounterStrikeSharp for C# Plugins

    CounterStrikeSharp (CSS) is the modern plugin framework for CS2. It lets developers write plugins in C# (.NET) instead of SourcePawn, which is why almost every major community plugin for CS2 — admin menus, MatchZy, retakes, GOTV uploaders — ships as a CSS plugin.

    Download the latest CSS runtime release (pick with-runtime on Linux) from https://github.com/roflmuffin/CounterStrikeSharp/releases:

    bash
    cd /tmp
    wget https://github.com/roflmuffin/CounterStrikeSharp/releases/latest/download/counterstrikesharp-with-runtime-build-XXX-linux-XXXXXXXX.zip \
      -O css.zip
    unzip css.zip -d ~/cs2/game/csgo/

    This creates:

    • ~/cs2/game/csgo/addons/counterstrikesharp/ — framework core
    • ~/cs2/game/csgo/addons/metamod/counterstrikesharp.vdf — Metamod registration
    Restart the server. In the CS2 console:

    text
    meta list
    css_plugins list

    Expected output:

    text
    Listing 1 plugin:
      [01] CounterStrikeSharp (1.0.XXX) by roflmuffin

    Drop-in plugins

    Plugin DLLs go into ~/cs2/game/csgo/addons/counterstrikesharp/plugins/<PluginName>/<PluginName>.dll. A handful worth installing right away:

    • CS2-SimpleAdmin — admin menu, bans, kicks, mutes, backed by MySQL or SQLite.
    • MultiAddonManager — forces clients to download multiple workshop addons (required for most custom map servers).
    • CS2-Retakes — retakes gamemode with spawn manager and bomb plant logic.
    • Mapchooser-Extended — end-of-map voting and rotation.
    To install one, unzip into the plugins directory and reload CSS:

    text
    css_plugins reload

    Step 10: Add Match Orchestration with MatchZy or Get5

    For competitive 5v5 scrims, pugs, and leagues, raw CS2 + admin plugins are not enough — you need a match orchestrator that handles knife rounds, side switches, pause/unpause limits, coach slots, stats export, and demo uploads.

    Two options dominate:

    MatchZy (recommended for most)

    MatchZy is a modern CSS-based plugin with a clean config, built-in stats JSON, Get5-compatible match schemas, and an active maintainer. Install:

    bash
    cd ~/cs2/game/csgo/addons/counterstrikesharp/plugins
    wget https://github.com/shobhit-pathak/MatchZy/releases/latest/download/MatchZy-vX.Y.Z.zip -O matchzy.zip
    unzip matchzy.zip

    Configure configs/plugins/MatchZy/config.json with your match mode, demo upload endpoint, and API key. Start a pug:

    text
    !ready          # each player types in team chat
    .setup          # admin command to begin setup

    Get5 (classic, still widely used)

    Get5 has a longer lineage from CS:GO and is the reference implementation for most league platforms. A CS2 port exists under the same org. Choose Get5 if your league platform (like G5V) requires it.

    Step 11: Subscribe to Workshop Maps and Build a Rotation

    CS2 supports Steam Workshop maps via host_workshop_map and host_workshop_collection. Find a collection on the CS2 Workshop and copy the numeric ID from its URL.

    Change the start map in start.sh to a workshop map:

    bash
    +host_workshop_map 3070290247      # example: a de_mirage remake

    Or boot into a full collection and pick randomly:

    bash
    +host_workshop_collection 3070290000

    For servers running more than one workshop map, install MultiAddonManager (see Step 9) and declare the addons in ~/cs2/game/csgo/cfg/multiaddonmanager/multiaddonmanager.cfg:

    cfg
    mm_extra_addons "3070290247,3070290248,3070290249"
    mm_extra_addons_timeout 10

    Simple map rotation

    Create ~/cs2/game/csgo/cfg/mapcycle.txt:

    text
    de_mirage
    de_inferno
    de_dust2
    de_nuke
    de_overpass
    de_ancient
    de_anubis

    And in server.cfg add:

    cfg
    mapcyclefile "mapcycle.txt"

    CS2 will cycle through these maps when matches end. For voting-based rotation, use Mapchooser-Extended.

    Step 12: Run CS2 as a systemd Service

    screen is fine for testing but not for production. Wrap CS2 in a systemd unit so it auto-starts on boot, auto-restarts on crash, and streams logs to journalctl.

    As root, create the unit file:

    bash
    sudo nano /etc/systemd/system/cs2.service
    ini
    [Unit]
    Description=Counter-Strike 2 Dedicated Server
    After=network-online.target
    Wants=network-online.target

    [Service] Type=simple User=steam Group=steam WorkingDirectory=/home/steam/cs2 ExecStart=/home/steam/cs2/start.sh Restart=on-failure RestartSec=10 KillSignal=SIGINT TimeoutStopSec=30 LimitNOFILE=65535

    Hardening

    NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=full ProtectHome=read-only ReadWritePaths=/home/steam

    [Install] WantedBy=multi-user.target

    Enable and start:

    bash
    sudo systemctl daemon-reload
    sudo systemctl enable --now cs2
    sudo systemctl status cs2

    Expected output:

    text
    ● cs2.service - Counter-Strike 2 Dedicated Server
         Loaded: loaded (/etc/systemd/system/cs2.service; enabled)
         Active: active (running) since ...
       Main PID: 12345 (start.sh)
          Tasks: 18
         Memory: 2.4G
         CGroup: /system.slice/cs2.service
                 ├─12345 /bin/bash /home/steam/cs2/start.sh
                 └─12346 ./cs2 -dedicated -console ...

    Stream live logs:

    bash
    sudo journalctl -u cs2 -f

    Step 13: Update Script and Backups

    CS2 patches ship frequently. Automate the update flow and back up configs/demos.

    Update script

    bash
    sudo -iu steam
    nano ~/cs2/update.sh
    bash
    #!/usr/bin/env bash
    set -euo pipefail

    echo "[cs2-update] Stopping CS2..." sudo systemctl stop cs2

    echo "[cs2-update] Running SteamCMD app_update 730..." /home/steam/steamcmd/steamcmd.sh \ +force_install_dir /home/steam/cs2 \ +login anonymous \ +app_update 730 validate \ +quit

    echo "[cs2-update] Starting CS2..." sudo systemctl start cs2 echo "[cs2-update] Done."

    bash
    chmod +x ~/cs2/update.sh

    Give the steam user passwordless sudo for only the two systemctl commands:

    bash
    # As root
    echo 'steam ALL=(root) NOPASSWD: /bin/systemctl start cs2, /bin/systemctl stop cs2' \
      | sudo tee /etc/sudoers.d/steam-cs2
    sudo chmod 440 /etc/sudoers.d/steam-cs2

    Optional: run it weekly via cron (crontab -e as steam):

    text
    0 6   3 /home/steam/cs2/update.sh >> /home/steam/cs2/update.log 2>&1

    Config + demo backups

    bash
    nano ~/cs2/backup.sh
    bash
    #!/usr/bin/env bash
    set -euo pipefail
    STAMP=$(date +%Y%m%d-%H%M%S)
    DEST="/home/steam/backups/cs2-${STAMP}.tar.gz"

    tar -czf "${DEST}" \ -C /home/steam/cs2/game/csgo \ cfg addons/counterstrikesharp/configs addons/counterstrikesharp/plugins \ /home/steam/cs2/game/csgo/*.dem 2>/dev/null || true

    Keep only the last 14 backups

    ls -1t /home/steam/backups/cs2-*.tar.gz | tail -n +15 | xargs -r rm -f echo "Backup written to ${DEST}"
    bash
    chmod +x ~/cs2/backup.sh
    crontab -e    # add:
    

    0 5 * /home/steam/cs2/backup.sh >> /home/steam/cs2/backup.log 2>&1

    For off-server backups, push the tarballs to rclone-compatible object storage nightly.

    Troubleshooting

    ProblemCauseSolution
    GS Token is Invalid on startupWrong, expired, or revoked GSLTRegenerate at steamcommunity.com/dev/managegameservers, paste the new token into start.sh, systemctl restart cs2. Make sure the Steam account has no VAC bans.
    Players see "Server not responding"Firewall dropping UDP 27015Verify sudo ufw status shows UDP 27015 allowed, and that your VPS provider's upstream firewall also allows it. Test with nc -u -v your-ip 27015.
    Workshop map never finishes downloading for clientsMissing authkey or single-addon server with extra mapsGenerate a Web API key at steamcommunity.com/dev/apikey and pass it via -authkey. For multiple workshop maps, install MultiAddonManager.
    VAC secure mode disabled warningsv_setsteamaccount missing or token invalid, or server flaggedConfirm +sv_setsteamaccount YOURGSLT is in the launch line. Recreate the GSLT if it was flagged.
    meta version returns "Unknown command"gameinfo.gi edit did not applyRe-check the indentation and that Game csgo/addons/metamod sits above Game csgo in the SearchPaths block. Restart the server.
    CounterStrikeSharp plugins fail with missing .NET runtime errorsDownloaded the non-runtime buildDownload the with-runtime zip from the CSS releases page and extract again.
    High CPU usage on a quiet serverNot a bug — CS2 busy-loops on fps_maxThat is normal. Lower fps_max to 300 or 256 to reduce idle CPU on CPU-constrained VPS.
    Server crashes on map change to workshop mapMap requires an addon that is not declaredInstall MultiAddonManager and list all workshop IDs in mm_extra_addons.
    Segmentation fault at startMissing i386 libs or partial Steam validateRe-run sudo apt install lib32gcc-s1 libncurses6:i386 libstdc++6:i386 libcurl4-gnutls-dev:i386 and app_update 730 validate.
    No GOTV availabletv_enable 0, or port 27020 blockedSet tv_enable 1 in server.cfg, open UDP 27020 in UFW and upstream firewall.

    Viewing logs

    The definitive debug channel is journalctl:

    bash
    sudo journalctl -u cs2 -f
    sudo journalctl -u cs2 -n 200 --no-pager

    CS2 also writes to ~/cs2/game/csgo/logs/ when sv_logfile 1 is set.

    FAQ

    Is Counter-Strike 2 really free to host?

    Yes. The CS2 dedicated server is free via SteamCMD under anonymous login — you do not need to own CS2 or have any paid Steam account to run it. You only need a free Steam account (with no VAC bans and Steam Guard enabled) to generate a GSLT so the server can appear on the public internet. The only cost is the VPS itself.

    What tick rate does CS2 actually run at?

    CS2 replaced the classic fixed-tick model with sub-tick — inputs are timestamped with microsecond precision regardless of server tick. That said, community servers still set -tickrate 128 and most plugins, demos, and replays behave as if the tick rate matters. For competitive play, 128 tick remains the expected standard and there is no reason not to set it on your own server.

    Can I host multiple CS2 servers on the same VPS?

    Yes, if the hardware allows. Each additional instance needs a separate install directory (or shared binaries via bind mount), a unique -port (e.g. 27015, 27016, 27017), a unique +tv_port, its own GSLT, and its own systemd unit. A 4 vCPU / 8 GB VPS comfortably runs 2 small public servers (10-slot 64 tick) or 1 competitive 128-tick server. For 3+ instances, scale up to a dedicated CPU server.

    How do I give myself admin on the server?

    Install CS2-SimpleAdmin (a CounterStrikeSharp plugin). Edit its admins.json config and add your SteamID64 with @css/root flags. Then css_plugins reload in the server console. You will get an in-game admin menu accessible via !admin.

    Do I need DDoS protection?

    If your server is public and listed on the master list, yes — CS2 servers are regular targets for UDP flood attacks. Pick a VPS provider that offers basic L3/L4 DDoS scrubbing at no extra cost (our CloudCore Business plans include it). For very competitive community projects, consider a GRE tunnel to a game-specific anti-DDoS provider.

    How do I integrate stats, demo uploads, and a league frontend?

    MatchZy emits per-match JSON stats to a configurable webhook and can upload demos via S3-compatible storage or HTTP PUT. Pair that with a lightweight league platform — Leetify for auto-stats review, a self-hosted Get5Loader instance for full league management, or a custom dashboard consuming the JSON. Demos themselves go to ~/cs2/game/csgo/ by default when tv_autorecord 1 is set.

    Next Steps

    Now that CS2 is running under systemd with Metamod and CounterStrikeSharp, here is where to go next:

    • Harden the host — Lock down SSH, install fail2ban, tighten UFW rules, and enable unattended security upgrades.
    • Add a community admin menu — Install CS2-SimpleAdmin with MySQL backing to manage bans, mutes, and permissions from an external panel.
    • Publish a match page — Wire MatchZy webhooks into a small Next.js or Laravel dashboard so your pug/scrim results are queryable.
    • Set up a SourceTV relay — Run a second thin process that connects to your main server's GOTV port and re-broadcasts to casters/spectators, isolating viewer load from gameplay tick.
    • Automate workshop sync — Write a small script that periodically pulls your map collection and restarts the server during low-traffic windows.
    • Dive into Valve's reference docs — The official CS2 server documentation lives at developer.valvesoftware.com/wiki/Counter-Strike_2/Dedicated_Servers and covers every convar and launch flag in detail.

    Running a CS2 Community? Start on CloudCore Business.
    >
    You need a VPS with real CPU clock speed, NVMe storage, a low-latency network, and DDoS protection — not a shared container. Our CloudCore Business plan is built for game servers:
    >
    - 4 vCPU high-clock cores
    - 8 GB DDR4 RAM
    - 100 GB NVMe SSD
    - 1 Gbps port with L3/L4 DDoS scrubbing
    - European and North American locations
    >
    Deploy your CS2 server now and have players connecting within an hour.

    Was this article helpful?

    ← Back to Install GuidesBrowse all categories →

    Still have questions?

    Contact Support →Submit a Ticket