# Counter-Strike 2 Server Hosting - everything RE:NODE has published

> A Counter-Strike 2 server on RE:NODE: plans, how the panel runs it, and every tutorial RE:NODE has published about it.

Generated from https://www.renode.space/game-servers/counter-strike-2, the live catalogue, the deploy docs, the panel guides and the RE:NODE blog. English. Source of truth for anything that changes: https://www.renode.space/game-servers/counter-strike-2.

Contents: what it is, plans and prices, panel how-to, tutorials, rules for the assistant.

## What it is

Counter-Strike 2 servers, sized for competitive and community play.

- Genres: Action, Free To Play
- Developer: Valve
- Released: 21 Aug, 2012
- Steam: https://store.steampowered.com/app/730/

### You supply one thing yourself

Counter-Strike 2 is only sold with a credential its publisher issues to a person, so you need to own the game yourself and provide it after checkout. We cannot create it for you and we never share one between customers. Your server is built immediately; the game installation waits until you paste it into the Setup tab, then runs itself.

### What comes with every Counter-Strike 2 server

- Configured before you see it: The install runs, the configuration is written and the server starts. No first-boot checklist, and nothing left on a default password shared with every other Counter-Strike 2 server on the internet.
- The real console: Live output, command input and the server's own logs - not a filtered summary. Web-server noise is folded behind a counter you can switch off.
- Files and SFTP: A full file manager with an editor, plus SFTP credentials. Upload mods, edit configs, pull a world down to your machine.
- 2-2 backup slots: Taken on demand or on a schedule, restored with a button. Deleting a server takes its backups with it, on purpose.
- 2 ports allocated: Add and remove ports yourself from the Network tab, including the query and RCON ports where the game wants them.
- People on the same server: Invite friends or staff with granular permissions - console only, files only, no billing - through subusers, roles and teams.

### Which Counter-Strike 2 plan do you need?

Memory is what decides whether a server holds together, so start there. The Starter tier gives 1 GB and 1 vCPU, which suits a private group. The Advanced tier at 3 GB is where most public servers sit, and Premium at 6 GB exists for the servers that stay full.

Storage matters more than people expect once mods and backups are involved - plans here run from 15 GB to 50 GB of NVMe. Moving up or down a tier later does not rebuild your world; it changes the limits on the container you already have.

If you are not sure, take the middle tier. It is cheaper to move up after a busy weekend than to spend one explaining lag to your players.

More game servers: https://www.renode.space/ai/game-servers.md

### General questions

### Getting started

**How quickly is my server ready?**

Game, app, web and database servers are created the moment payment clears, usually inside a minute. The game or runtime is installed and started for you, and the console is live in your browser while it happens. VDS and dedicated servers are prepared by hand and delivered within 24 hours.

**Do I need to configure anything before it works?**

No. The install runs, the configuration is written, and admin passwords are generated for your server rather than shared with everybody else's. The exception is four games whose publisher issues a credential to a person - those say so on the shop before you pay, and ask for it on a Setup tab afterwards.

**Which games need a key from me?**

Counter-Strike 2 needs a Steam game-server token, Don't Starve Together a Klei cluster token, FiveM a Cfx.re licence, and DayZ, Project Zomboid, 7 Days to Die, Arma 3 and Unturned need a Steam account or token of your own. We cannot create any of them and we never share one between customers. Your server is built immediately and the installation waits until you paste yours in.

**Can I try before buying?**

There is no free tier. The entry plans start at $1.50 a month precisely so that trying something costs about as much as a coffee.

**Can Claude or ChatGPT set my project up?**

Yes, and the panel gives it what it needs. On a server's Console tab, pick a purpose and press Connect AI: the panel copies a private link with the runtime, the port the code must read from SERVER_PORT, the code path, the GitHub branch, the databases and the limits. Paste it into Claude, ChatGPT or any assistant that can open links; the same link followed by /mcp works as an MCP server URL. It stops by itself after 7 days unused. You can also connect Claude, or any MCP client, to your whole account at https://panel.renode.space/api/client/mcp. Linked repositories get a pre-flight check that shows what will break before a deploy, no AI needed. No password or token is ever shown to the assistant - the AI setup page explains it all.

### Running the server

**Do I get full file access?**

Yes - a complete file manager with an in-browser editor, plus SFTP credentials. There is no plan on which the file manager is disabled or read-only.

**Can I install mods and plugins?**

Yes. Upload them through the file manager or SFTP, or use the game's own workshop support where it has any. Nothing here whitelists which mods you are allowed to run.

**Can other people help me run it?**

Yes. Invite subusers with granular permissions - console only, files only, no billing - or build a team with a role and grant it access to several servers at once. Permissions are a union, so nobody loses access they were given elsewhere.

**What happens if my server runs out of memory?**

New servers are configured so the kernel stops the container and it restarts clean, rather than swapping and dragging the whole machine down. If a server restarts repeatedly we warn you on the server page and open a support ticket before anything is suspended - you get told twice before it stops.

**Is the CPU limit a hard limit?**

Yes, and it cannot be breached: the container is throttled to the share you bought. A server sitting at 100% is slow, not broken, and is never suspended for it.

### Backups and safety

**Are backups included?**

Every plan carries backup slots - two on the entry tiers, more further up. Take them on demand or on a schedule, and restore with a button rather than a support ticket.

**Where are backups stored?**

Off the machine they protect. A backup sitting on the same disk as the thing it is insuring covers you deleting your world and covers nothing at all about the disk failing.

**What happens to my backups if I cancel?**

Deleting a server deletes its backups with it, deliberately and including locked ones. Download anything you want to keep first - the panel lets you.

### Billing

**How do I pay?**

PayPal, card, your wallet balance, or bank transfer. Every method produces a proper invoice you can download or print, with our details and the bank account on it while it is unpaid.

**Can I pay in Georgian lari?**

The panel displays every figure in lari at the National Bank of Georgia's published rate, marks converted figures as approximate, and always shows the amount that will actually be charged. Invoices stay in the currency they were raised in, because an invoice is a demand for a specific amount.

**What happens when my subscription is due?**

An invoice is raised and emailed to you seven days before expiry, and again on the day. Paying it settles that same document rather than raising a second one.

**Can I upgrade or downgrade later?**

Yes, and it does not rebuild anything. Changing plan changes the limits on the container you already have - your world, files and database stay exactly where they are.

**Do you offer refunds?**

There is no automatic refund button. If a server cannot do what it was sold to do, open a ticket and we will sort it out - including refunding you. We would rather fix the plan than argue about the policy.

### Support and the honest bits

**How do I get help?**

Open a ticket from the panel - it reaches every member of staff and every administrator, not a queue aimed at nobody in particular. Attach a screenshot if it helps; attachments are private to your ticket rather than sitting at a guessable public URL. Discord is there for faster, less formal questions.

**Where are the servers?**

Germany, on hardware we run. That is one location: if you need players in another region on a low ping, say so before buying rather than after.

**Is there an uptime guarantee?**

We measure node availability every five minutes and report it in the panel rather than printing a number with four decimal places we have not earned. If something is down you will usually hear it from us first.

**Who actually runs this?**

A small team that writes the panel, the shop and the automation itself. When something is wrong the fix is a code change, which is why the list of things wrong keeps getting shorter.

## Plans and prices

Read from the live catalogue at 2026-10-15 22:30 UTC. Prices are in US dollars per month; checkout also takes Georgian lari and bills for 1, 3, 6, 12 or 24 months. Prices change - re-check on https://www.renode.space/game-servers/counter-strike-2 or in the panel shop at https://panel.renode.space before quoting one.

- You supply: Steam game server token - Valve issues one free token per server to any Steam account that owns a game. Create one for app ID 730, then paste the 32-character token here. Without it the server runs but will not appear in the public server browser. (https://steamcommunity.com/dev/managegameservers)

| Plan | Price / month | Memory | CPU | NVMe disk | Databases | Backups | Ports |
|---|---|---|---|---|---|---|---|
| Starter | $7 | 1 GB | 1 vCPU | 15 GB | 1 | 2 | 2 |
| Standard | $10 | 2 GB | 1.5 vCPU | 20 GB | 1 | 2 | 2 |
| Advanced | $14 | 3 GB | 2 vCPU | 30 GB | 1 | 2 | 2 |
| Pro | $18 | 4 GB | 2.5 vCPU | 40 GB | 1 | 2 | 2 |
| Premium | $24 | 6 GB | 3 vCPU | 50 GB | 1 | 2 | 2 |


## Panel how-to

From the panel guides at https://www.renode.space/guides.

### Ordering a server

Ordering takes about a minute and happens in three screens: find what you want to run, pick a plan, and pay. Pay by card or PayPal and the server is set up the moment the payment goes through - you can watch it install in its console.

- Takes: About a minute
- Pay with: Card, PayPal or bank transfer
- Billed for: 1, 3, 6, 12 or 24 months
- Prices in: US dollars or Georgian lari

Open the shop and find what you want to run:

1. Sign in to the panel and open the shop. The tabs along the top are the product lines: VDS, Game Servers, App Hosting, Web Hosting and Databases.
2. Find your game - there is a search box - and press View plans. The card already shows the lowest price and the range of memory on offer.

Compare the plans and pick one:

3. Every plan lists its memory, CPU and NVMe storage, roughly how many players it suits, and what is included - updates, backup slots, file and SFTP access.
4. Press Get Started on the one you want. Not sure? Start smaller: you can move to a bigger plan later without losing your world.

Choose how long, then pay:

5. Pick a billing period - 1, 3, 6, 12 or 24 months. The total for the whole period is shown before you pay, so there are no surprises.
6. Pay with PayPal, or press Debit or Credit Card - paying by card does not need a PayPal account. The server is created as soon as the payment completes.

Paying by bank transfer instead: Prefer to pay from your bank? Choose bank transfer at checkout. The server is set up once the payment arrives, usually the next working day.

1. Switch the payment tab to Bank transfer. The account details for Bank of Georgia and TBC Bank appear, each with a Copy button.
2. Press Order & get invoice, then pay that invoice from your banking app, quoting the reference on it.

After you pay:

- The server appears under My Servers and installs itself. Open it to watch the install in the console.
- Your orders, invoices and subscriptions are under Finances in the side menu.
- Stuck at any step? Open Support in the side menu and raise a ticket.

### The console

Live output, a command line, power controls and the resource graphs. It is the server's own output rather than a filtered summary - if the game prints it, you see it.

- Start, stop, restart and kill, with the current state always visible.
- Command history with the arrow keys, and tab completion for common commands.
- Web-server noise - the internet knocking on doors that are not there - is folded behind a count you can switch off. A real error always prints.
- Graphs for memory, CPU and disk against your limits, so whether it is the plan or the mod is answerable.

### Files and SFTP

A complete file manager with an editor in the browser, plus SFTP credentials for the tools you already use. Upload a modpack, fix a config, pull a world down to your machine.

- Drag files in, or upload a folder. Archives can be unpacked in place.
- Edit any text file with syntax highlighting and save without downloading it.
- PDFs and images preview in the panel rather than downloading first.
- SFTP on the same credentials - use FileZilla, WinSCP or your editor's remote mode.

### Backups

Take one before you try something. Restore it when the something goes wrong. Lock the ones that matter so they are not rotated away.

- Slots on every plan - two on the entry tiers, more further up.
- Take one on demand, or on a schedule you set.
- Download any backup to your own machine.

> Important: Deleting a server deletes its backups, including the locked ones. A lock stops you removing a backup by accident; it is not a claim on the disk after the server is gone. Download what you want to keep before you cancel.

### Subusers, roles and teams

Give somebody the console without giving them your files, or the files without your billing. Three separate ideas, kept apart deliberately.

- A role holds permissions - what may be done.
- A team holds people.
- A grant joins a team to a server with a role, so adding a moderator to the team gives them the same access everywhere at once.
- Invite by link, by a join code, or by email address - and require approval on the codes if you would rather vet people.
- Access can be time-boxed, and expiry stops working immediately rather than overnight.

### Scheduled tasks

Restart nightly, back up before the restart, announce it to players first. Tasks run in order with delays between them, so a schedule can be a small routine rather than one action.

- Send a console command - a warning to players, a save, a world flush.
- Take a backup.
- Power actions: start, stop, restart.

### Games that need a key from you

A few games want a credential their publisher issues to a person - a Steam game-server token, a Steam account that owns the server files, a Klei cluster token, a Cfx.re licence. We cannot create one and we never share one between customers.

> Note: Those games say so on the shop before you pay. Your server is built immediately, and the game installation is held until you paste the value into a Setup tab, because installing without it produces a server with no game files in it and no explanation.

## Tutorials

10 posts, newest first. Each one follows in full after the list.

- [CS2 practice and private match commands (the CS:GO ones too)](https://www.renode.space/blog/cs2-practice-and-private-match-commands) (2026-10-15): The CS2 console commands for a practice session and a private 5v5: sv_cheats, infinite ammo, grenade previews, a saved .cfg, match rules and pauses.
- [Rent a CS2 server: what to check before you pay](https://www.renode.space/blog/cs2-server-rent-what-to-look-for) (2026-10-15): What matters when you rent a Counter-Strike 2 server: tick rate claims, CPU and RAM by slots, your GSLT, ping, plugins, GOTV, DDoS wording and price traps.
- [CS2 GOTV and demos: recording and storage](https://www.renode.space/blog/cs2-gotv-and-demos) (2026-10-07): Set up GOTV on a CS2 server: the tv_ cvars that matter, delay, recording demos automatically or by hand, watching live, and keeping demo storage under control.
- [CS2 retakes and deathmatch servers](https://www.renode.space/blog/cs2-retakes-and-deathmatch-servers) (2026-10-07): Run a CS2 retakes or deathmatch server: the retakes and allocator plugins, spawns per map, deathmatch cvars, free-for-all, headshot-only modes and sizing.
- [CS2 surf, bhop and KZ server setup](https://www.renode.space/blog/cs2-surf-bhop-kz-servers) (2026-10-07): Set up a CS2 surf, bhop or KZ server: the movement cvars and their defaults, round settings, timer plugins, zones, workshop maps and the bugs players report.
- [CS2 workshop maps on a dedicated server](https://www.renode.space/blog/cs2-workshop-maps-and-collections) (2026-10-07): Load CS2 workshop maps by id, run a whole collection with host_workshop_collection, switch maps, build a rotation and fix maps that will not download.
- [CS2 competitive match server with MatchZy](https://www.renode.space/blog/cs2-competitive-match-server-config) (2026-09-21): The cvars for an MR12 match, a knife round and warm-up, MatchZy for ready-up and pauses, GOTV demos, and restoring a round after a crash.
- [CS2 plugins: Metamod and CounterStrikeSharp](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp) (2026-09-21): Why SourceMod does not run on CS2, how to install Metamod:Source and CounterStrikeSharp, set up admins and flags, and survive a game update.
- [CS2 server commands, cvars and RCON](https://www.renode.space/blog/cs2-server-commands-and-cvars) (2026-09-21): Where a Counter-Strike 2 server keeps its settings, which cvars matter, how game modes quietly override server.cfg, and the RCON commands to run live.
- [Counter-Strike 2 server setup and config](https://www.renode.space/blog/counter-strike-2-server-setup) (2026-07-21): Run a CS2 dedicated server: the Game Server Login Token, SteamCMD install, server.cfg and gamemode configs, ports, RCON, GOTV and Metamod plugins.

---

### CS2 practice and private match commands (the CS:GO ones too)

Published 2026-10-15 by RE:NODE Team. https://www.renode.space/blog/cs2-practice-and-private-match-commands

A practice session in Counter-Strike 2 is about fifteen console commands, and a private 5v5 is about ten more. For practice: `sv_cheats 1`, then infinite ammo, buying anywhere, a long round with no freeze time, grenade trajectories, and the bots kicked or frozen. For a private match: the round count, overtime, halftime and a restart, plus the two pause commands for when somebody's router gives up. Put each set in a `.cfg` file once and you type `exec prac` instead of fifteen lines every time.

Most of what people find when they search for "csgo practice server commands" still works, because CS2 kept the Source naming. Some of it does not, and a few of the numbers changed - the match length most of all. This post gives the CS2 versions, says where the old CS:GO ones differ, and explains where each command has to be typed, which is the part that trips people up on a dedicated server. The full server reference lives in [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars); the plugin-driven match night is in [a CS2 competitive match server](https://www.renode.space/blog/cs2-competitive-match-server-config).

#### Where the commands run: your game or a server

Every command below is typed into a console, but there are three consoles it could be, and they do not behave the same.

| Where | Who is the server | Who can set `sv_` and `mp_` cvars |
| --- | --- | --- |
| Practice map from the menu | Your own game | You, in your console |
| Party on a workshop or practice map | The party leader's game | Only the leader |
| Dedicated server | A separate process | The server console or RCON |

The first case is the easy one. Play, choose Practice, pick a map, and your game starts a local server with you on it. Anything you type affects that server directly, because you are it.

The third case is where people get stuck. On a dedicated server, cvars beginning `sv_`, `mp_`, `bot_` and `ammo_` belong to the server. Typing `sv_infinite_ammo 1` into your own client console while connected to someone else's server does nothing, and the console does not always say so. Those lines have to go in through the server's console - on a panel host, the console tab - or through `rcon` from your client. What a player can type for themselves is the small set of cheat commands that act on their own character: `noclip`, `give`, `setpos`. Those work only because the server has `sv_cheats 1`, which is why that one line comes first.

> [!WARNING]
> A server with `sv_cheats 1` lets every connected player fly, spawn weapons and teleport. Put a password on any server running a practice config with `sv_password`, and never leave it on a server that appears in the public browser.

#### Turning on the console and sv_cheats

The developer console is off by default. In CS2 it lives in Settings, Game, "Enable Developer Console (~)". Set it to Yes and the key to the left of `1` opens it. On some keyboard layouts that key sends a different character; if nothing happens, bind the console to another key in the keyboard settings rather than fighting it.

Then, on a map you are hosting:

```text
sv_cheats 1
```

`sv_cheats` is a server cvar, so on a dedicated server it goes into the server console. It does not survive a server restart and it is not set by any of Valve's mode configs, which is good: a practice server that restarts overnight comes back clean. If you load a new map with `map`, check it again with `sv_cheats` on its own, which prints the current value.

On a dedicated server the order matters for one more reason. Several practice cvars are flagged as cheats and are refused with a message about `sv_cheats` if you set them before it. When a config "half works", this is usually why.

#### The practice config, line by line

Here is a complete practice config for solo or team grenade work. It runs the same on your own game and on a dedicated server.

game/csgo/cfg/prac.cfg:

```cfg
sv_cheats 1
mp_limitteams 0
mp_autoteambalance 0
mp_ignore_round_win_conditions 1
mp_roundtime 60
mp_roundtime_defuse 60
mp_roundtime_hostage 60
mp_freezetime 0
mp_buy_anywhere 1
mp_buytime 9999
mp_maxmoney 60000
mp_startmoney 60000
mp_afterroundmoney 60000
mp_respawn_on_death_t 1
mp_respawn_on_death_ct 1
sv_infinite_ammo 1
ammo_grenade_limit_total 5
sv_grenade_trajectory_prac_pipreview 1
sv_grenade_trajectory_prac_trailtime 8
sv_showimpacts 1
sv_showimpacts_time 8
bot_kick
mp_warmup_end
mp_restartgame 1
```

What each group does:

| Cvar | Value | Why |
| --- | --- | --- |
| `sv_cheats` | `1` | Unlocks everything flagged as a cheat |
| `mp_ignore_round_win_conditions` | `1` | Round never ends, even with nobody alive |
| `mp_roundtime` and the two variants | `60` | Minutes. 60 is the ceiling |
| `mp_freezetime` | `0` | No frozen start after a restart |
| `mp_buy_anywhere` | `1` | Buy menu away from spawn |
| `mp_buytime` | `9999` | Seconds. Effectively forever |
| `mp_maxmoney` / `mp_startmoney` | `60000` | Never run out mid-session |
| `mp_respawn_on_death_*` | `1` | Die, come straight back |
| `sv_infinite_ammo` | `1` | No reload, grenades not used up |
| `ammo_grenade_limit_total` | `5` | Carry one of each grenade type |
| `sv_showimpacts` | `1` | Draw bullet impacts |
| `bot_kick` | - | Remove every bot |

`sv_infinite_ammo` has two non-zero values and they are not the same. `1` means the magazine never empties and a thrown grenade stays in your hand, so you can throw the same smoke twenty times without rebuying. `2` means the reserve is infinite but you still reload, which is the setting for spray practice, because reloading is part of the spray.

`mp_roundtime` covers maps without a specific objective; `mp_roundtime_defuse` and `mp_roundtime_hostage` win on the map types they name. Set only the first and a defuse map still ends at the competitive time, which is the most common "my round keeps ending" question. With `mp_ignore_round_win_conditions 1` as well, the round will not end on kills or a bomb either.

`ammo_grenade_limit_total` is the total grenades a player can carry. The competitive limit is four. With five you hold an HE, a flash, a smoke, a molotov or incendiary and a decoy at once. Flashbangs have their own limit of two per player in `ammo_grenade_limit_flashbang`, so practising a double flash does not need the total raised further.

`mp_warmup_end` and `mp_restartgame 1` sit at the bottom on purpose. Warm-up on a fresh map has its own rules, and some cvars only take hold at the start of a round. Ending warm-up and restarting once makes the whole file apply in one go.

#### Grenade practice commands

The four cvars above make the server forgiving. These are the ones that teach you something.

`sv_grenade_trajectory_prac_pipreview 1` shows a small preview of where a grenade will land while you hold it, before you throw. It is a CS2 feature and it is the single most useful practice cvar the game has: you line up the throw, watch the preview settle on the right pixel, and only then release. It is a server setting, so on a dedicated server everyone gets it.

`sv_grenade_trajectory_prac_trailtime 8` draws the path a thrown grenade took and leaves it on screen for that many seconds. With the preview showing where it will land and the trail showing where it went, you can see exactly how a jump-throw differs from a standing throw.

`sv_showimpacts 1` marks bullet impacts, `sv_showimpacts_time` keeps them visible for that many seconds. The marks come in two colours, one from the client and one from the server, and the gap between them is your movement error at the moment you fired. `2` shows only the client marks and `3` only the server's.

Then the commands a player types in their own console:

```text
sv_rethrow_last_grenade
noclip
cl_showpos 1
getpos
setpos 1200 -560 64
give weapon_smokegrenade
bot_add_t
bot_place
bot_stop 1
```

`sv_rethrow_last_grenade` throws your last grenade again from exactly where you threw it, without you moving. Bind it to a key and you can stand at the landing spot watching while the smoke repeats. `noclip` lets you fly; it is how you walk to the end of a smoke without being on the receiving end.

`getpos` prints a ready-made `setpos ... ; setang ...` line with your current position and view angle. Copy it into a config next to the name of the line-up and you have a teleport back to the spot you threw from. `cl_showpos 1` shows the same coordinates live in the corner of the screen.

`bot_add_t` (or `bot_add_ct`) adds one bot, `bot_place` moves the most recently added bot to where you are looking, and `bot_stop 1` stops all bots from moving or reacting. Together they put a target exactly where an enemy stands on a peek, which is how you check whether a flash actually blinds the angle or just looks impressive. `bot_kick` removes them all at the end.

> [!TIP]
> On a dedicated server, `bot_add`, `bot_place` and `bot_stop` are server commands. Type them in the server console or prefix them with `rcon`, or the bot will appear in nobody's game but yours.

#### Saving it as a .cfg and running it with exec

A config is a plain text file of console lines, one per line, saved with a `.cfg` extension. Lines starting with `//` are comments.

For your own game, the folder is inside the Steam install, which still uses the old folder name:

```text
Steam/steamapps/common/Counter-Strike Global Offensive/game/csgo/cfg/
```

For a dedicated server it is the same relative path, `game/csgo/cfg/`, inside the server's directory. On a panel host you create the file in the file manager or upload it over SFTP. Then:

```text
exec prac
```

The `.cfg` is optional. `exec` reads from the `cfg` folder; a subfolder works too, as `exec practice/mirage`.

Two habits make practice configs pleasant rather than tolerable. First, a matching `prac_off.cfg` that puts everything back, so ending a session is one command rather than a server restart:

game/csgo/cfg/prac_off.cfg:

```cfg
sv_infinite_ammo 0
sv_grenade_trajectory_prac_pipreview 0
sv_showimpacts 0
mp_ignore_round_win_conditions 0
mp_buy_anywhere 0
mp_respawn_on_death_t 0
mp_respawn_on_death_ct 0
sv_cheats 0
mp_restartgame 1
```

Second, binds for the commands you use with a grenade in your hand. These go in your client config, not the server's:

cfg/autoexec.cfg:

```cfg
bind "mouse4" "sv_rethrow_last_grenade"
bind "mouse5" "noclip"
bind "kp_enter" "getpos"
```

Whether CS2 runs `autoexec.cfg` on its own has been inconsistent across updates. The reliable route is to add `+exec autoexec` to the game's launch options in Steam, so it runs every time regardless. Line-up teleports can go in per-map files - `exec lineups_mirage` with a `setpos` line per smoke - which is the whole of what a lot of paid practice tools do.

#### Private 5v5 match commands

For a private game between ten people, the defaults of the competitive mode are close to right already. What you set by hand is the length, the overtime and the halftime, and then you restart so it all applies.

game/csgo/cfg/scrim.cfg:

```cfg
sv_cheats 0
mp_maxrounds 24
mp_halftime 1
mp_halftime_duration 15
mp_overtime_enable 1
mp_overtime_maxrounds 6
mp_overtime_startmoney 12500
mp_match_can_clinch 1
mp_freezetime 15
mp_roundtime_defuse 1.92
mp_buytime 20
mp_buy_anywhere 0
mp_startmoney 800
mp_maxmoney 16000
mp_autoteambalance 0
mp_limitteams 0
mp_autokick 0
mp_warmup_end
mp_restartgame 3
```

| Cvar | What it decides |
| --- | --- |
| `mp_maxrounds` | Regulation length. `24` is MR12, first to 13 |
| `mp_halftime` | Swap sides after half the rounds |
| `mp_halftime_duration` | Seconds of the half-time break |
| `mp_overtime_enable` | Play overtime at 12-12, or allow a draw |
| `mp_overtime_maxrounds` | Rounds per overtime. `6` is MR3 |
| `mp_overtime_startmoney` | Money at the start of each overtime half |
| `mp_match_can_clinch` | End at 13 rather than playing out all 24 |
| `mp_autokick` | `0` stops idle kicks during a long pause |

`mp_match_can_clinch` deserves a sentence because people turn it off by accident. With it on, a 13-3 match ends at 13-3. With it off, the server plays all 24 rounds, which is only what you want for a deliberate practice of the whole economy. `mp_overtime_enable 0` lets a regulation match end 12-12, which is fine for a scrim and wrong for anything with a result.

`mp_restartgame 3` restarts after three seconds; any number works, and `1` is fine. Exec the config first, restart second. Restarting first and then execing leaves the old money and round count in place for the first round, and the score is off before anyone notices.

Keep a few more by hand for the evening. `mp_warmup_start` puts the server back into warm-up, and `mp_warmup_pausetimer 1` keeps warm-up running until you end it, which is how you wait for the tenth player without the clock deciding for you. `mp_swapteams` swaps everyone between sides and restarts the game, so it belongs before going live, not after. `mp_teamname_1` and `mp_teamname_2` set the names on the scoreboard. `changelevel de_nuke` moves to another map with everyone still connected; `map de_nuke` does the same but drops and reconnects every client.

Remember where these go on a dedicated server. A `scrim.cfg` that sets `mp_` values is safe to exec live, but if you want the values to be the defaults every time the map loads, they belong in `gamemode_competitive_server.cfg`, because Valve's mode config runs after `server.cfg` on every map and overwrites it. [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars) explains that order in full.

#### Pauses, timeouts and fixing a round

Two commands stop a match:

```text
mp_pause_match
mp_unpause_match
```

`mp_pause_match` does not freeze the game mid-gunfight. It pauses at the next freeze time, so the round in progress finishes and the next one waits on the buy screen. That is deliberate - a pause mid-round would change the outcome. `mp_unpause_match` resumes. Both are server commands, so in a private game the host or whoever holds RCON runs them.

Tactical timeouts are separate. `mp_team_timeout_time` sets their length in seconds and `mp_team_timeout_max` how many each team gets; players call them through the vote menu during freeze time. An admin can also start one for a team with `timeout_terrorist_start` or `timeout_ct_start`. If those two are not found on your build, `find timeout` lists what the current version calls them.

When a round has to be replayed - a crash during the buy, a player who disconnected at the worst time - the engine's round backups are the tool. `mp_backup_round_auto 1` writes a small file per round, and `mp_backup_restore_load_file` loads one back with money and score intact. It only helps if it was on before the problem, so add it to the scrim config. The details, and how MatchZy wraps the same mechanism in a `.stop` command both teams have to agree to, are in [the competitive match server post](https://www.renode.space/blog/cs2-competitive-match-server-config).

#### What changed from CS:GO

Most CS:GO practice and match configs load in CS2 with a few lines failing. These are the ones worth knowing about.

| CS:GO | CS2 |
| --- | --- |
| `mp_maxrounds 30` (MR15) | `mp_maxrounds 24` (MR12) |
| Overtime money `10000` | `mp_overtime_startmoney 12500` |
| `csgo/cfg/` | `game/csgo/cfg/` |
| `cl_grenadepreview 1` | `sv_grenade_trajectory_prac_pipreview 1` |
| `sv_grenade_trajectory 1` | `sv_grenade_trajectory_prac_trailtime` |
| 128 tick for practice | 64 tick with sub-tick input |

The match length is the change that bites hardest. A CS:GO scrim config sets `mp_maxrounds 30`, and CS2 happily plays thirty rounds with it - nothing errors, it is just a different game from the one everybody queues for. Change it to `24`.

The grenade trajectory cvars were reworked rather than renamed one for one. Older guides use `sv_grenade_trajectory 1` with `sv_grenade_trajectory_time`; the CS2 practice cvars carry `_prac_` in their names. Run `find grenade_trajectory` on your build to see exactly which exist, because Valve has adjusted this group more than once. The client-side preview from CS:GO is gone; the in-hand preview is now the server's `pipreview` setting.

The 128 tick question changed shape too. In CS:GO, practising smokes on 64 tick could teach you line-ups that failed on 128 tick FACEIT servers, so everyone practised at 128. CS2 servers run 64 tick by default and evaluate input between ticks, which narrows the difference, but grenade physics are still simulated per tick. If you practise on a dedicated server, run it at the tick rate you will play on - [what tick rate actually means](https://www.renode.space/blog/what-tick-rate-actually-means) explains why.

Unchanged and safe to copy across: `sv_cheats`, `sv_infinite_ammo`, `sv_showimpacts`, `sv_rethrow_last_grenade`, `mp_buy_anywhere`, `mp_buytime`, `mp_roundtime` and its variants, `mp_freezetime`, `mp_warmup_end`, `mp_restartgame`, `mp_halftime`, `mp_match_can_clinch`, `mp_pause_match`, `bot_kick`, `bot_place`, `noclip`, `getpos` and `setpos`. When a line in an old config fails, the console prints "Unknown command", and `find` with part of the name tells you whether it moved or went away.

#### Running practice on a server rather than your own game

A local practice map is fine alone. It stops being fine when five people want to throw together: on a listen server the host's game is the server, so the host's frame rate and connection are everyone's, and the session ends when they quit.

A small dedicated server solves that. It holds the practice config while nobody is on, runs at the tick rate you choose, and lets the team join by address with a password. Ten players of practice or a 5v5 at 64 tick is a light load, around 1 GB of memory and one core for vanilla CS2, more with plugins or 128 tick. Setting one up from scratch, including the Steam game server token, is in [setting up a Counter-Strike 2 server](https://www.renode.space/blog/counter-strike-2-server-setup). A private server joined by address does not need the token at all; it only matters for the public browser.

On RE:NODE the practice and scrim configs go into `game/csgo/cfg/` through the file manager, and the panel console takes `exec prac` or `mp_pause_match` directly, so nobody needs the RCON password. The [panel console guide](https://www.renode.space/guides#console) covers that screen. If the group wants practice and matches at the same time, that is two servers, because one has `sv_cheats 1` and the other must not.

#### Troubleshooting

**The console refuses a command and mentions sv_cheats.** It means what it says. Set `sv_cheats 1` on the server first, then run the config again. On a dedicated server, setting it in your own client console does nothing.

**Practice commands do nothing on a friend's or a dedicated server.** You typed server cvars into your client console. Use the server console or prefix each line with `rcon`. Only `noclip`, `give`, `setpos` and similar act on your own player.

**The round still ends after two minutes.** `mp_roundtime_defuse` is not set, or `mp_ignore_round_win_conditions` is `0` and the round ended on the bomb or kills. Set both, then `mp_restartgame 1`.

**`exec` says the file was not found.** Wrong folder or a hidden `.txt` extension. Windows hides extensions by default, so `prac.cfg` is often `prac.cfg.txt`. The file must sit in `game/csgo/cfg/`, not the older `csgo/cfg/`.

**Settings reset on map change.** The mode config runs on every map load. Exec your config again after the map loads, or put the values in `gamemode_competitive_server.cfg` on a dedicated server.

**The match ended at 16 wins, or never ended.** A CS:GO config with `mp_maxrounds 30`, or `mp_match_can_clinch 0`. Set `24` and `1`.

**The pause did not happen.** It did; it waits for the next freeze time. If it still does not take, check you sent it to the server rather than your client.

#### FAQ

##### Do CS:GO practice commands work in CS2?

Most of them. `sv_cheats`, `sv_infinite_ammo`, `sv_showimpacts`, `mp_buy_anywhere`, `noclip`, `bot_kick` and the rest of the common set are unchanged. The grenade preview and trajectory cvars were reworked, and match length changed from 30 rounds to 24, so a CS:GO config needs those lines replaced.

##### Where do I put a practice config in CS2?

In `game/csgo/cfg/` inside the Counter-Strike Global Offensive folder of your Steam library, or the same path inside a dedicated server's directory. Run it with `exec` and the file name, with or without `.cfg`.

##### How do I give myself infinite grenades in CS2?

`sv_cheats 1`, then `sv_infinite_ammo 1`. A thrown grenade stays in your hand, so you can throw the same smoke repeatedly. Add `ammo_grenade_limit_total 5` to carry one of each type at once.

##### Can friends join my practice map?

Yes, as a party on the leader's game, but the leader's machine is the server for everyone and only the leader can change cvars. For regular team practice a dedicated server with a password is steadier and keeps running when the leader logs off.

##### How do I play a private 5v5 with real competitive rules?

Exec a config with `mp_maxrounds 24`, `mp_halftime 1`, `mp_overtime_enable 1` and `mp_overtime_maxrounds 6`, then `mp_warmup_end` and `mp_restartgame 1`. Make sure `sv_cheats` is `0`, and set `sv_password` so only the ten of you can join.

##### Why does mp_pause_match not pause straight away?

By design it pauses at the start of the next round's freeze time, so the round being played finishes normally. `mp_unpause_match` resumes play.

CS2 servers on RE:NODE start at 1 GB with two port allocations, enough for a private 5v5 or a practice server with GOTV. The console takes `exec` and match commands directly, the file manager edits configs in `game/csgo/cfg/`, and your own Steam game server token goes on the Setup tab if you want a browser listing.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### Rent a CS2 server: what to check before you pay

Published 2026-10-15 by RE:NODE Team. https://www.renode.space/blog/cs2-server-rent-what-to-look-for

Renting a Counter-Strike 2 server is cheap, and most of what separates a good offer from a bad one is not on the price card. What you are paying for is a share of one fast CPU core, enough memory for the mode and plugins you run, room on disk for an install of several tens of gigabytes, a location close to your players, and full access to the files so Metamod and CounterStrikeSharp can go in. You are not paying for tick rate, because there is none to sell, and you are not paying for a token, because the Game Server Login Token has to come from your own Steam account. An offer that leans on either of those is telling you how the rest of the page was written.

This post is the buyer's side of the question. The setup itself - SteamCMD, `server.cfg`, game modes, ports - is in [Counter-Strike 2 server setup and config](https://www.renode.space/blog/counter-strike-2-server-setup), and the plugin install is in [Metamod and CounterStrikeSharp on CS2](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp). Here the question is what to check before money changes hands, and when it is better to run the thing yourself.

#### What you are actually renting

The CS2 dedicated server is free. It ships under the game's own Steam app id, `730`, anyone can download it with SteamCMD, and Valve charges nothing per server or per player. There is no licence and no slot fee upstream of the host. Everything a host charges you for is hardware and work:

- **CPU time** on a machine somebody else maintains, and in CS2 that means one main thread more than anything else.
- **Memory**, which for CS2 is the small part of the bill.
- **Disk** for an install that is large by any game-server standard.
- **A network address and ports** that the outside world can reach, plus whatever filtering sits in front of them.
- **A panel or shell access** to start, stop, update and edit the server.
- **Backups, support and someone else's on-call rota**, which is the part you notice only when it is missing.

That list is the whole comparison. When an offer talks about something that is not on it - a premium tick rate, a bundled token, a "pro league" label - it is either decoration or a misunderstanding of how the game works. Neither is a reason to pay more.

#### Tick rate: the number you cannot buy

CS:GO servers ran at 64 or 128 ticks per second, and the 128 figure became a selling point. CS2 changed the model. The server simulates at 64 tick, and player input is timestamped between ticks - the sub-tick system - so a shot is evaluated at the moment it was fired rather than at the next tick boundary. On current builds the old `-tickrate` launch argument does not raise that rate. Valve could change this in a future update, so if it matters to you, read what the server reports rather than what anyone, including this post, tells you.

What that means for buying:

- **"128 tick CS2 server" is a label.** A host advertising it has either not checked, or is counting on you not checking. It is not a reason to choose them, and charging extra for it is a red flag.
- **The things tick rate used to stand in for still matter.** A server that cannot finish each 15.6 ms tick on time because its CPU share is exhausted feels worse than any tick number. That is a CPU question, covered next.
- **Ping is not tick rate.** A smooth 64 tick server 90 ms away plays worse than the same server 20 ms away. Location is a separate decision.

[What tick rate actually means](https://www.renode.space/blog/what-tick-rate-actually-means) goes through ticks, ping, interpolation and why people blame the wrong one. For buying a CS2 server, the summary is short: ignore any tick claim, and judge the CPU and the location instead.

#### CPU: single-thread speed and an enforced share

A CS2 server does most of its work on one thread. Four slow cores do less for it than one fast one, and a plan described as "4 vCPU" can perform worse than a plan with 1.5 if the four are slices of an old, low-clocked processor shared with everybody else on the node. [Reading game server CPU usage](https://www.renode.space/blog/reading-game-server-cpu-usage-single-thread) explains why a graph at 30% can still mean a server at its limit.

What to ask of an offer:

- **What the CPU figure means.** "1 vCPU" should be a stated share - 100% of one core, or 150% of one core - not "up to". A figure with "up to" in front of it describes the best case, which you get at 4 a.m.
- **Whether the share is enforced in both directions.** A hard limit means you cannot borrow a neighbour's idle time, but it also means a neighbour cannot take yours. A soft limit feels faster in a quiet hour and worse on Saturday evening. [Shared CPU and noisy neighbours](https://www.renode.space/blog/shared-cpu-and-noisy-neighbours) covers what overselling looks like from inside.
- **Whether you can see it.** A CPU graph drawn against the limit is how you tell a busy server from a starved one. Without it, every complaint turns into a support ticket and a guess.
- **The processor generation**, if the host will say. Clock speed and generation predict CS2 performance far better than core count. A host that will not name anything about the hardware is not necessarily hiding something, but you have less to go on.

What costs CPU in CS2, roughly in order: bots, which are expensive enough that a full bot roster can cost more than the humans it replaces; plugins doing work on every tick instead of on a timer; respawn-heavy modes such as deathmatch and retakes; and GOTV, mildly. A 10-player competitive match with no bots and no plugins is the lightest thing a CS2 server does.

On RE:NODE the CPU figure is a percentage of one core and a hard throttle to the share bought - Starter is 100%, the larger tiers run up to 300% - and the panel draws CPU against that limit. A server at 100% is slow, not broken, and is never suspended for it.

#### RAM, disk and slots

Memory is rarely what limits a CS2 server, which is exactly why hosts like to price by it. A vanilla server sits comfortably in about 1 GB for ten players. CounterStrikeSharp brings a .NET runtime into the process, and with a handful of plugins on top the realistic floor becomes about 2 GB. Beyond that, the mode and the plugins decide more than the slot count does.

| Server | RAM | CPU |
| --- | --- | --- |
| 5v5 practice or scrim, vanilla | 1 GB | 1 fast core |
| 5v5 with MatchZy or similar | 2 GB | 1-1.5 cores |
| 12-16 casual or Wingman pairs | 2 GB | 1.5 cores |
| 16-24 deathmatch or retakes | 2-3 GB | 2 cores |
| Community server, many plugins | 3-4 GB | 2-3 cores |

These are starting points, not guarantees. The test is the memory graph after a busy evening with every plugin loaded, plus headroom: hosts handle the memory limit differently, and on some the server is stopped and restarted the moment it reaches the line, which on a match night is the worst outcome available.

Disk is where cheap offers quietly fall over. The CS2 server install is in the region of tens of gigabytes - figures of 40 to 60 GB are normal and it grows with updates - and SteamCMD reserves the space for an update before downloading it, so a disk with too little free does not get halfway; the update simply fails and the server will not start. Demos from GOTV and workshop maps add to that. Ask how the host counts the install against your disk limit, because the answer varies, and a plan whose stated disk is smaller than the game is either counting it differently or about to stop working on the next big patch. When it does happen, [game server disk space full](https://www.renode.space/blog/game-server-disk-space-full) covers the clean-up.

Slots themselves are set by you, on the launch line:

```bash
$ ./game/bin/linuxsteamrt64/cs2 -dedicated -usercon -port 27015 \
    -maxplayers 12 +game_type 0 +game_mode 1 \
    +sv_setsteamaccount YOUR_TOKEN +map de_inferno
```

Twelve rather than ten leaves room for an admin and for the GOTV bot, which takes a slot of its own when GOTV is on. The modes have their own natural sizes - competitive is 10, Wingman 4, deathmatch 16 to 24 - and a CS2 server can be set to far more than any mode makes sense with. That is the reason slot pricing is the trap covered further down.

#### The GSLT is yours, not the host's

A public CS2 server needs a Game Server Login Token to register with Valve's master servers, appear in the community browser and fetch workshop content reliably. You create it at `steamcommunity.com/dev/managegameservers` with app id `730`, on a Steam account that owns CS2, is not limited, and has a phone number registered. One token per running server.

The rule that matters for buying: **the token belongs to the account that created it, and so do its bans.** If a server running on a token gets that token banned, the consequences land on the Steam account behind it. That is why a host should never create one for you, and why an offer that says "GSLT included" deserves a direct question - whose account is it on, and what happens to your server if another customer on the same account gets it banned? A token on your own account, ideally a spare one that holds nothing you care about, follows you when you move hosts and cannot be taken down by somebody else's behaviour.

Without a token the server still runs, and players can still join with `connect 203.0.113.10:27015` from the console. A password-protected scrim server among friends works perfectly well that way. What it will not do is list publicly. [Steam game server tokens explained](https://www.renode.space/blog/steam-game-server-tokens-gslt) covers the account requirements, regeneration and the tokens that quietly expire after months unused.

On RE:NODE the token goes on the Setup tab. The server is built as soon as payment clears, and the install waits on that tab until the token is there - so the first thing to do after ordering is fetch it, not open a ticket asking why the server has not started.

#### Location and ping

Counter-Strike is the game where ping is felt most directly. Peeker's advantage, trades and the sense that you died behind cover all get worse as latency rises, and no setting on the server compensates for distance. Choose the location for where your players are, not for the cheapest region on the list.

- **Under about 30 ms** is what competitive players expect for practice and scrims.
- **30-60 ms** is fine for community and casual play.
- **Past 80-100 ms** a server is playable, but players will notice, and the ones furthest away will notice most.

Measure rather than guess. A host's test address or looking-glass page lets a few of your players run a ping and a traceroute in the evening, when routes are busiest. Consistency matters as much as the average: a server at 35 ms with occasional spikes to 120 plays worse than one at 45 ms that never moves. [Latency, jitter and packet loss](https://www.renode.space/blog/latency-jitter-and-packet-loss) explains what to look at, and [game server ping by region](https://www.renode.space/blog/game-server-ping-by-region) gives realistic figures between continents.

A long list of locations only helps if one of them is near your players, because you will run the server in one place. RE:NODE runs in one location, Germany, on hardware we run. That suits players across Europe and nearby regions; for a team in North America or Asia it is the wrong choice, and the honest advice is to pick a host near them.

#### Plugins, workshop maps and GOTV: the access you need

Almost everything people want from a CS2 server beyond stock matchmaking rules - MatchZy, retakes, deathmatch with custom spawns, admin menus, surf timers - runs on Metamod:Source plus CounterStrikeSharp. SourceMod does not run on CS2. Installing that stack needs things that a locked-down host may not give you:

1. **Write access to `game/csgo/`**, including `addons/` and the file `game/csgo/gameinfo.gi`, which has to be edited to add the Metamod search path. A host that exposes only a list of cvars cannot run plugins at all.
2. **SFTP or a file manager that handles archives**, because CounterStrikeSharp ships as a zip with its own runtime folder.
3. **Control over updates.** Every CS2 update rewrites `gameinfo.gi` and can break plugins until their authors rebuild them. You want to know whether the host auto-updates, when, and whether you can hold an update back or re-apply the Metamod line yourself afterwards.

```text
game/csgo/
  gameinfo.gi                 needs the Metamod line after every update
  addons/metamod/             the loader
  addons/counterstrikesharp/  runtime, plugins and configs
  cfg/server.cfg              your settings
```

**Workshop maps** load by id with `host_workshop_map <id>` or a whole collection with `host_workshop_collection <id>`. They need a working token and outbound access to Steam, and they take disk. A host that does not let you set launch arguments or run console commands makes them awkward; [CS2 workshop maps and collections](https://www.renode.space/blog/cs2-workshop-maps-and-collections) covers map groups and rotation.

**GOTV** needs a second port, UDP `27020` by default, and spare upload for the spectators. If a plan comes with one port and no way to add another, GOTV does not happen. Demos recorded with `tv_autorecord 1` accumulate in `game/csgo/`, so they also need disk and a way to download and sweep them - see [CS2 GOTV and demos](https://www.renode.space/blog/cs2-gotv-and-demos).

On RE:NODE every CS2 plan has two port allocations, so GOTV has a number of its own, plus SFTP and a file manager that unpacks archives in place. There is no whitelist of allowed mods; you upload Metamod, CounterStrikeSharp and plugins yourself, and the RCON password is generated per server rather than left blank.

#### DDoS: what a host can and cannot promise

Counter-Strike servers attract attacks for the usual reasons: a kicked player, a rival community, a stresser service that costs less than a pizza. So every host advertises protection, and the honest version of the claim is narrower than the marketing.

Filtering upstream of a server does a good job against volumetric floods - large amounts of traffic that is plainly not game traffic - along with reflection attacks and malformed packets. It does a poor job against traffic shaped to look like real clients, such as floods of connection attempts or query packets on UDP `27015`, because to a filter built for volume those look like players. [DDoS attacks on game servers explained](https://www.renode.space/blog/ddos-attacks-on-game-servers-explained) covers the categories.

What to look for in a host's claim:

- **What is filtered, in plain words**, rather than a terabit figure describing the provider's whole network.
- **What happens when filtering is not enough.** Some hosts null-route the address during a large attack to protect the rest of the network, taking your server offline until it stops. Reasonable, but worth knowing.
- **No promise of zero downtime.** A host that promises no downtime under any attack is selling you a sentence, not a service.

RE:NODE's wording is exactly this: upstream filtering that drops obvious volumetric floods, plus reflection and malformed traffic. Attacks that look like real players are not filtered. Your own part is a long RCON password - it travels in the clear over TCP on the game port - and not publishing the server address anywhere you do not need it. [Using RCON safely](https://www.renode.space/blog/rcon-safely) is short.

#### Slot pricing and other price traps

The most common trap is pricing by slot. It made some sense in the Source 1 era when the hardware was the same for everyone and slots were the only variable; for CS2 it is mostly a way to make a cheap server look expensive or an expensive one look cheap. A 10-slot competitive server and a 10-slot deathmatch server with plugins have very different costs, and a 32-slot plan that is really 1 GB and half a core will not run 32 players in any mode that matters. Translate every slot offer back into CPU share, memory and disk, and compare those.

The others, roughly in the order they cost people money:

- **A tick rate premium.** Covered above. Paying extra for 128 tick on CS2 buys nothing.
- **"GSLT included" or "no token needed".** Either the token is on the host's account, with the ban risk that implies, or the server will not list.
- **A disk smaller than the install.** Fine until the next large update, then a server that will not start.
- **The first-month price.** A discounted first month that renews at twice the rate is common. Compare the renewal price, and the price per month on a longer term if you intend to stay.
- **Setup fees and paid "control panel" add-ons** for things that should be standard: SFTP, backups, an RCON console.
- **Backups that are extra, or that live on the same machine.** A backup stored next to what it protects does not protect against losing that machine. [Backups that actually restore](https://www.renode.space/blog/backups-that-actually-restore) has the questions to ask.
- **Locations you will never use** offered as a reason to pay more.
- **No refund route.** Find out how refunds work before you need one, not after.

```diagram
title: Where a CS2 server's monthly price should come from
slots = Slot count | marketing unit
cpu = CPU share | one fast core
ram = Memory | mode and plugins
disk = Disk | install, demos, maps
price = Fair price
slots --> cpu : translate
cpu -> price
ram -> price
disk -> price
```

For a sense of scale: RE:NODE's CS2 plans start at 1 GB with 100% of a core from $7 a month and run to 6 GB, with 3, 6 and 12 month terms cheaper per month. The point is not the figure but the shape - memory, CPU and price stated per tier, no slot count, no tick rate.

#### Renting versus running it yourself

Running a CS2 server yourself is entirely possible and sometimes the better answer. The server is free, SteamCMD installs it with one command, and a modern desktop CPU runs a 10-player match without noticing. The question is what you give up.

At home, the obstacles are the usual ones for any game server, and [hosting at home versus renting](https://www.renode.space/blog/self-hosting-a-game-server-at-home-vs-renting) covers them in depth:

- **CGNAT.** Many connections no longer have a public address of their own, and port forwarding cannot fix that.
- **Upload.** Download speed is irrelevant; the server sends to every player, so upload is the side that counts, and it is shared with everyone else in the house.
- **Your home address is the server address.** Anyone who connects can see it, and an attack aimed at the server takes the household offline with it.
- **Uptime.** A server on the PC you play on exists only while it is switched on, and it competes with the game client for the same CPU.

For a private scrim on a LAN-quality connection among five friends, home hosting is fine. For anything public, it is the security problem that ends it, not the performance.

A rented virtual or dedicated server sits between the two. You get a public address, a datacentre network and a whole machine to yourself, and in return you do everything a panel host would: install with SteamCMD, open UDP `27015` and `27020` in the firewall, write a service unit so the server survives a reboot, script updates and the `gameinfo.gi` fix, set up backups and watch the disk. It makes sense when you run several servers, want root access, or have other things to run on the same machine. [Choosing between a VDS and a game panel](https://www.renode.space/blog/choosing-between-vds-and-a-game-panel) and [multiple game servers on one VDS](https://www.renode.space/blog/multiple-game-servers-on-one-vds) cover that route.

| Option | Good for | You handle |
| --- | --- | --- |
| Home PC | Private scrims, testing configs | Network, uptime, your home address |
| VDS or dedicated | Several servers, full root control | Everything: OS, updates, firewall, backups |
| Game panel host | One or a few servers, little upkeep | Configs, plugins, the token |

The panel host is the least work per server and the least control. The VDS is the most control and the most work. Neither is the wrong answer; choosing the one that matches how many hours a month you want to spend on it is the part people skip.

#### A checklist before you pay

1. **Location** close to most of your players, confirmed with a ping and a traceroute from a few of them.
2. **CPU** stated as a share of a core, enforced, and visible on a graph.
3. **Memory** for your mode and plugins - 1 GB vanilla, 2 GB with CounterStrikeSharp, more for busy community servers.
4. **Disk** large enough for the install plus updates, demos and workshop maps, with a clear answer on how the install is counted.
5. **Two ports** if you want GOTV, and the ability to set launch arguments such as `-maxplayers`.
6. **File access** through SFTP and a file manager that can edit `gameinfo.gi` and unpack archives.
7. **Your own token**, created on your own Steam account and entered by you.
8. **Backups** stored off the machine, restorable by you, and an honest DDoS description.
9. **The renewal price**, not the first-month price, and a known refund route.

If an offer passes those nine, the remaining differences are mostly taste. [How to choose game server hosting](https://www.renode.space/blog/how-to-choose-game-server-hosting) covers the parts that apply to every game.

#### FAQ

##### How much does it cost to rent a CS2 server?

For a 10-player competitive or practice server, a small plan with about 1 GB of memory and one fast core is enough, and that sits at the cheap end of any host's list. Community servers with plugins and 16-24 players need two to four times that. The server software and the token cost nothing; you pay only for hardware and upkeep.

##### Can I rent a 128 tick CS2 server?

Not in any meaningful sense. CS2 runs at 64 tick with sub-tick input timing, and on current builds the CS:GO-era `-tickrate` argument does not change that. A host selling a 128 tick CS2 server is selling a label, so compare CPU share and location instead.

##### Do I need a GSLT if I rent a server?

For a public server that appears in the browser and loads workshop maps, yes, and it must come from your own Steam account. A private server where everyone joins with `connect` and a password works without one.

##### How many slots do I need for CS2?

Competitive needs 10, Wingman 4, casual 10-20 and deathmatch 16-24. Add one for the GOTV bot if GOTV is on and one or two for admins. Buy the CPU and memory those players need rather than a slot number.

##### Will plugins work on any rented CS2 server?

Only where you can write to `game/csgo/addons` and edit `gameinfo.gi`. Plugins run on Metamod:Source and CounterStrikeSharp, not SourceMod, and they break on CS2 updates until rebuilt, so you also need control over when the server updates.

##### Is it cheaper to host CS2 at home?

On paper, often - the hardware already exists. In practice CGNAT, limited upload, an exposed home address and a PC that has to stay on make it suitable for private scrims rather than a public server.

CS2 servers on RE:NODE run in Germany from $7 a month, from 1 GB to 6 GB with a stated, enforced share of a core and a CPU graph against it. Every plan has two port allocations for GOTV, an RCON password generated per server, SFTP and backup slots; you add your own token on the Setup tab and your own plugins through the file manager.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### CS2 GOTV and demos: recording and storage

Published 2026-10-07 by RE:NODE Team. https://www.renode.space/blog/cs2-gotv-and-demos

GOTV on a Counter-Strike 2 server does two jobs: it relays a delayed live feed that spectators can connect to, and it records demos of what happened. Turn it on with `tv_enable 1` in `server.cfg`, give it its own UDP port with `tv_port`, set `tv_delay` to the number of seconds spectators should lag behind the game, and add `tv_autorecord 1` if you want a `.dem` file for every match without thinking about it. The change applies on the next map load, not instantly. Demos are written into `game/csgo/` and a full competitive map is typically 100-300 MB, so the part people forget is not recording - it is deleting. This guide covers the cvars, recording by hand and automatically, watching, and how to stop demos filling the disk.

#### What GOTV actually is

GOTV is a special spectator client that runs inside the server process. It joins as a bot named after `tv_name`, sees everything a spectator with full information would see, buffers it for `tv_delay` seconds, and then does two things with that stream: sends it to anyone connected to the GOTV port, and, if recording, writes it to disk.

That design explains most of its behaviour:

- **It starts with a map.** GOTV is created when a map loads. Setting `tv_enable 1` mid-map does nothing until the next map change or restart.
- **It is delayed for everyone.** Spectators and the recorder both see the buffered stream. A demo is not delayed relative to the game in any way that matters for review, but a live viewer sees events `tv_delay` seconds late.
- **It costs the server something.** Packaging a full snapshot for GOTV every tick and buffering it is real work. On a 10-slot server it is small; on a busy community server with spectators connected it is noticeable.
- **It may take a slot.** The GOTV bot appears in the player list. On most builds it counts against the server's player limit, so a 10-player match server with GOTV is started with room for one more.

GOTV is not a replacement for anti-cheat, but a demo is the only reliable evidence a community server has. [A CS2 competitive match server](https://www.renode.space/blog/cs2-competitive-match-server-config) shows GOTV in the context of a full match setup; this post goes deeper into GOTV itself.

#### The tv_ cvars that matter

These belong in `game/csgo/cfg/server.cfg`. Unlike `mp_` round cvars, the game mode configs do not reset them, so `server.cfg` is the right home. [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars) explains which file wins for which settings.

| Cvar | What it does | Typical value |
| --- | --- | --- |
| `tv_enable` | Turns GOTV on at the next map load | `1` |
| `tv_port` | UDP port spectators connect to | `27020` or your second allocation |
| `tv_delay` | Broadcast delay in seconds | `0` for demos only, `90`-`120` with live spectators |
| `tv_delaymapchange` | Holds the map change until the delayed stream catches up | `1` |
| `tv_autorecord` | Records every match automatically | `1` on match and scrim servers |
| `tv_maxclients` | Spectators allowed on this GOTV | `10`, or `0` to block live viewing |
| `tv_name` | The GOTV bot's name | your server name plus GOTV |
| `tv_title` | Title shown to spectators | anything |
| `tv_password` | Password for spectators | set one on a private server |
| `tv_relaypassword` | Password for other GOTV relays | set one, or leave relays unused |
| `tv_snapshotrate` | Snapshots per second sent to GOTV | leave at default unless you know why |
| `tv_maxrate` | Bandwidth cap per spectator | leave at default |

A working block for a match server:

game/csgo/cfg/server.cfg:

```cfg
tv_enable 1
tv_port 27020
tv_delay 90
tv_delaymapchange 1
tv_autorecord 1
tv_maxclients 10
tv_name "Longship GOTV"
tv_title "Longship scrims"
tv_password "spectate-only-7731"
tv_relaypassword "relay-only-1902"
```

Defaults have changed between CS:GO and CS2 and between CS2 builds, so if you want to know what a cvar is set to on your server, type its name into the console without a value; it prints the current value and the default.

> [!WARNING]
> A GOTV with no password and no delay is a live feed of every player's position. On a competitive or scrim server, anybody can connect to it and call positions to the other team. Either set `tv_delay` to 90 or more, or set `tv_maxclients 0` so GOTV records without accepting viewers.

#### Choosing the delay

`tv_delay` is the setting that gets set wrong in both directions.

| Situation | `tv_delay` | Reason |
| --- | --- | --- |
| Demos only, nobody watches live | `0` | No ghosting risk, demo is complete at map end |
| Casters or friends watching a scrim | `90`-`120` | Stops anyone feeding information back |
| Public casual server | `30`-`60` | Spectators are harmless, keep the feed fresh |
| Official-style broadcast | `105` or higher | The competitive convention |

The delay has a side effect at map end. With a 90-second delay, the last round has not been broadcast when the map ends. Without `tv_delaymapchange 1` the map changes immediately, the GOTV stream is cut, and the demo loses the final round. With it on, the server waits for the broadcast to catch up before changing map - which means players see the scoreboard longer than they expect. That is the correct trade.

A large delay also costs memory: the server buffers the whole delay window. At 90 seconds on a 10-player server this is modest; at several minutes with a full server it is worth watching on the memory graph.

#### Ports and connecting to GOTV

GOTV listens on its own UDP port. Spectators connect to it exactly like a server:

```text
connect 203.0.113.10:27020
password spectate-only-7731
```

Set the password before connecting with `password <value>` in the client console, or the connection is rejected. Spectators land in a free camera with the delayed stream and cannot interact with the game.

| Port | Protocol | Purpose |
| --- | --- | --- |
| `27015` | UDP | Game traffic and the Steam query |
| `27015` | TCP | RCON, if enabled |
| `27020` | UDP | GOTV, set by `tv_port` |

On a panel host the port numbers are whatever the server was allocated, not necessarily `27015` and `27020`. Check the Network tab for the second allocation and set `tv_port` to that exact number; a `tv_port` the server was not given is a GOTV nobody can reach. On RE:NODE every CS2 plan has two port allocations for exactly this reason - the game and GOTV each get one. [Game server ports explained](https://www.renode.space/blog/game-server-ports-explained) covers what an allocation is and how to test one from outside.

```diagram
title: Where GOTV sits inside a CS2 server
players = Players | UDP game port
game = CS2 server | live simulation
tv = GOTV client | buffers tv_delay
viewers = Spectators | UDP tv_port
demo = Demo file | game/csgo/*.dem
players <-> game
game -> tv : every tick
tv -> viewers : delayed feed
tv -> demo : tv_autorecord or tv_record
```

#### Recording demos automatically and by hand

`tv_autorecord 1` starts a recording when a match goes live and stops it when the map ends. The file name includes the date, time and map, so demos sort chronologically in the folder. For a scrim or match server this is the right setting: every match is recorded, and nobody has to remember.

Manual recording is three commands:

```text
tv_record scrim_2026-10-07_mirage
tv_stoprecord
tv_status
```

`tv_record <name>` starts a demo with that name (`.dem` is added), `tv_stoprecord` finishes it, and `tv_status` prints whether GOTV is active, how many spectators are connected and whether a recording is running. If `tv_record` complains that GOTV is not active, `tv_enable` was set after the map loaded - change map and try again.

Match plugins usually take this over. MatchZy, the common match plugin on CounterStrikeSharp, records a demo per map when the match goes live and can upload it to an HTTP endpoint when the map ends, with its own settings for the demo folder and file name format. If you run a match plugin, let it own recording and leave `tv_autorecord` off, or you can end up with two recordings of the same map. The plugin's README lists the exact setting names for the version you install.

##### What a demo contains, and what it does not

A GOTV demo contains everything the server sent to GOTV: player positions, view angles, weapons, grenades, chat and the scoreboard. It is a server-side recording, so it shows where players really were rather than what one client saw. That makes it good for reviewing suspected cheating and for tactical review.

It does not contain voice by default, and it is not a video. To share a clip, someone plays the demo in the client and records the screen.

#### Watching demos

Copy the `.dem` file into the client's `game/csgo` folder, then in the console:

```text
playdemo scrim_2026-10-07_mirage
demoui
demo_timescale 2
demo_gototick 64000
```

`playdemo` loads it (no extension needed), `demoui` opens the playback controls, `demo_timescale` changes speed, and `demo_gototick` jumps to a tick - at 64 tick, one minute is 3,840 ticks. Demos recorded on one CS2 version usually play on the next, but large updates have broken playback of older demos before. If a demo matters - a ban appeal, a tournament dispute - review it promptly rather than six months later.

#### Using demos to settle a cheating report

The most valuable thing a demo does on a community server is turn "he is obviously cheating" into something you can look at. A routine that keeps it fair:

1. Note the time, map and suspect's name when the report comes in. With `tv_autorecord` on, that identifies the demo file.
2. Download the demo once the map has ended, never while it is still being written.
3. Watch the suspect in first person at normal speed for several rounds, then at half speed around the suspicious moments. Look at where the crosshair sits before an enemy is visible, not at the kill itself.
4. Switch to a free camera and watch what the suspect could actually see. A pre-aim through a wall is only suspicious if there was no sound, no teammate call and no common angle to explain it.
5. Ask a second admin to watch it without telling them your conclusion.

Write down the tick numbers for the moments that matter, so the next reviewer can jump straight there with `demo_gototick`. Ban appeals become a short conversation when the reply is "watch tick 41,200 and tell me what you see". Keep the demo as long as the ban stands. Server-side demos are much harder to argue with than a player's own client recording, which is the whole reason to run GOTV on a server that does not care about spectators. [Server rules, moderation and staff](https://www.renode.space/blog/server-rules-moderation-and-staff) covers the human side of handling reports.

#### Casting, tournaments and larger audiences

A single GOTV accepts up to `tv_maxclients` spectators, and every one of them is served by the game server itself. For a scrim with two casters and a coach, that is fine. For an audience of hundreds it is not, because spectator traffic competes with the match for the server's CPU and network.

Two mechanisms exist for scaling out. Relays are additional GOTV instances that connect to the master GOTV - authenticated with `tv_relaypassword` - and re-serve the stream to their own spectators, so the game server only feeds one relay rather than a crowd. And GOTV can broadcast over HTTP with the `tv_broadcast` family of cvars, which is how large tournament broadcasts deliver the in-game spectator feed through ordinary web infrastructure. Both have changed between CS:GO and CS2 and are aimed at organisers with their own infrastructure; if you are running a league, read Valve's current documentation for them rather than any blog post, this one included.

For a community tournament, the practical answer is simpler: one GOTV with a 90-second delay and a password shared with the casters, plus a streamer showing the cast on a video platform. Viewers watch the stream, not the server, and the match server only feeds a handful of spectators.

#### Storage: size, retention and cleanup

Demos are written next to the game files in `game/csgo/` unless a plugin puts them elsewhere. They are not compressed on disk.

| What | Rough size at 64 tick |
| --- | --- |
| One competitive map, MR12, 10 players | 100-300 MB |
| One evening of three scrim maps | 0.5-1 GB |
| A month of nightly scrims | 15-30 GB |
| A public casual server with `tv_autorecord` on | grows every map, all day |

That last row is the trap. On a public server running all day, `tv_autorecord 1` records every map, and the disk fills in days. Either turn it off on public servers and record by hand when there is a reason, or have a strict cleanup routine.

A cleanup routine that works on any host:

1. Decide a retention period - two to four weeks is plenty for a community server.
2. Download the demos you want to keep before that window closes; match demos worth keeping belong on storage you control, not on the game server.
3. Delete the rest. With the file manager, sort by date and remove in bulk; over SFTP, a script on your own machine can list and delete files older than the window.
4. Check free disk after each update day. CS2 updates are large, and a disk nearly full of demos is the most common reason an update fails halfway.

On RE:NODE the file manager and SFTP both work for this, and the Schedules tab can run console commands, backups and power actions on a cron expression - useful for a restart, but it does not run shell commands, so file deletion stays manual or goes through a plugin that uploads and removes demos. Backups of a CS2 server should not include gigabytes of old demos either; clear them before a manual backup so the slot holds the configuration and plugins you actually need. [SFTP and the file manager](https://www.renode.space/blog/sftp-and-the-file-manager) has the connection details.

> [!TIP]
> If a plugin uploads demos to an HTTP endpoint after each map, check that the uploads actually arrive before you start deleting local copies. An upload URL with a typo fails quietly, and the first time you notice is the day you need a demo.

#### Troubleshooting

**No demo was recorded.** `tv_enable` was set after the map loaded, so GOTV never started. Put it in `server.cfg`, change map, and check `tv_status`.

**The demo is missing the last round.** `tv_delaymapchange` is off and the delay is above zero, so the map changed before the broadcast caught up. Turn it on.

**Spectators cannot connect to GOTV.** `tv_port` does not match the port the server was allocated, the port is not open, or a password is set and the spectator did not enter it. Check the Network tab and the console line GOTV prints at map load.

**The server is full one player early.** The GOTV bot is taking a slot. Raise `-maxplayers` by one.

**A demo will not play.** It was recorded on an older CS2 version, or it was copied while still being written. Wait for the map to end before downloading, and review important demos soon after.

**The disk is full and the server will not update.** Old demos. Delete them, then run the update again. [What to do when your game server keeps restarting](https://www.renode.space/blog/why-your-game-server-keeps-restarting) covers what a failed update loop looks like from the outside.

#### FAQ

##### Where are CS2 GOTV demos saved?

In `game/csgo/` inside the server install, named with the date, time and map when `tv_autorecord` is on, or the name you gave `tv_record`. Match plugins can write them to another folder; check the plugin's demo path setting.

##### Does GOTV make the server laggier?

A little. GOTV packages a snapshot every tick and buffers the delay window, which costs some CPU and memory. On a 10-player match server it is not noticeable; on a busy public server with many spectators it can be, and `tv_maxclients` caps that part.

##### Should tv_delay be 0 or 90?

0 if nobody watches live and you only want demos. 90 or more if anyone can spectate during a match, because a zero-delay spectator can pass positions to a team.

##### Can I record a demo without GOTV?

Not server-side. Players can record their own client-side demo with `record <name>` in their console, but that only shows their view and network state. For a fair record of a match, GOTV is the tool.

##### How long should I keep demos?

Long enough to settle disputes - two to four weeks for a community server. Keep tournament and ban-related demos indefinitely, but on storage you control rather than on the game server.

Every CS2 plan on RE:NODE has two port allocations, so GOTV gets its own number next to the game port, and demos can be downloaded through the file manager or SFTP. Backup slots come with every plan, stored off the machine they protect, for the configs worth keeping.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### CS2 retakes and deathmatch servers

Published 2026-10-07 by RE:NODE Team. https://www.renode.space/blog/cs2-retakes-and-deathmatch-servers

A Counter-Strike 2 retakes server needs a plugin - CS2 has no built-in retakes mode - and the plugin most servers run is cs2-retakes on CounterStrikeSharp, usually paired with a weapon allocator so players get sensible loadouts without buying. A deathmatch server can be stock: `+game_alias deathmatch` gives you Valve's deathmatch with respawns and bonus weapons, and a handful of `mp_` cvars turn it into free-for-all or a longer warm-up server. Plugins come in when you want things stock DM cannot do - headshot-only, weapon restrictions, your own spawn points. Both modes are the busiest kind of CS2 server per player, because something is always spawning, dying or being thrown, so size them a step above a casual server with the same slot count.

#### What each mode is, and what it costs

Retakes simulates the end of a round. Every round starts with the bomb already planted on one site, a few terrorists defending it, and a slightly larger counter-terrorist team coming in to retake. Rounds last under a minute, nobody buys, and you play thirty rounds of the most important situation in competitive Counter-Strike in the time a match plays ten. It is the most popular practice format after deathmatch, and it fills well because the queue moves quickly.

Deathmatch is warm-up as a server: instant respawn, everyone fighting, scoring by kills. Valve's mode is team-based by default with bonus weapons; communities run free-for-all, rifle-only, pistol-only and headshot-only variants on top.

| Server | Typical slots | RAM | CPU | Why |
| --- | --- | --- | --- | --- |
| Retakes, 9-10 players | 10 | 1.5-2 GB | 1.5 cores | Short rounds, few entities |
| Retakes with allocator and stats | 10-12 | 2 GB | 1.5-2 cores | Database writes each round |
| Deathmatch, 12-16 | 16 | 2 GB | 1.5-2 cores | Constant respawns and spawn checks |
| Deathmatch, 20-24 | 24 | 2-3 GB | 2 cores | Respawn churn is the cost |
| Either, plugin-heavy community server | any | 3-4 GB | 2-3 cores | Depends entirely on plugins |

CS2 servers are bound by CPU clock speed long before memory, and both of these modes keep the main thread busy - deathmatch especially, where random spawn selection runs line-of-sight checks for every respawn. [CS2 server setup](https://www.renode.space/blog/counter-strike-2-server-setup) covers the base install and token, and [CPU vs RAM for game servers](https://www.renode.space/blog/cpu-vs-ram-for-game-servers) explains why a bigger memory number does not fix a busy CPU.

#### The plugin layer both modes share

Anything beyond stock deathmatch runs on Metamod:Source with CounterStrikeSharp on top. SourceMod does not run on CS2, so CS:GO retakes and deathmatch plugins - splewis's retakes, the old DM plugins - are not an option; everything has been rewritten in C#.

```text
game/csgo/addons/
  metamod/                     the loader
  counterstrikesharp/
    plugins/
      RetakesPlugin/           one folder per plugin
      RetakesAllocator/
    configs/
      plugins/                 per-plugin config files
      admins.json              CounterStrikeSharp admins
```

Each plugin unpacks into its own folder under `plugins/`, writes a config file on first start, and is reloaded with `css_plugins reload <name>` or a map change. The full installation, including the `gameinfo.gi` line that every CS2 update reverts, is in [Metamod and CounterStrikeSharp on CS2](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp). Do that first and confirm `meta list` and `css_plugins list` both show what you expect before adding a mode on top.

> [!WARNING]
> Every CS2 update can break CounterStrikeSharp and the plugins built against it until they are rebuilt. A retakes server that updated overnight and now runs plain competitive rounds has not lost its config; its plugins did not load. Keep a copy of the working `addons` folder and do not update a plugin-driven server on patch day.

#### Setting up a retakes server

##### The retakes plugin

cs2-retakes handles the round logic: choosing a bombsite, spawning players in positions around it, giving the bomb to a terrorist and planting it at round start, balancing teams by score, and queuing players beyond the player limit as spectators. It does not decide what weapons players get - that is the allocator's job, or a basic built-in fallback depending on version.

What it needs to work:

1. **Spawns for every map.** Retakes spawns are not the map's normal spawn points; they are positions around each bombsite, stored per map in the plugin's map config files. The plugin ships with spawn files for the popular competitive maps. For anything else - a new Valve map, a Workshop map - an admin has to create spawns in-game with the plugin's edit commands, walking to each position and adding a CT or T spawn for site A or B, plus planter spawns for the terrorists.
2. **A defuse map.** Retakes needs bombsites. Load maps the usual way; [CS2 workshop maps and collections](https://www.renode.space/blog/cs2-workshop-maps-and-collections) covers Workshop ones.
3. **Its own round rules.** The plugin sets the cvars it depends on and expects to be the only thing managing rounds. Do not run it alongside a match plugin, and remove `mp_` values from your mode override file that fight it - especially round time and freeze time.

Commands and config keys change between plugin releases, so read the README for the version you installed. The pattern is stable: a config file under `configs/plugins/`, an edit mode for spawns, and console messages naming each map's spawn file as it loads.

##### Adding spawns for a new map

Writing spawns is the one retakes job that cannot be skipped or automated, and doing it badly is what makes a server feel amateur. A routine that works:

1. Load the map on an empty server with only you connected, and enter the plugin's spawn edit mode.
2. For each bombsite, add terrorist spawns where a real defender would hold - behind cover, on site, in the common post-plant positions - and at least one planter spawn on the site itself.
3. Add counter-terrorist spawns at the entrances a real retake would come from, spread across at least two of them so every round is not a stack through one door.
4. Aim for more spawns than players on each side, so the same positions do not repeat every round.
5. Save, change map and back, then play a handful of rounds with a friend on each side before opening it to the public.

The most common mistake is putting counter-terrorist spawns in sight of a defender's spawn. The round starts with a free kill and players leave. Walk every pair of spawns and check the sight lines before you call the map done.

##### Team sizes and the queue

Retakes is played with a small numbers advantage for the retaking side, because the defenders have the bomb planted and position. The classic arrangement is four terrorists against five counter-terrorists with ten slots, scaling down for fewer players. The plugin calculates this from the number of active players and a ratio in its config.

Players over the maximum wait in a queue and rotate in. On a busy server the queue is what makes it feel fair - nobody sits out for long - and the value in `-maxplayers` should be a few above the active maximum so queued players have a slot.

##### The weapon allocator

The allocator gives each player a loadout at round start based on the round type and their own preferences. cs2-retakes-allocator is the common choice: it picks a round type - pistol, half-buy or full-buy, by percentage - and lets players choose their preferred guns per round type with a chat command or menu. Preferences are stored in a database, by default a local SQLite file, with MySQL-compatible databases supported for networks of servers.

Settings worth looking at in its config:

- **Round type percentages.** The default leans toward full-buy rounds. Raise pistol rounds if your players want variety.
- **AWP rules.** How many AWPs per team per round, and whether players must opt in. This single setting decides whether the server feels like practice or like an AWP lottery.
- **Utility.** Which grenades each side gets. Retakes with full utility is a different game from retakes with a flash each; pick deliberately.
- **Database.** For a single server, the SQLite default is fine. For several, point them at one database; each game plan on RE:NODE comes with a database slot whose host, user and password are generated in the panel - confirm the allocator supports its engine first.

```diagram
title: A retakes round from start to finish
queue = Queue | spectators waiting
retakes = cs2-retakes | site, spawns, plant
alloc = Allocator | loadouts per round type
db = Database | player preferences
round = Live round | under a minute
queue -> retakes : active players
retakes -> alloc : round start
alloc <-> db
alloc -> round : weapons given
round -> retakes : winner, rebalance
```

#### Setting up a deathmatch server

Stock deathmatch is a single launch argument:

```bash
$ ./game/bin/linuxsteamrt64/cs2 -dedicated -maxplayers 16 \
    +game_alias deathmatch +sv_setsteamaccount <token> +map de_mirage
```

That gives Valve's deathmatch: ten-minute maps, team-based scoring, instant respawn, free weapons from the buy menu, and periodic bonus weapons that score extra. Rules go in `game/csgo/cfg/gamemode_deathmatch_server.cfg`, which you create, because Valve's `gamemode_deathmatch.cfg` runs after `server.cfg` and sets the round cvars back on every map load. [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars) explains the order.

game/csgo/cfg/gamemode_deathmatch_server.cfg:

```cfg
mp_timelimit 15
mp_teammates_are_enemies 1
mp_randomspawn 1
mp_randomspawn_los 1
mp_respawn_immunitytime 2
mp_dm_bonus_length_max 0
mp_dm_bonus_length_min 0
mp_dm_time_between_bonus_max 9999
mp_dm_time_between_bonus_min 9999
mp_death_drop_gun 0
mp_buy_anywhere 1
mp_buytime 9999
```

| Cvar | What it changes |
| --- | --- |
| `mp_teammates_are_enemies` | `1` makes it free-for-all: everyone can damage everyone |
| `mp_randomspawn` | `1` spawns players at random points; `0` uses team spawns |
| `mp_randomspawn_los` | `1` avoids spawning in sight of an enemy, where the map allows |
| `mp_respawn_immunitytime` | Seconds of spawn protection |
| `mp_dm_bonus_length_*` | Length of the bonus weapon window |
| `mp_dm_time_between_bonus_*` | Gap between bonus windows; large values effectively disable it |
| `mp_death_drop_gun` | Whether dead players drop their weapon |
| `mp_timelimit` | Minutes per map |

Most community DM servers turn the bonus weapon off - it rewards picking up a gun you did not choose, which is the opposite of practice - and turn free-for-all on, because team deathmatch with spawn protection mostly means shooting at the wrong people. Default values have shifted between builds, so check any cvar you care about by typing its name in the console.

##### Deathmatch plugins

Stock DM cannot do headshot-only, restrict weapons properly, give each player a fixed loadout, or use custom spawn points. A deathmatch plugin can. CS2 Deathmatch for CounterStrikeSharp is the widely used one; it supports multiple modes rotated on a timer (for example rifles, then pistols, then headshot-only), weapon restrictions per mode, a spawn editor, and its own respawn logic. When you install one, it takes over from Valve's deathmatch rules, and the plugin's documentation says which `game_alias` it expects - usually `deathmatch` or `custom`. Running a DM plugin on top of conflicting cvars in your override file produces strange results, so empty `gamemode_deathmatch_server.cfg` back to the essentials and configure modes in the plugin.

#### Maps for each mode

Retakes needs proper defuse maps with good spawns, and the stock competitive pool is where most retakes servers stay. Valve adds and removes maps from the active duty pool, and the retakes spawn files follow the popular ones, so a map recently added by Valve may have no spawns until somebody writes them.

Deathmatch works on almost anything, but plays best on maps with many open lanes and a decent number of spawn points: Mirage, Dust II and Inferno are the usual rotation. Small aim maps with deathmatch rules make a good warm-up server. Avoid large maps with long rotations; random spawns on a big map means half the time is walking.

For either mode, use the end-of-map vote or a map plugin with a short, fixed list. Players on a practice server want the maps they play in matchmaking, not variety.

#### Admin, abuse and keeping it fair

Practice servers attract two problems: people who spawn-camp in DM and people who refuse to play the round in retakes. Plugins handle some of it - spawn protection, AFK kicks, team balance by score - and an admin plugin handles the rest. [CS2 plugins](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp) lists admin options; keep the admin list short and give moderators only kick and mute.

Two server-side settings help without any plugin:

game/csgo/cfg/server.cfg:

```cfg
mp_autokick 1          // kick for team damage and team kills
sv_kick_ban_duration 15 // minutes a kicked player is banned for
```

In retakes, team damage is real and a frustrated player can ruin rounds; `mp_autokick` handles the worst of it. In free-for-all DM, team damage rules do not apply because everybody is an enemy.

Panel access is separate from in-game admin. On RE:NODE, subusers can be given console access without files or billing, which is the right level for someone who restarts the server when a plugin hangs. [Subusers and least privilege](https://www.renode.space/blog/subusers-and-least-privilege) covers how to split it.

#### Troubleshooting

**Retakes rounds play as normal competitive rounds.** The plugin did not load. Run `css_plugins list`; if it is missing, check the CounterStrikeSharp log for the error, usually a version mismatch after a CS2 update.

**Players spawn in the wrong places or inside walls on one map.** That map's spawn file is missing or was written for an older version of the map. Re-create spawns with the edit commands.

**Nobody gets weapons in retakes.** The allocator is not installed or failed to connect to its database. Check its log line at start.

**Deathmatch settings reset on every map.** They are in `server.cfg`. Move `mp_` values into `gamemode_deathmatch_server.cfg`.

**Players spawn in front of each other in DM.** Too few spawn points for the player count, or random spawns are off. Enable `mp_randomspawn_los`, reduce slots, or use a plugin with custom spawns.

**The server stutters when it fills.** Check the CPU graph against the plan's limit. If it is pinned, the server is being throttled; reduce slots or plugins, or move up a plan. On RE:NODE a server at 100% CPU is slow, not suspended, and changing plan does not rebuild the server. [Reading a server load graph](https://www.renode.space/blog/reading-a-server-load-graph) covers the general diagnosis.

#### FAQ

##### Does CS2 have a built-in retakes mode?

No. Retakes on CS2 community servers is always a plugin, almost always cs2-retakes on CounterStrikeSharp, with a separate weapon allocator. Valve's built-in modes are casual, competitive, wingman, deathmatch, arms race and demolition.

##### How do I make a free-for-all deathmatch server?

Run `+game_alias deathmatch` and set `mp_teammates_are_enemies 1` in `gamemode_deathmatch_server.cfg`. Turn on `mp_randomspawn 1` so players do not spawn in team clusters.

##### Can I run headshot-only deathmatch without a plugin?

Not reliably. Stock CS2 has no supported headshot-only cvar for public servers. A deathmatch plugin with a headshot-only mode is the clean way, and it can rotate it with other modes on a timer.

##### How many players should a retakes server have?

Nine or ten active players is the classic size, four or five defenders against five retakers. More than that and the bombsite gets crowded; fewer still works, and the plugin scales the teams down.

##### Do retakes plugins work on workshop maps?

Yes, once spawns exist for the map. The plugin ships spawns for popular competitive maps; for a Workshop map an admin creates them in-game with the plugin's edit commands, which takes ten to twenty minutes per map.

CS2 servers on RE:NODE come with the install handled, an RCON password generated per server, two port allocations and a database slot for allocator or stats plugins. Metamod, CounterStrikeSharp and your plugins go in through the file manager or SFTP, and a backup slot keeps the working setup safe before each update.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### CS2 surf, bhop and KZ server setup

Published 2026-10-07 by RE:NODE Team. https://www.renode.space/blog/cs2-surf-bhop-kz-servers

A Counter-Strike 2 movement server is a normal CS2 server with the round logic switched off and a handful of movement cvars changed. For surf, that is mostly `sv_airaccelerate` raised from its default of 12 to somewhere around 100-150, stamina removed and players respawning forever. For bunnyhop, add `sv_enablebunnyhopping 1` and usually `sv_autobunnyhopping 1`. KZ is the odd one out: serious KZ communities run a dedicated Metamod plugin that replaces the movement rules rather than nudging cvars. On top of any of them sits a timer plugin, which needs zones per map and somewhere to store records. The server itself is light - movement servers spend their CPU on player physics, not on bullets - but they are fussier about configuration than a public defuse server, because a single wrong cvar changes how every map plays.

#### Surf, bhop and KZ: what each one needs

The three are often lumped together and they want different things from the server.

| Mode | Core mechanic | What the server changes | Plugin needed |
| --- | --- | --- | --- |
| Surf | Gaining speed by strafing on angled ramps | High air acceleration, no stamina, no fall damage | Timer, optional |
| Bhop | Chaining jumps without losing speed | Bunnyhopping enabled, often auto-hop, high air acceleration | Timer, optional |
| KZ | Precise climbing and jumping, measured jumps | Movement rules closer to CS:GO, often a separate mode system | Usually a KZ plugin |

Surf and bhop are cvar modes: a stock server with the right configuration and a surf map is playable surf, and the timer is a layer on top. KZ is a plugin mode: you can play KZ maps on a stock server, but the community expects the movement, checkpoints, jumpstats and records a KZ plugin provides, and its players notice immediately when they are missing.

All three depend on maps built for them, almost all of which come from the Workshop. [CS2 workshop maps and collections](https://www.renode.space/blog/cs2-workshop-maps-and-collections) covers loading them; the short version is a public collection per mode and `host_workshop_collection` on the launch line.

#### Requirements and sizing

Movement servers are cheap to run per player. There is no hit registration under load, no grenade physics, few entities, and players spread across a map rather than crowding one choke point. What costs is player count and the timer's database writes.

| Server | RAM | CPU | Notes |
| --- | --- | --- | --- |
| Surf or bhop, up to 16 players | 1-2 GB | 1 core | Most community servers |
| Surf or bhop, 24-32 players | 2-3 GB | 1.5-2 cores | Large maps, many replays |
| KZ with plugin and records, 16-24 | 2 GB | 1.5 cores | Jumpstats and checkpoints are light |
| Any of the above with replay bots | add 0.5-1 GB | add 0.5 core | Replays are the expensive feature |

Replay bots - ghost runs of the current record - are the feature that turns a light server into a moderate one. Each replay is stored movement data replayed through a bot, which costs memory for the recording and CPU for the bot. If the server drags with replays on and is fine without, that is the answer.

Disk matters more than memory if you run several collections: surf maps are often large, and a collection of thirty of them is several gigabytes on top of the base install.

#### The movement cvars

These go in `game/csgo/cfg/server.cfg`, or better, in a mode-specific config you `exec` from it so you can switch a server from surf to bhop by changing one line. The defaults below are those of current CS2 builds; check any of them on your own build by typing the cvar name with no value in the console, which prints the current value and default.

| Cvar | CS2 default | Surf | Bhop | What it does |
| --- | --- | --- | --- | --- |
| `sv_airaccelerate` | `12` | `100`-`150` | `100`-`1000` | Acceleration while airborne |
| `sv_enablebunnyhopping` | `0` | `1` | `1` | Removes the speed cap on landing |
| `sv_autobunnyhopping` | `0` | `0` or `1` | `1` | Holding jump hops on landing |
| `sv_staminamax` | `80` | `0` | `0` | Stamina system; `0` removes it |
| `sv_staminajumpcost` | `0.08` | `0` | `0` | Speed lost per jump |
| `sv_staminalandcost` | `0.05` | `0` | `0` | Speed lost per landing |
| `sv_falldamage_scale` | `1` | `0` | `0` | Fall damage multiplier |
| `sv_maxvelocity` | `3500` | `3500` or higher | `3500` | Hard ceiling on any speed |
| `sv_accelerate` | `5.5` | default | default | Ground acceleration |
| `sv_friction` | `5.2` | default | default | Ground friction |
| `sv_gravity` | `800` | default | default | Gravity |

cfg/surf.cfg:

```cfg
sv_airaccelerate 150
sv_enablebunnyhopping 1
sv_autobunnyhopping 0
sv_staminamax 0
sv_staminajumpcost 0
sv_staminalandcost 0
sv_falldamage_scale 0
sv_maxvelocity 3500
```

The two numbers people argue about are `sv_airaccelerate` and auto-hop. Air acceleration of 150 is the common surf value; 100 feels heavier and 1000 is effectively instant air control, which makes many surf maps trivial. For bhop, auto-hop is the choice between a mode about strafing (auto-hop on) and a mode about timing the jump key (auto-hop off, often with scroll-wheel jumping). Pick one per server and say which in the server name; a mismatched expectation is the most common complaint movement servers get.

> [!WARNING]
> Several movement cvars have been flagged as cheat-protected, hidden or changed in behaviour at different points in CS2's life. If a cvar seems to have no effect, check whether it requires `sv_cheats` on your build. Do not turn `sv_cheats 1` on for a public server to work around it - it unlocks every cheat command for every player. Use a plugin that sets the value instead.

##### Why CS2 movement feels different from CS:GO

Surf and bhop veterans notice that CS2 movement does not feel like CS:GO's at the same cvar values. Part of it is sub-tick input: jumps and strafes are timestamped between ticks rather than snapped to them, which changes the feel of perfectly timed hops. Part of it is that CS2 runs at 64 tick and the `-tickrate` launch argument is not honoured, so the 102.4 and 128 tick servers some movement communities ran in CS:GO are not available. That is not something a host can change. [What tick rate actually means](https://www.renode.space/blog/what-tick-rate-actually-means) explains why the tick number is a smaller part of the feel than it seems.

Some Metamod plugins exist specifically to adjust movement behaviour that cvars cannot reach - for example removing the ground speed limit that clips pre-speed. They work by patching the game binary in memory, so they are the first thing to break after a CS2 update.

#### Round settings that turn off the game

A movement server should never end a round, buy a weapon or count a team score. On top of the movement cvars, it needs the round machinery neutralised. Running with `game_alias custom` or `casual` and these settings is the usual base:

cfg/movement_rounds.cfg:

```cfg
mp_freezetime 0
mp_roundtime 60
mp_timelimit 30
mp_ignore_round_win_conditions 1
mp_respawn_on_death_ct 1
mp_respawn_on_death_t 1
mp_autoteambalance 0
mp_limitteams 0
mp_solid_teammates 0
mp_death_drop_gun 0
mp_buytime 0
mp_warmuptime 0
sv_full_alltalk 1
```

`mp_ignore_round_win_conditions 1` is the important one: it stops the round ending when one team is empty, which on a movement server is always. `mp_solid_teammates 0` lets players pass through each other, which matters at the start zone where everyone stacks. `mp_timelimit` decides how long a map runs before the vote, and on a surf server thirty minutes is short for a hard map and long for an easy one - many communities settle on 30-45.

Remember the game mode config runs after `server.cfg` on each map load. If your round settings keep resetting, `exec` your movement config from the mode's override file - `gamemode_casual_server.cfg` on a casual server, which you create beside Valve's `gamemode_casual.cfg` - or let the timer plugin set them on map start - most do. [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars) covers the execution order in detail.

#### Timer plugins, zones and records

A timer is what turns a surf map into a competition: a start zone, an end zone, a time, a leaderboard, and usually stages, checkpoints and replays. On CS2 every timer runs on Metamod:Source, and most on CounterStrikeSharp above it - SourceMod timers from CS:GO do not run. [Metamod and CounterStrikeSharp on CS2](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp) covers installing the stack.

What to look for in a timer:

- **Mode support.** Some timers do surf, bhop and KZ-style maps with per-map settings; others do one. SharpTimer is a widely used CounterStrikeSharp timer covering surf, bhop and KZ maps. Check the project's page for which CS2 build it currently supports before installing.
- **Zone handling.** Zones are the boxes that start and stop the timer. Good timers read zones from the map's own triggers where the mapper named them conventionally, and let an admin draw zones in-game for maps that did not. Zones are stored per map, in a file or the database.
- **Storage.** Records need to persist across restarts. Small servers can use a local SQLite file; anything with more than one server, or a web leaderboard, wants a networked database. Each game plan on RE:NODE includes a database slot created from the panel with a generated host, user and password - check that the timer supports the engine before relying on it.
- **Replays.** Optional, and the most expensive feature. Turn it on once the rest works.

```diagram
title: What a surf or bhop server is made of
players = Players | strafing and hopping
srv = CS2 server | movement cvars
mm = Metamod:Source | addons/metamod
css = CounterStrikeSharp | .NET plugin host
timer = Timer plugin | zones, times, replays
db = Database | records and zones
players -> srv : UDP 27015
srv -> mm : gameinfo.gi entry
mm -> css
css -> timer
timer <-> db : per run
```

##### KZ: the plugin is the mode

KZ communities organised early around CS2KZ, a Metamod plugin from the KZ global team that implements KZ movement modes, checkpoints, jumpstats and a connection to a global records service. It is not a CounterStrikeSharp plugin, and it replaces a lot of the cvar tuning above with its own mode settings. If you want your server's runs to count on global leaderboards, the plugin's own documentation lists the requirements - typically an approved server, an unmodified plugin, and its own API key. A KZ server that only wants local records can skip the global side entirely.

#### Maps, collections and per-map settings

Surf maps carry a tier, usually 1 to 6 or 1 to 8, and a server's reputation is mostly its map list. A good public surf server runs mostly tier 1-3 maps with a few harder ones, because the players who are new will leave a tier 5 map in a minute. Bhop and KZ have their own difficulty scales, and the same principle holds: one server for beginners and one for regulars works better than one server that frustrates both.

Some maps were built for different movement settings - a surf map designed around air acceleration 100 plays differently at 150, and some bhop maps assume a specific gravity. Most timers support per-map cvar overrides; otherwise a per-map config is the engine way:

```text
game/csgo/cfg/maps/surf_example.cfg
```

Many plugins and some builds exec a config named after the map on load; if yours does not, the timer's per-map settings are the reliable route.

Map votes on movement servers usually show the map tier next to the name. Rock-the-vote plugins for CounterStrikeSharp accept a map list with names and Workshop ids, and some timers integrate their own nomination menu.

#### Performance and network

The CPU profile of a movement server is unusual: low per-player cost, but sensitive to frame time, because the whole game is precise movement. A server whose frame time spikes once a minute is invisible on a defuse server and ruins a bhop chain. Things that cause spikes:

- **Database writes on the main thread.** A timer that writes a record synchronously stalls the server for as long as the query takes. Use a timer that writes asynchronously, keep the database close, and do not run a big leaderboard query on every map start.
- **Replays.** Recording and playing back runs is real work. Cap the number of replay bots.
- **Disk-heavy logging.** Some timers log every zone touch. Turn verbose logging off once it works.
- **Map changes.** Loading a big surf map is a stall regardless. Keep the map list sensible and avoid scheduled restarts during peak hours.

On a plan that buys a fixed CPU share, the honest check is the console's CPU graph against the limit while the server is full. If it sits at the ceiling, the server is throttled and movement will feel inconsistent; on RE:NODE that is slow rather than dangerous, and a server at 100% is never suspended for it, but it is a reason to trim plugins or move up a plan. [CPU vs RAM for game servers](https://www.renode.space/blog/cpu-vs-ram-for-game-servers) has the general rule.

Network use per player is similar to any CS2 server. Players on high latency notice it more on movement maps than anywhere else, because their own movement is predicted locally and corrected by the server - high jitter shows up as being pulled back on a ramp. [Latency, jitter and packet loss](https://www.renode.space/blog/latency-jitter-and-packet-loss) explains how to tell a bad route from a busy server.

#### Troubleshooting

**Players slide off ramps or stop dead on surf.** Usually a map problem rather than a server one: some CS2 ports have collision issues on ramp seams. Try the same spot on another map. If it happens everywhere, check `sv_airaccelerate` and that no plugin is resetting movement cvars on map start.

**Bhop speed is capped at around 300.** `sv_enablebunnyhopping` is `0`, or a mode config reset it after `server.cfg` ran. Check the live value in the console after the map loads, not the file.

**The timer does not start.** No zones for this map. Draw them with the timer's admin menu, or check whether the map uses the trigger names the timer expects.

**Records vanished after a restart.** The timer was writing to a local file that was replaced, or to a database it could not reach and silently fell back. Check the plugin log at start for its database connection line.

**Rounds keep ending.** `mp_ignore_round_win_conditions` is off, or the game mode config overrode it. Exec your round config after the mode config.

**Everything broke after a CS2 update.** Metamod's line in `gameinfo.gi` was reverted, and movement plugins that patch memory need new builds. Restore the line, then wait for plugin updates before reopening. Keep a backup of the working `addons` folder - [what to do when a mod update breaks](https://www.renode.space/blog/what-to-do-when-a-mod-update-breaks) has the general routine.

#### FAQ

##### What sv_airaccelerate should a CS2 surf server use?

150 is the common public value and a safe default. 100 gives heavier air control that some veterans prefer; values far above that make most maps easy. Pick one and keep it, since records set at one value are not comparable with another.

##### Can I run a 128 tick surf or KZ server in CS2?

No. CS2 runs at 64 tick with sub-tick input and ignores the `-tickrate` launch argument. Movement feels different from CS:GO for that reason and because of the sub-tick system, and no hosting setting changes it.

##### Do I need a plugin for a surf server?

Not to play. The cvars above and a surf map give you playable surf. A timer plugin adds times, zones and records, which is what keeps players coming back, so most servers add one once the basics work.

##### Should auto-bunnyhopping be on?

For a public bhop server, usually yes: it makes the mode about strafing rather than about scroll-wheel timing, and new players stay longer. Many experienced communities run a separate server with it off. State the choice in the server name.

##### Will my CS:GO SourceMod timer work on CS2?

No. SourceMod does not run on CS2. Timers have been rewritten for Metamod and CounterStrikeSharp, and records from a CS:GO database do not carry over without a conversion tool from the timer's authors.

##### How many players can a surf server handle?

The game allows up to 64 slots, but most surf servers run 16-32 because maps get crowded and replays cost more with more players. Size by the CPU graph when full rather than by slot count.

CS2 on RE:NODE starts at 1 GB with the install and updates handled, two port allocations, an RCON password generated per server, and a database slot for timer records. Upload Metamod, CounterStrikeSharp and your timer through the file manager or SFTP, and keep the working setup in a backup slot.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### CS2 workshop maps on a dedicated server

Published 2026-10-07 by RE:NODE Team. https://www.renode.space/blog/cs2-workshop-maps-and-collections

A Counter-Strike 2 server loads community maps by their Steam Workshop id, not by file name. `host_workshop_map <id>` downloads one map and starts it; `host_workshop_collection <id>` turns a whole Workshop collection into the server's map pool, and `ds_workshop_changelevel <name>` moves between the maps in it. Players do not install anything - the CS2 client fetches the map from the Workshop as it connects. Almost everything that goes wrong comes from four places: a missing or invalid game server token, a collection that is not public, a map name typed differently from the one the server knows, and a disk that fills up as the collection grows. This guide covers each of those, plus how to build a rotation that survives a restart.

#### How workshop maps reach a CS2 server

In CS:GO you could still drop a `.bsp` into the `maps` folder and load it by name. CS2 maps are packed `.vpk` files compiled for Source 2, and the supported way to get a community map onto a dedicated server is the Workshop. The server asks Steam for the item, downloads it into its own Workshop cache, mounts it, and then loads the map inside it. The client does the same thing from its side when it connects.

That design has three consequences worth holding on to:

- **The id is the map.** A Workshop item id is a long integer from the item's URL (`?id=3070596702`). The map's internal name, such as `de_cache`, is only known once the item has been downloaded.
- **Steam must trust the server.** Workshop downloads go through the server's Steam login, which on a public server is the Game Server Login Token. A server with no token, an expired token, or a banned one usually reports the problem as "the map would not download" rather than as a token error. [Steam game server tokens](https://www.renode.space/blog/steam-game-server-tokens-gslt) explains how to issue and replace one.
- **Updates follow the author.** When the author publishes a new version, the server picks it up the next time it loads the map. That is convenient for bug fixes and occasionally painful when an update breaks spawns the night before a tournament.

| Command | Takes | What it does |
| --- | --- | --- |
| `host_workshop_map` | a map's item id | Downloads (or updates) one map and changes to it |
| `host_workshop_collection` | a collection's id | Downloads every map in the collection and uses it as the map pool |
| `ds_workshop_listmaps` | nothing | Prints the names of the maps in the current collection |
| `ds_workshop_changelevel` | a map name | Changes to a map from the collection by its name |
| `changelevel` | a map name | Changes to a stock map; not for Workshop maps |

#### Running a single workshop map

The simplest case is one map, for example a practice server that only ever runs an aim map, or a scrim on a map Valve has removed from the official pool. Put the command on the launch line in place of `+map`:

```bash
$ ./game/bin/linuxsteamrt64/cs2 -dedicated -port 27015 +game_alias competitive \
    +sv_setsteamaccount <token> +host_workshop_map 3070596702
```

On the first start the console shows the download progress, then the map loads. On later starts the server checks the item, finds it current, and loads straight away. The same command typed into the console of a running server downloads and switches in one go, which is the quickest way to test a map before committing to it.

On a panel host you do not write the full line. The launch arguments are built from the fields on the Startup tab, and the token sits on its own field; the Workshop command either goes in a startup field if the template provides one, or is typed into the console once the server is up. On RE:NODE the CS2 install itself is run for you and waits on the Setup tab until you paste your own token, which is also the token Workshop downloads use - so a server with a correct token has no extra Workshop step to configure.

> [!TIP]
> Before adding a map to anything permanent, load it with `host_workshop_map` on an empty server, walk both spawns and both bombsites, and run `ds_workshop_listmaps` or `status` to read its real internal name. Ten minutes here saves a broken rotation later.

#### Running a collection as the map pool

A collection is a Workshop page that lists other items. Create one from any map's Workshop page ("Add to collection"), add the maps you want, set its visibility to **public**, and copy its id from the URL. A private or friends-only collection is the most common reason a server starts with nothing.

```bash
$ ./game/bin/linuxsteamrt64/cs2 -dedicated +game_alias casual \
    +sv_setsteamaccount <token> +host_workshop_collection 3123456789
```

On start the server downloads every map in the collection before loading the first one. With a dozen maps of a few hundred megabytes each, the first boot can take several minutes, and the console will show one download after another. That is normal. Restarts after that only download items that changed.

Once it is running, find out what the server thinks the maps are called:

```text
ds_workshop_listmaps
ds_workshop_changelevel de_cache
```

`ds_workshop_listmaps` prints the map names, and `ds_workshop_changelevel` takes one of those names. Names are not always what the Workshop title suggests - a map titled "Cache" might be `de_cache`, `de_cache_cs2` or something the author invented - so copy them from the output rather than guessing.

Historically, loading a collection on a Source dedicated server needed a Steam Web API key passed with `-authkey`, and CS2 has changed its behaviour around this more than once since release. If a collection refuses to load while single maps from it load fine, generate a key under your Steam account's Web API page, add `-authkey <key>` to the launch line, and try again. Check the current state in Valve's CS2 dedicated server notes before you build a large rotation around collections - single-map loading has been the stable path throughout.

##### Choosing which map the server starts on

When a collection loads, the server picks the first map itself. If you want a specific starting map, the reliable method is to let the server start, then change to the map you want with `ds_workshop_changelevel` from a console command or a scheduled task. Some launch scripts combine `+host_workshop_collection` with `+host_workshop_map` to set the starting map; that worked on some builds and not others, so test it on your version rather than relying on it.

#### Map rotation: the engine, the map group and plugins

CS2 has three overlapping ways to decide what plays next, and a server with workshop maps needs to pick one deliberately.

1. **Collection as map group.** When the server runs a collection, the end-of-match map vote (`mp_endmatch_votenextmap 1`) and the next-map logic draw from the collection's maps. This is the zero-configuration route and the one most small community servers use.
2. **`mapcycle.txt` and `gamemodes_server.txt`.** These are the engine and Valve-layer rotation files, covered in [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars). They work well for stock maps. For Workshop maps their behaviour is less predictable - a map group entry needs the map to be resolvable by name, and that depends on it already being downloaded. Treat them as a stock-map tool.
3. **A map plugin.** Rock-the-vote and nomination plugins for CounterStrikeSharp keep their own map list, usually a name plus the Workshop id for each entry, and change maps with the Workshop commands themselves. This is how most busy community servers rotate, because it gives players a vote and gives you a list you can edit without touching the collection.

The cvars that matter whichever route you pick:

game/csgo/cfg/server.cfg:

```cfg
mp_match_end_changelevel 1   // change map when the match ends
mp_endmatch_votenextmap 1    // show the next-map vote at match end
mp_match_end_restart 0       // do not replay the same map
mp_timelimit 30              // minutes per map on modes that use it
mp_maxrounds 16              // rounds per map; the mode config may override
```

Remember that the game mode config is executed after `server.cfg` on every map load and overrides any round cvars it also sets. If your `mp_maxrounds` keeps resetting on a casual server, put it in the mode's own override file instead - `gamemode_casual_server.cfg` for casual, which runs last. [Metamod and CounterStrikeSharp](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp) covers installing the plugin layer if you go the third route.

```diagram
title: How a workshop map gets from the Workshop to a player
ws = Steam Workshop | item or collection
server = CS2 server | GSLT login
cache = Workshop cache | .vpk on disk
map = Loaded map | ds_workshop_changelevel
client = Player | downloads on connect
ws -> server : host_workshop_*
server -> cache
cache -> map
client <-> ws : fetches same item
client -> map : joins
```

#### Building a collection that behaves

A collection is a server configuration you keep on Steam, so it deserves the same care as `server.cfg`.

- **Keep it small.** Ten to fifteen maps is plenty for one community. Every map costs disk on the server and a download for every new player, and a forty-map collection means most maps are never voted for.
- **Own the collection.** Make it under an account your community controls, not a moderator's personal account. If they leave and delete it, the server starts with nothing.
- **Watch for map updates.** Subscribe to the items yourself so Steam tells you when an author publishes a change. An updated map is fetched the next time it loads; a broken update is fixed by removing it from the collection until the author fixes it.
- **Prefer maintained maps.** Many maps were ported quickly when CS2 launched and have not been touched since. A port with missing clip brushes or broken lighting looks fine in screenshots and plays badly.
- **Separate by mode.** A surf collection, an aim collection and a defuse collection on three servers beat one mixed collection where the vote offers a surf map to a defuse crowd. [Surf, bhop and KZ servers](https://www.renode.space/blog/cs2-surf-bhop-kz-servers) and [retakes and deathmatch servers](https://www.renode.space/blog/cs2-retakes-and-deathmatch-servers) each have their own map habits.

#### Disk, first boot and the Workshop cache

Workshop content lives inside the server's install, in its own `steamapps/workshop` tree (the exact path has moved between CS2 builds, so search for the `content/730` folder rather than trusting a guide). Each map is one or more `.vpk` files plus its metadata. Sizes vary enormously: a small aim map can be tens of megabytes, a detailed defuse map several hundred.

| Collection | Typical extra disk | First boot |
| --- | --- | --- |
| 1-3 aim or practice maps | under 500 MB | under a minute |
| 10-15 defuse maps | 2-5 GB | several minutes |
| 30+ mixed maps | 8 GB and up | long enough to look like a hang |

The base CS2 install is already large, so a big collection on a small plan runs out of disk long before it runs out of memory. When the disk fills during a download the server usually fails in an unhelpful way - a map that "does not exist", or an update that cannot be applied - so check free space first whenever Workshop behaviour suddenly changes. Removing a map from the collection does not delete it from the cache; clear old item folders by hand with the server stopped if space is tight. [Steam Workshop mods on dedicated servers](https://www.renode.space/blog/steam-workshop-mods-on-dedicated-servers) explains the cache layout and why first boots time out across games.

Memory is a smaller concern. A loaded map adds to the server's working set while it is the current map, but CS2 does not hold the whole collection in memory, so a ten-map rotation costs roughly what the largest map in it costs.

#### Changing maps on a schedule

A common request is "aim map in the afternoon, defuse maps in the evening" or "always start on the same map after the nightly restart". Both are console commands on a timer.

```text
ds_workshop_changelevel de_cache
host_workshop_map 3070596702
```

On RE:NODE the Schedules tab runs a cron expression against an ordered list of tasks - a console command, a backup or a power action, with delays between them - so a nightly restart followed two minutes later by `ds_workshop_changelevel` on your preferred map is one schedule. On your own machine the same thing is an RCON client in cron. [Cron expressions explained](https://www.renode.space/blog/cron-expressions-explained) covers the syntax, and [restart schedules that help](https://www.renode.space/blog/restart-schedules-that-help) covers when a restart is worth having at all.

Do not schedule map changes while people are playing a match. A change mid-round ends it for everyone, and a scheduled task does not know a scrim is on. Pick an hour when the server is reliably empty, or have the schedule print a warning with `say` a few minutes before.

#### Troubleshooting workshop maps

**The server starts on a stock map and ignores the collection.** The collection is private or friends-only, or the id is of a single map rather than a collection. Open the id in a logged-out browser; if you cannot see it, neither can the server.

**"Failed to download" or the download never starts.** Token first: check the boot log for the Steam login and make sure the token is valid and not already used by another running server. Then check free disk. Then try one map from the collection with `host_workshop_map` to separate a collection problem from a download problem.

**`ds_workshop_changelevel` says the map was not found.** The name is wrong. Run `ds_workshop_listmaps` and copy the exact name; names are case-sensitive and often carry suffixes.

**`changelevel de_mymap` fails for a Workshop map.** `changelevel` looks for stock maps. Use `ds_workshop_changelevel` for collection maps or `host_workshop_map` with the id.

**Players are kicked or stuck downloading.** The client cannot reach the Workshop item, usually because the item was hidden, removed or made private by its author. The server may still have a cached copy, which is why it loads for you and not for them. Replace the map.

**The map updated and now spawns or bombsites are broken.** The author's update. Remove the item from the collection, change map, and wait for a fix. If you need that exact version, there is no supported way to pin an old Workshop revision; keep a note of maps that have bitten you before.

**Plugins crash on a Workshop map but not on stock maps.** Some plugins read map-specific config files by name and do not expect the folder structure Workshop maps use. Check the plugin's documentation for how it names Workshop maps, and look in its log for the map name it actually saw.

#### FAQ

##### Do players need to subscribe to my workshop maps?

No. The CS2 client downloads the map from the Workshop when it connects to a server running it. Subscribing in advance only saves them the download wait on first join, which is worth suggesting for large maps.

##### Can I upload a map file to the server instead of using the Workshop?

For CS2, the Workshop is the supported route. Loose map files for Source 2 are not loaded the way CS:GO's `.bsp` files were, and anything that works by copying files around tends to break on the next update. Publish the map to the Workshop, even as unlisted for testing, and load it by id.

##### How many workshop maps can a server run?

There is no small fixed limit, but disk and download time set a practical one. Ten to fifteen maps keeps the first boot short and the map vote meaningful. Past thirty, most maps are never picked and every restart after an author update is slower.

##### Why did a map change without me touching anything?

Its author published an update and the server fetched it when the map next loaded. Workshop maps always track the latest version; if a particular map keeps changing under you, replace it with a better-maintained one.

##### Does a workshop map need a different game mode?

Often, yes. Surf, KZ, aim and arena maps expect custom or casual rules and frequently a plugin. Load the map with the matching `game_alias` - usually `custom` or `casual` - and the plugin the map was built for, or players will find a defuse round timer running on a surf map.

CS2 servers on RE:NODE come with the install and updates handled, an RCON password generated per server and two port allocations, and the Workshop works as soon as your own token is on the Setup tab. Map changes and restarts can run from the Schedules tab, and backup slots are on every plan.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### CS2 competitive match server with MatchZy

Published 2026-09-21 by RE:NODE Team. https://www.renode.space/blog/cs2-competitive-match-server-config

A match server is a public server with the fun taken out of it. No vote to change map, no auto team balance quietly moving your entry fragger, no warm-up ending because the timer ran out while one player was still installing an update. What it has instead is a config it goes live with, a way to pause, a demo of everything that happened, and a round-by-round backup so that a crash in round 19 costs five minutes rather than the match.

The short version: put your match rules in a `live.cfg` that nothing else overwrites, run the evening with MatchZy rather than by hand, record GOTV from the first round, and turn on the engine's own round backups before you need them. The rest of this is the detail, including the practice server the same group will want by the second week.

#### What a match server has to do that a public server does not

| Requirement | How it is met |
| --- | --- |
| Identical rules every time | One `live.cfg`, execed at go-live, not scattered across files |
| Wait for ten people | Warm-up with a frozen timer and a ready-up system |
| Decide sides fairly | A knife round, then stay or switch |
| Stop the clock | Tactical timeouts and an admin pause |
| Prove what happened | GOTV recording from round one |
| Survive a crash | Round backups on disk, restored into the live match |
| Keep strangers out | A password, or a plugin whitelist of the ten Steam ids |

Nothing on that list is exotic, and most of it exists in the engine. The reason people install a plugin is not capability, it is that doing it by hand means an admin typing eleven commands in the right order while nine people wait, and one typo restarting the game at 12-7.

```diagram
title: A match night, from warm-up to the demo
warmup = Warm-up | ready up, whitelist
knife = Knife round | stay or switch
live = Live | live.cfg, MR12
backup = Round backups | one file per round
demo = GOTV demo | .dem on disk
warmup -> knife : everyone ready
knife -> live
live -> backup : every round
live -> demo : tv_autorecord
```

#### The match config

This is the file the server execs the moment it goes live. Keep it as `game/csgo/cfg/live.cfg` and exec it explicitly; do not rely on `server.cfg`, because the game mode config runs after `server.cfg` on every map load and will undo half of it. That ordering trap is explained in [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars), and it is the reason match configs exist as separate files at all.

game/csgo/cfg/live.cfg:

```cfg
// Format: MR12 with MR3 overtime
mp_maxrounds 24
mp_halftime 1
mp_halftime_duration 15
mp_overtime_enable 1
mp_overtime_maxrounds 6
mp_overtime_startmoney 12500
mp_match_can_clinch 1
mp_match_end_restart 0
mp_match_restart_delay 15
mp_endmatch_votenextmap 0

// Economy
mp_maxmoney 16000
mp_startmoney 800
mp_afterroundmoney 0
mp_playercashawards 1
mp_teamcashawards 1

// Round
mp_freezetime 15
mp_roundtime 1.92
mp_roundtime_defuse 1.92
mp_roundtime_hostage 1.92
mp_buytime 20
mp_buy_anywhere 0
mp_free_armor 0
mp_death_drop_gun 1
mp_death_drop_grenade 2
mp_death_drop_defuser 1
mp_friendlyfire 1
mp_solid_teammates 1

// No interference
mp_autoteambalance 0
mp_limitteams 0
mp_autokick 0
mp_forcecamera 1
mp_timelimit 0
mp_team_intro_time 0

// Timeouts
mp_team_timeout_time 30
mp_team_timeout_max 4
mp_team_timeout_ot_add_each 1
mp_team_timeout_ot_max 1

// Voice
sv_full_alltalk 0
sv_deadtalk 1

// Safety
sv_cheats 0
mp_warmup_pausetimer 0
```

A few of those are worth a sentence. `mp_maxrounds 24` is MR12, which is what CS2 competitive settled on; a league still running MR15 wants `30` and `mp_overtime_maxrounds 6` either way. `mp_match_can_clinch 1` ends the match at 13-4 instead of playing out rounds nobody needs. `mp_autokick 0` stops the server removing a player for idling during a tactical pause, which is a genuinely bad evening. `mp_team_intro_time 0` skips the introduction cinematic CS2 plays before the first round. And `mp_forcecamera 1` limits dead players to spectating their own team, which is the difference between a scrim and an honour system.

Team names go in `mp_teamname_1` and `mp_teamname_2`, with two-letter codes in `mp_teamflag_1` and `mp_teamflag_2`. They appear on the scoreboard and, more usefully, in the GOTV demo six months later when you cannot remember who played.

#### Warm-up, the knife round and going live by hand

You should let a plugin do this. But you should know what it is doing, because when the plugin misbehaves at 20:55 you will be doing it by hand.

Warm-up first. `mp_warmuptime 300` with `mp_warmup_pausetimer 1` gives an unlimited warm-up: the clock displays but never runs down, so nobody is rushed and nobody has to keep restarting it. `mp_warmup_end` ends it when you are ready.

The knife round is a config plus two commands:

game/csgo/cfg/knife.cfg:

```cfg
mp_startmoney 0
mp_maxmoney 0
mp_free_armor 0
mp_give_player_c4 0
mp_ct_default_primary ""
mp_ct_default_secondary ""
mp_ct_default_melee "weapon_knife"
mp_t_default_primary ""
mp_t_default_secondary ""
mp_t_default_melee "weapon_knife"
mp_death_drop_gun 0
mp_death_drop_grenade 0
mp_buytime 0
mp_buy_anywhere 0
mp_freezetime 10
mp_roundtime 5
mp_roundtime_defuse 5
mp_maxrounds 1
mp_warmup_end
mp_restartgame 1
```

The winning team then chooses. If they stay, exec `live.cfg` and `mp_restartgame 3`. If they switch, run `mp_swapteams` first, then the same two steps. Announce it in chat three times so nobody can claim they were reading Discord, because the first round of a live match played by one team who thought it was still knife is the oldest argument in Counter-Strike.

> [!TIP]
> Always exec the live config and then restart the game, in that order. Restarting first and then execing leaves money and round counters from the knife round in place, and the score will be off by one before anybody notices.

#### MatchZy: the plugin that runs the evening

MatchZy is a CounterStrikeSharp plugin, so it needs Metamod:Source and CounterStrikeSharp underneath it - [CS2 plugins with Metamod and CounterStrikeSharp](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp) is the install. Once it is loaded, the evening runs from chat.

| Command | Who | Effect |
| --- | --- | --- |
| `.ready` / `.unready` | Players | Ready up. The match starts when enough are ready |
| `.forceready` | Admin | Starts anyway |
| `.knife` | - | Knife round, then `.stay` or `.switch` from the winner |
| `.pause` / `.unpause` | Players | Pause at the end of the round, resume when both agree |
| `.tac` | Players | Tactical timeout, counted against the team's allowance |
| `.stop` | Players | Restore the current round. Both teams must agree |
| `.restore <round>` | Admin | Restore any round from its backup file |
| `.map <name>` | Admin | Change map without leaving match mode |
| `.score` | Anyone | Current score and series state |

MatchZy ships its own configs under `game/csgo/cfg/MatchZy/` - a warm-up config, a knife config and a live config - which means you edit `cfg/MatchZy/live.cfg` rather than the file you wrote above, and the plugin execs it at the right moment. Its own settings are convars prefixed `matchzy_` in the same folder; the one you will change first is the number of ready players required to start. Names do shift between releases, so read the version you downloaded rather than a two-year-old blog post.

For anything more organised than a pickup game, MatchZy loads a match definition as JSON, either from a file on the server or from a URL:

match.json:

```json
{
  "matchid": "renode-scrim-014",
  "num_maps": 1,
  "players_per_team": 5,
  "skip_veto": true,
  "maplist": ["de_mirage"],
  "team1": {
    "name": "Longship",
    "players": { "76561198012345678": "anna" }
  },
  "team2": {
    "name": "Drakkar",
    "players": { "76561198087654321": "jan" }
  }
}
```

Loading that config puts the server in match mode with the right map, the right team names and a whitelist: only the listed Steam ids can join, and each is placed on their team automatically. For a best-of-three, set `num_maps` to `3` and list three maps. This is also the hook a Discord bot or a small web page would use to set up matches without anyone touching the console.

#### GOTV and demos

GOTV is a spectator relay and a demo recorder in one, and the recorder is the half that matters. Turn it on before the match, not after somebody asks for the clip.

in server.cfg:

```cfg
tv_enable 1
tv_port 27020
tv_autorecord 1
tv_delay 0
tv_delaymapchange 1
tv_maxclients 8
tv_name "Longship GOTV"
tv_password ""
tv_relaypassword ""
tv_snapshotrate 32
```

`tv_autorecord 1` starts a demo on every match and writes it to disk when the map ends; `tv_record <name>` and `tv_stoprecord` do it manually. `tv_delay` is the broadcast delay in seconds, and it is the setting people get wrong in both directions: `0` is right for a demo-only server with nobody watching live, and something like `90` to `120` is right if spectators are connected to GOTV, because a zero-delay spectator is a ghosting accusation waiting to happen. `tv_delaymapchange 1` holds the map change until the delayed broadcast has caught up, so the last round is not cut off.

Spectators connect to the GOTV port rather than the game port, which is the reason a CS2 server needs two port allocations rather than one. Demos are written into `game/csgo/` with the date and map in the name, and a full MR12 map is a couple of hundred megabytes at 64 tick and more at 128, so a busy scrim server fills its disk in weeks rather than months. Two habits fix that: download the demos you care about, and put a scheduled task on the server that deletes anything older than a month. [Scheduled tasks worth having](https://www.renode.space/blog/scheduled-tasks-worth-having) covers the pattern; on RE:NODE the Schedules tab runs a cron expression against a console command, so the cleanup is a job you set once.

Watch a demo by putting it in the client's `csgo` folder and running `playdemo <name>`, or by connecting to `<address>:27020` while the match is live.

#### Round backups and restoring after a crash

The engine writes a full snapshot of the match at the start of every round if you let it, and almost nobody turns it on until the first time they need it.

```cfg
mp_backup_round_auto 1
mp_backup_round_file "match"
mp_backup_restore_load_file "match_round12.txt"
```

With `mp_backup_round_auto 1` the server writes one small text file per round into `game/csgo/`, holding the score, the money, the equipment and the sides. `mp_backup_restore_load_file <file>` loads one back and the match continues from the start of that round with everybody's economy intact. It works after a crash, after a restart, and after a round that has to be replayed because somebody's game closed during the buy.

MatchZy sits on top of this with `.stop`, which restores the current round when both teams type it, and `.restore <round>` for an admin. The plugin's files and the engine's files are not the same thing, so if you are running MatchZy use its commands rather than mixing the two.

Round backups also change how you think about crashes. If the container hits its memory limit it is stopped and restarted clean rather than left swapping, which sounds brutal until you compare it with fifteen minutes of a server crawling. With backups on, that restart costs the time it takes to reconnect and type one command. Without them it costs the match. The same argument applies to backups of the server itself - see [backups that actually restore](https://www.renode.space/blog/backups-that-actually-restore), which is about the discipline rather than the button.

#### A practice server for the same group

The second thing a team asks for is somewhere to throw smokes. It is the same server software with almost the opposite config, and it needs `sv_cheats 1`, which is why it must never be the public one.

game/csgo/cfg/prac.cfg:

```cfg
sv_cheats 1
mp_limitteams 0
mp_autoteambalance 0
mp_maxmoney 60000
mp_startmoney 60000
mp_afterroundmoney 60000
mp_buytime 60000
mp_buy_anywhere 1
mp_freezetime 0
mp_roundtime 60
mp_roundtime_defuse 60
mp_respawn_on_death_t 1
mp_respawn_on_death_ct 1
mp_death_drop_gun 0
mp_death_drop_grenade 0
sv_infinite_ammo 1
ammo_grenade_limit_total 5
mp_ct_default_grenades "weapon_hegrenade weapon_flashbang weapon_smokegrenade weapon_incgrenade weapon_decoy"
mp_t_default_grenades "weapon_hegrenade weapon_flashbang weapon_smokegrenade weapon_molotov weapon_decoy"
sv_grenade_trajectory_prac_pipreview 1
sv_grenade_trajectory_prac_trailtime 8
sv_showimpacts 1
sv_showimpacts_time 8
bot_quota 0
bot_stop 1
sv_full_alltalk 1
mp_warmup_end
mp_restartgame 1
```

The grenade trajectory and impact cvars are the point of the whole file: trajectories draw the line a nade took and leave it there for `sv_grenade_trajectory_prac_trailtime` seconds, and `sv_showimpacts` marks where bullets actually landed against where the client thought they did. `sv_rethrow_last_grenade` re-throws the last grenade from the same spot and is worth binding to a key. `noclip` needs `sv_cheats 1`, which it now has.

MatchZy has a practice mode of its own, which is the tidier route if it is already installed: it sets this up, adds spawn and timer commands, and puts the server back afterwards. Running practice and matches on the same server is fine as long as somebody remembers to exec the live config; running them at the same time is not, so if the group is large enough to want both at once, that is two servers.

#### Sizing, tick rate and the network

A ten-player CS2 server with GOTV recording is not heavy. What makes it heavy is 128 tick, which roughly doubles CPU per player, and CounterStrikeSharp, which brings a .NET runtime into the process.

| Setup | Memory | CPU |
| --- | --- | --- |
| 5v5, 64 tick, vanilla, GOTV | 1 GB | 1 core |
| 5v5, 64 tick, MatchZy and one or two plugins | 2 GB | 1.5 cores |
| 5v5, 128 tick, MatchZy, GOTV recording | 2-3 GB | 2 cores |
| Practice server, 128 tick, heavy grenade work | 2 GB | 2 cores |

Tick rate is the argument worth settling early. CS2 timestamps inputs at sub-tick resolution, so hit registration is far less tick-dependent than it was in CS:GO, and the honest case for 128 tick now rests on grenade and movement simulation rather than on whether your shots land - [what tick rate actually means](https://www.renode.space/blog/what-tick-rate-actually-means) has the measurement. If your team practises line-ups at 128 and plays officials at 128, match at 128. Otherwise 64 with headroom beats 128 at the CPU ceiling.

The thing that decides how a scrim feels is not the tick rate, it is the distance between the ten players and the box. Everyone within one region of the server and nobody on wifi beats every config file on this page. [Latency, jitter and packet loss](https://www.renode.space/blog/latency-jitter-and-packet-loss) is how to tell which of the three is ruining a particular player's evening, and jitter is usually the answer.

#### Troubleshooting

**The match starts at 0-0 but the money is wrong.** The live config was execed after the restart instead of before it. Exec, then `mp_restartgame 1`.

**Rounds end at 1:55 on one map and something else on another.** You set `mp_roundtime` but not `mp_roundtime_defuse` and `mp_roundtime_hostage`. The specific ones win on the map types they name.

**The server changes map after the match.** `mp_match_end_restart` or `mp_endmatch_votenextmap` is on. Both should be `0` on a match server.

**Nobody can connect to GOTV.** The GOTV port is not allocated or not open. It is a separate UDP port from the game port, and on a panel host it must exist as an allocation before `tv_port` can bind it.

**The demo is missing after a crash.** GOTV writes the file when recording stops. A hard crash mid-map loses it. This is exactly what round backups are for, and it is an argument for a scheduled restart between sessions rather than one long-lived process.

**Players are auto-balanced onto the wrong team.** `mp_autoteambalance 1` and `mp_limitteams` are doing it. Both belong at `0` in a match config.

**A pause cannot be lifted.** Some pause commands need both teams, some need an admin. With MatchZy, `.unpause` from the other team, or an admin with the right flag.

#### FAQ

##### What is the standard CS2 competitive match format?

MR12: `mp_maxrounds 24`, first to 13, sides swapped at 12 rounds with `mp_halftime 1`. Overtime is MR3 with `mp_overtime_maxrounds 6` and $12,500 of starting money, repeated until somebody wins.

##### Do I need MatchZy, or can I run a match with configs?

You can run one with configs. What you lose is the ready-up system, the knife-round automation, timeouts that count themselves, and round restore in one command. For a regular team the plugin pays for itself the first time somebody disconnects in round 19.

##### Where are GOTV demos saved?

In the game directory, `game/csgo/`, named with the date and map when `tv_autorecord` is on. Download them through the file manager or over SFTP. They are large, so delete or archive them on a schedule rather than when the disk fills.

##### Can I run a practice server and a match server on one plan?

Not at the same time on one server, because practice needs `sv_cheats 1` and a match must not have it. You can switch one server between the two with configs, or run two small servers, which is what most teams end up doing.

##### How do I stop strangers joining a scrim?

Set `sv_password` and give it to the ten people, or load a MatchZy match config, which whitelists the Steam ids in it and rejects everyone else. The password is simpler; the whitelist also puts people on the correct team.

##### Does 128 tick make my shots register better in CS2?

Much less than it did in CS:GO. Sub-tick timing means the server evaluates a shot at the moment it was fired rather than at the next tick. Grenade physics and movement still run per tick, which is the remaining real argument for 128.

Two port allocations come with every CS2 plan on RE:NODE, so the game port and GOTV both have one, and you can add more on the Network tab. The console takes `mp_backup_restore_load_file` with tab completion, the Schedules tab clears old demos on a cron expression, and backup slots are included on every tier.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### CS2 plugins: Metamod and CounterStrikeSharp

Published 2026-09-21 by RE:NODE Team. https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp

The first thing to know about Counter-Strike 2 plugins is the thing that stops most people on day one: SourceMod does not work. Ten years of SourcePawn plugins, every `.smx` you ever downloaded, the admin menu you know by heart - none of it runs on Source 2. CS2's plugin stack is Metamod:Source in its Source 2 line, and on top of that CounterStrikeSharp, which hosts plugins written in C# against .NET. The ecosystem is younger, smaller and rebuilt from scratch, and it is where every serious CS2 community server now lives.

This post is the install, the admin configuration, the plugins that are worth the disk, and the part nobody writes down: what breaks when Valve ships an update, and how to be back online in ten minutes rather than a weekend.

#### What runs on CS2, and what does not

| Thing | Status on CS2 |
| --- | --- |
| Metamod:Source, 2.x line | Works. This is the foundation |
| Metamod:Source 1.11 / 1.12 | Source 1 only. Wrong engine |
| SourceMod and `.smx` plugins | Does not run. No Source 2 support |
| CounterStrikeSharp | Works. C# plugins on .NET 8 |
| CS2Fixes and other native Metamod plugins | Work, written in C++ against Metamod directly |
| Valve server plugin interface (`plugin_load`) | Not a practical route on Source 2 |

Two consequences. First, if a guide tells you to drop something into `addons/sourcemod/plugins`, it is a CS:GO guide and the rest of it is wrong too. Second, when you look for a plugin that does something specific, you are looking at GitHub releases rather than a plugin directory - there is no package manager, no in-panel installer, and no curated index. You download a zip, you read who wrote it, and you unpack it yourself.

A plugin runs as native code inside the server process with no sandbox. It can read every file the server can read, open sockets, and run for as long as it likes inside a game tick. Treat installing one the way you would treat running a script as root, because that is the actual privilege level. [Keeping a modded server clean](https://www.renode.space/blog/keeping-a-modded-server-clean) is the general version of this argument.

```diagram
title: How a C# plugin ends up inside CS2
engine = CS2 server | Source 2
gameinfo = gameinfo.gi | adds a search path
mm = Metamod:Source | addons/metamod
vdf = counterstrikesharp.vdf | Metamod loads it
css = CounterStrikeSharp | .NET 8 host
plugin = Your plugin | MatchZy.dll
engine -> gameinfo
gameinfo -> mm : read at startup
mm -> vdf
vdf -> css
css -> plugin : scans plugins/
```

#### Installing Metamod:Source

Metamod is a loader. On its own it changes nothing about the game; it gives other code a supported way to sit between the engine and the game module.

1. Get a Metamod:Source build from the 2.x development line on the AlliedModders site. The stable 1.x downloads are for Source 1 games and will not load. Take the Linux package if your server is Linux, which on a panel host it is.
2. Unpack it so that the archive's `addons` folder lands in `game/csgo/`. You should end up with `game/csgo/addons/metamod/` containing `metaplugins.ini` and a `bin` folder.
3. Edit `game/csgo/gameinfo.gi`. Find the `SearchPaths` block and add one line above the existing `Game csgo` entry:

game/csgo/gameinfo.gi:

```text
		SearchPaths
		{
			Game_LowViolence	csgo_lv
			Game	csgo/addons/metamod
			Game	csgo
			Game	core
```

4. Restart the server and type `meta version` in the console.

The `gameinfo.gi` edit is the whole trick, and it is also the single most common reason a working server stops loading plugins. That file belongs to the game, so a `validate` run or a large update replaces it and your line disappears. Nothing errors; Metamod simply is not there any more, plugins do not load, and the server looks fine. If plugins vanish after an update, check `gameinfo.gi` before you check anything else.

```text
] meta list
Listing 1 plugin:
  [01] CounterStrikeSharp (1.0.xxx) by roflmuffin
```

`meta list` is the proof that Metamod loaded and the list of what it loaded. An empty list with a version banner means Metamod is running and has nothing to load. No response at all means `gameinfo.gi` is wrong or the build is the Source 1 one.

#### Installing CounterStrikeSharp

CounterStrikeSharp is a Metamod plugin that hosts a .NET runtime and exposes the game to C#. Its releases come in two shapes: one that bundles the .NET runtime and one that expects .NET 8 to be installed on the machine. On a container-based host take the bundled build - you do not control what is installed on the node, and the bundled build is a few hundred megabytes of disk rather than a support ticket.

1. Unpack the release into `game/csgo/` so `addons/counterstrikesharp/` appears next to `addons/metamod/`.
2. Confirm `addons/metamod/counterstrikesharp.vdf` exists. That file is what tells Metamod to load it.
3. Restart. `meta list` should now show CounterStrikeSharp, and `css_plugins list` should answer.

The tree you are aiming for:

```text
game/csgo/addons/
  metamod/
    metaplugins.ini
    counterstrikesharp.vdf
  counterstrikesharp/
    bin/
    configs/
      core.json
      admins.json
      admin_groups.json
    gamedata/
    logs/
    plugins/
      MatchZy/
        MatchZy.dll
```

Plugins live one folder deep, and the folder name must match the DLL name: `plugins/MatchZy/MatchZy.dll` loads, `plugins/MatchZy.dll` does not. That rule catches almost everybody once.

`configs/core.json` is worth reading in full, because it is short and three of its settings change behaviour you will otherwise spend an hour chasing. The chat triggers decide which prefix runs a command in chat - `!` for a visible command and `/` for a silent one by default. Hot reload decides whether dropping a new DLL in place reloads it without a restart, which is convenient on a test server and a bad idea on a live one. And there is a switch for following Valve's community server guidelines, which restricts the plugin API from doing things that get servers in trouble; leaving it on is the default for a reason, covered below.

#### Admins, groups and flags

Admins are a JSON file, not a console command. `configs/admins.json` maps a Steam id to a set of flags:

addons/counterstrikesharp/configs/admins.json:

```json
{
  "Anna": {
    "identity": "76561198012345678",
    "flags": ["@css/generic", "@css/kick", "@css/ban", "@css/changemap"],
    "immunity": 80
  },
  "Moderator Jan": {
    "identity": "76561198087654321",
    "groups": ["#css/moderator"],
    "immunity": 40
  }
}
```

addons/counterstrikesharp/configs/admin_groups.json:

```json
{
  "#css/moderator": {
    "flags": ["@css/generic", "@css/kick", "@css/chat"],
    "immunity": 40
  }
}
```

| Flag | Grants |
| --- | --- |
| `@css/root` | Everything, including flags added by future plugins |
| `@css/generic` | The baseline "is an admin" check most plugins start with |
| `@css/kick` | Kick |
| `@css/ban` / `@css/unban` | Ban and lift bans |
| `@css/slay` | Slay, slap and similar |
| `@css/changemap` | Change the map |
| `@css/cvar` | Change cvars from chat |
| `@css/chat` | Gag, mute, admin chat |
| `@css/vote` | Start votes |
| `@css/reservation` | Reserved slot access |
| `@css/cheats` | Toggle `sv_cheats` where a plugin allows it |

`immunity` is a number, and a higher number cannot be acted on by a lower one. Give yourself 100, give trusted moderators 50, and give the person who asked nicely 10. Without immunity values two admins can kick each other in a loop, which is funny exactly once.

`css_admins_reload` re-reads both files without restarting, so adding a moderator during an evening costs nothing. Use `@css/root` for one account, yours, and build everyone else out of specific flags. The identity field is the 17-digit SteamID64; `status` in the console prints each connected player's id in the form you need.

#### Plugins worth running

| Plugin | What it does | Needs |
| --- | --- | --- |
| MatchZy | 5v5 matches: ready-up, knife round, pauses, per-map demos, round restore | CounterStrikeSharp |
| CS2-SimpleAdmin | Bans, mutes, gags and slays backed by a database, shared across servers | CounterStrikeSharp, a database |
| cs2-retakes | Retakes mode with bombsite spawns and weapon allocation | CounterStrikeSharp |
| CS2Fixes | Engine-level fixes and admin commands, the base for Zombie Escape servers | Metamod only |

That list is deliberately short. A CS2 community server needs an admin plugin, a way to vote for the next map, and one plugin for whatever the server is actually for. Everything past that is weight you have to re-test after every game update.

Two categories deserve a warning rather than a recommendation. Anything that changes weapon skins, gives inventory items or fakes cosmetics is against Valve's server guidelines, and the punishment is a ban on the game server login token - which takes the server with it, and can follow the Steam account to the next token. Skin plugins are popular and they are a genuine risk to your token, not a theoretical one. And anything advertising "anti-cheat" for CS2 is doing heuristics from inside the server process; some of it is useful, none of it is VAC, and all of it produces false positives you will have to arbitrate.

For a match server, MatchZy alone covers the whole evening, and [a CS2 competitive match server](https://www.renode.space/blog/cs2-competitive-match-server-config) walks through configuring it.

#### Installing, configuring and reloading a plugin

The install is always the same shape. Download the release zip, open it to check it contains an `addons/` path or a plain plugin folder, and unpack it into the right place with the file manager or over SFTP - [SFTP and the file manager](https://www.renode.space/blog/sftp-and-the-file-manager) has the connection details. Then:

```text
css_plugins list
css_plugins load MatchZy
css_plugins unload MatchZy
css_plugins reload MatchZy
```

Most plugins generate their configuration on first load rather than shipping it, so the sequence is: install, start, stop, then edit the file that appeared. Some write to `addons/counterstrikesharp/configs/plugins/<Name>/`, some write a `.cfg` into `game/csgo/cfg/`, and the plugin's own readme is the only authority on which. If a plugin has settings you cannot find, start the server once and look at what changed on disk.

Plugin errors go to `addons/counterstrikesharp/logs/`, one file per day, and they are far more readable than the console because a C# stack trace in a game console wraps into porridge. When a plugin loads but does nothing, the log usually has one line saying why, and it is usually a missing dependency or a gamedata signature that no longer matches.

#### Surviving a CS2 update

Valve updates CS2 without warning and without regard for your plugins. Three things break, in this order of likelihood:

1. `gameinfo.gi` is reset, so Metamod is not loaded at all. Re-add the line.
2. Metamod or CounterStrikeSharp needs a new build, because internal offsets moved. Nothing you own can fix this; you wait for the release, which is usually hours rather than days.
3. A plugin's gamedata no longer matches, so it loads and then throws when it touches the game. Update the plugin, or its gamedata file if the author ships one separately.

The defence is procedural, not technical. Keep a copy of the whole `addons` folder and your `gameinfo.gi` somewhere that is not the server, so a restore is a file copy. Do not run a game update an hour before a match - update the day after, on purpose, with time to fix it. And if you run anything that matters, have a second, cheap server you update first. [What to do when a mod update breaks](https://www.renode.space/blog/what-to-do-when-a-mod-update-breaks) is the general procedure; CS2 is just an unusually fast-moving instance of it.

On RE:NODE the update runs when the server starts, so the decision of when to take an update is the decision of when to restart - and the Schedules tab is where you put that at 05:00 on a Tuesday instead of five minutes before a match. Backup slots are included on every CS2 plan, and the sensible habit is a manual backup before you install any plugin, because rolling back is then one button rather than an archaeology session.

#### Memory, CPU and what plugins actually cost

A vanilla CS2 server for ten players is comfortable in 1 GB. CounterStrikeSharp brings a .NET runtime into the process and a handful of plugins on top of that, and the realistic floor for a plugin server is 2 GB - not because the plugins are heavy but because the runtime has a working set and the garbage collector likes headroom. If the container hits its memory limit it is stopped and restarted clean rather than left to swap, which on a match night is the worst possible outcome, so size up rather than sail close.

CPU is the more interesting constraint. A plugin that runs work on every tick runs it 64 or 128 times a second, per player, forever. Most published plugins are careful; the one somebody wrote for your server in an afternoon may not be. If the server starts to stutter after you install something, unload it and watch the graph rather than reasoning about it - the panel's CPU graph against your hard limit is the fastest test you have, and one container per server means nothing else is causing it.

#### Troubleshooting

**`meta list` prints nothing.** Metamod is not loading. Check the `gameinfo.gi` line, check you unpacked the Source 2 build, and check the file path is `game/csgo/addons/metamod` and not `csgo/addons/metamod`.

**Metamod loads but CounterStrikeSharp does not appear.** `addons/metamod/counterstrikesharp.vdf` is missing, or you took the build without the bundled runtime onto a machine with no .NET 8.

**`css_plugins list` shows a plugin but its commands do nothing.** Nearly always admin flags. Check `admins.json` has your SteamID64, run `css_admins_reload`, and check the chat trigger in `core.json` matches what you are typing.

**Everything worked yesterday and nothing works today.** A CS2 update. Start with `gameinfo.gi`.

**The server crashes on map change.** Unload plugins one at a time and change maps between each. Map change is when most plugin bugs surface, because it is when the game tears down and rebuilds state that a plugin may still be holding.

**Chat commands print in chat for everyone.** That is the public trigger doing its job. Use the silent trigger, `/` by default, for admin commands.

#### FAQ

##### Does SourceMod work on CS2?

No. SourceMod supports Source 1 games such as Team Fortress 2, Counter-Strike: Source and CS:GO. CS2 runs on Source 2, which SourceMod has no support for, and there is no converter for SourcePawn plugins. CounterStrikeSharp is the replacement in practice.

##### Do plugins get my server VAC banned?

VAC bans clients, not servers. The risk for a server is a ban on its game server login token, which Valve issues for breaking the community server guidelines - handing out inventory items, faking skins, or misrepresenting what the server is. Ordinary admin, match and game mode plugins are not the problem.

##### Can I install plugins from the panel without SSH?

Yes. Everything here is files in `game/csgo/`, so the file manager or SFTP is enough. Archives can be unpacked in place, and the editor will open `gameinfo.gi` and the JSON configs directly.

##### Where do I put admins for CS2?

`addons/counterstrikesharp/configs/admins.json`, keyed by name, with a SteamID64 in `identity` and a list of `@css/` flags. Reload it live with `css_admins_reload`.

##### How much memory does CounterStrikeSharp add?

Enough that 1 GB stops being comfortable. Budget 2 GB for a server running CounterStrikeSharp and a few plugins, and more if one of them keeps state for every player.

##### Why did my plugins stop loading after an update?

Because the update rewrote `game/csgo/gameinfo.gi` and removed the Metamod search path. Add the line back and restart. If that is not it, Metamod or CounterStrikeSharp needs a build that matches the new game version.

Every CS2 plan on RE:NODE gets the same panel: a file manager that unpacks a plugin archive in place, SFTP with per-server credentials, an unfiltered console with tab completion for `meta list` and `css_plugins`, and backup slots so a broken plugin install is one button to undo. Plugins are yours to choose - there is no allow list.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### CS2 server commands, cvars and RCON

Published 2026-09-21 by RE:NODE Team. https://www.renode.space/blog/cs2-server-commands-and-cvars

A Counter-Strike 2 server is configured in three places, and most of the confusion people have with it comes from not knowing which of the three wins. The launch line holds the things the engine needs before it has loaded anything - the port, the token, the tick rate. `game/csgo/cfg/server.cfg` holds the server's identity and its network settings. And the game mode config, executed after `server.cfg` on every map load, holds the round rules and overwrites whatever you put in `server.cfg` that it also sets. That last sentence is the answer to "why does my `mp_maxrounds` keep resetting".

This post is the reference for all three: the launch parameters worth using, the cvars that change something you can feel, and the commands you run live over RCON. It assumes you already have a server and a token - [setting up a Counter-Strike 2 server](https://www.renode.space/blog/counter-strike-2-server-setup) covers getting there.

#### What the server reads, and in what order

The CS2 dedicated server comes from Steam app `730`, the same app id as the game, and installs to a tree with the interesting parts under `game/csgo/`:

```text
game/
  bin/linuxsteamrt64/cs2       the server binary
  csgo/
    cfg/
      server.cfg               execed on every map load
      gamemode_competitive.cfg      Valve's mode defaults
      gamemode_competitive_server.cfg   your overrides
      gamemode_casual.cfg
      gamemode_deathmatch.cfg
    addons/                    Metamod and plugins, if you add them
    maps/                      installed and workshop maps
    gamemodes_server.txt       map groups and per-mode convars
```

```diagram
title: Which config wins when the map loads
launch = Launch line | port, token, tickrate
server = server.cfg | every map load
mode = gamemode_*.cfg | Valve defaults
override = gamemode_*_server.cfg | your overrides
live = Live cvars | what players get
launch -> server
server -> mode
mode -> override
override -> live : last word wins
```

The practical rule that falls out of this: anything beginning `mp_` belongs in `gamemode_<mode>_server.cfg`, and anything beginning `sv_`, `hostname`, `rcon_password` or `tv_` belongs in `server.cfg`. The `_server` files do not ship - you create them - and they are the supported place for overrides, which is why they survive a game update that rewrites Valve's own configs.

> [!WARNING]
> If a setting works when you type it into the console and reverts on the next map, you set it in `server.cfg` and the game mode config is setting it back. Move it to `gamemode_competitive_server.cfg` and it will stick.

#### The launch line

On your own Linux box, install and start looks like this:

```bash
$ steamcmd +force_install_dir /home/cs2/server +login anonymous \
    +app_update 730 validate +quit
$ cd /home/cs2/server
$ ./game/bin/linuxsteamrt64/cs2 -dedicated -usercon \
    -port 27015 -maxplayers_override 12 -tickrate 128 \
    +game_alias competitive +map de_dust2 \
    +sv_setsteamaccount YOUR_GSLT_TOKEN
```

On a panel-based host you never type that; the same values appear as fields on the Startup tab, and the panel assembles the line. Either way these are the parameters that matter:

| Parameter | What it does |
| --- | --- |
| `-dedicated` | Runs headless. Without it you are launching the game |
| `-usercon` | Enables RCON. No RCON without this, whatever password you set |
| `-port 27015` | Game port, UDP, and the RCON port, TCP |
| `-maxplayers_override 12` | Slot count. Overrides whatever the mode wants |
| `-tickrate 128` | Simulation rate. Default is 64 |
| `-insecure` | Disables VAC. Only for a closed test server |
| `+game_alias competitive` | Sets the mode before the first map loads |
| `+map de_dust2` | The first map. The server idles without one |
| `+sv_setsteamaccount` | Your Game Server Login Token |
| `+exec autoexec.cfg` | Runs a config once at startup, before any map |

The token is the one people get wrong. `sv_setsteamaccount` has to be on the launch line, not in `server.cfg`, because the server logs in to Steam before it loads a map and therefore before it reads any config. Set it in both places and they will disagree. Valve issues the token to a Steam account that owns the game, one per server, and it is yours rather than your host's - [Steam game server tokens explained](https://www.renode.space/blog/steam-game-server-tokens-gslt) covers creating one for app `730` and what gets a token banned. Without a token the server still runs and still accepts direct connections; it just does not appear in the public browser.

#### Game modes, and the map group

CS2 keeps the CS:GO scheme of two integers. `game_type` picks the family, `game_mode` picks the variant inside it, and `game_alias` sets both from a name.

| Alias | `game_type` | `game_mode` | Mode |
| --- | --- | --- | --- |
| `casual` | 0 | 0 | Casual |
| `competitive` | 0 | 1 | Competitive, MR12 |
| `wingman` | 0 | 2 | Wingman, 2v2 |
| `armsrace` | 1 | 0 | Arms Race |
| `demolition` | 1 | 1 | Demolition |
| `deathmatch` | 1 | 2 | Deathmatch |
| `custom` | 2 | 0 | Custom, for plugin-driven modes |

Setting the alias on the launch line is the reliable way in, because changing `game_type` or `game_mode` live needs a map change to take effect, and half-applied modes produce the strangest bugs you will ever debug. If you are running a plugin that implements its own rules - retakes, a deathmatch plugin, an arena mode - `custom` is the family that leaves the game rules alone for it.

Map rotation has two layers. The engine layer is `mapcycle.txt` in `game/csgo/`, one map name per line, read through the `mapcyclefile` cvar, plus `changelevel <map>` to move now and `mp_match_end_changelevel 1` to advance when a match finishes. The Valve layer above it is `gamemodes_server.txt`, a KeyValues file you create from the `gamemodes_server.txt.example` that ships beside it; it defines map groups and lets you set convars per game mode in one place. Community servers with a vote system usually ignore both and let the plugin drive, which is covered in [CS2 plugins with Metamod and CounterStrikeSharp](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp).

Workshop maps load by id rather than by name:

```text
host_workshop_map 3070596702
ds_workshop_changelevel de_cache
```

The first downloads and loads a single workshop map. Loading a whole collection has needed a Steam Web API key at various points in CS2's life and the requirement has moved more than once, so check the current behaviour before you build a rotation on it. A single-map server is unaffected.

Bots fill a mode that would otherwise be one person standing in spawn. `bot_quota 8` with `bot_quota_mode fill` keeps the server at eight total players and removes bots as humans arrive; `bot_quota_mode normal` adds eight bots regardless. `bot_difficulty` takes `0` to `3`, `bot_kick` clears them all, and `bot_stop 1` freezes them for a practice session. Bots on a community server are a presentation choice rather than a technical one: a browser entry showing 2/10 gets skipped and one showing 8/10 gets clicked, and the people who join find bots. Decide which trade you want before someone else does.

#### server.cfg: the settings worth setting

Here is a `server.cfg` with nothing decorative in it:

game/csgo/cfg/server.cfg:

```cfg
hostname "Longship 5v5 // EU"
rcon_password "a-long-random-string"
sv_password ""
sv_lan 0
sv_region 3

// Network
sv_maxrate 0
sv_minrate 196608
sv_hibernate_when_empty 1
sv_hibernate_postgame_delay 30

// Voice and chat
sv_full_alltalk 0
sv_deadtalk 1

// Safety
sv_cheats 0
sv_allow_votes 1
mp_endmatch_votenextmap 1

// Logging
log on
sv_logfile 1
sv_logecho 1
sv_logbans 1

// GOTV
tv_enable 1
tv_port 27020
tv_autorecord 1
tv_delay 0
```

| Cvar | Notes |
| --- | --- |
| `hostname` | The browser name. Put the region in it, people filter on it |
| `rcon_password` | Long and random. Empty means RCON is off, not open |
| `sv_password` | Non-empty makes the server private |
| `sv_lan 0` | `1` skips Steam authentication. A private server, not a hidden one |
| `sv_region` | Browser region: `0` US East, `3` Europe, `4` Asia, `255` world |
| `sv_minrate` | Floor on a client's bandwidth. Stops a throttled client hurting itself |
| `sv_hibernate_when_empty` | Drops CPU use to nothing when nobody is on |
| `sv_full_alltalk` | Everyone hears everyone, both teams, alive or dead |
| `sv_visiblemaxplayers` | Shows a lower slot count than you have, for reserved slots |
| `sv_cheats` | Must be `1` for practice commands. Never on a public server |

`sv_hibernate_when_empty 1` is worth a sentence of its own. An idle CS2 server with hibernation on uses almost no CPU, which matters when your plan buys a share of a core rather than a whole one. The cost is that GOTV disconnects while hibernating and any plugin doing work on a timer stops, so a match server that records demos between rounds wants it off and a community server wants it on.

The voice cvars were reorganised between CS:GO and CS2 and the old `sv_alltalk` is not the lever any more. If you are following a CS:GO guide and a cvar does not exist, the console says so plainly - see the `find` command below.

`sv_visiblemaxplayers` is the reserved-slot trick and it is worth knowing because it needs no plugin. Buy twelve slots, set `sv_visiblemaxplayers 11`, and the browser shows the server as full at eleven while the twelfth stays free for whoever you let in. It only hides the slot; enforcing who gets it needs a plugin that kicks the lowest-priority player. On a small community server the hidden slot alone solves the actual problem, which is an admin unable to join their own full server to deal with someone.

#### Round, money and match cvars

These are the `mp_` ones, so they go in `gamemode_competitive_server.cfg` (or the file matching whatever mode you run). The values below are a standard competitive setup.

game/csgo/cfg/gamemode_competitive_server.cfg:

```cfg
mp_maxrounds 24
mp_overtime_enable 1
mp_overtime_maxrounds 6
mp_overtime_startmoney 12500
mp_halftime 1
mp_match_can_clinch 1
mp_maxmoney 16000
mp_startmoney 800
mp_afterroundmoney 0
mp_freezetime 15
mp_roundtime 1.92
mp_roundtime_defuse 1.92
mp_roundtime_hostage 1.92
mp_buytime 20
mp_buy_anywhere 0
mp_friendlyfire 1
mp_solid_teammates 1
mp_death_drop_gun 1
mp_death_drop_grenade 2
mp_autoteambalance 0
mp_limitteams 0
mp_warmuptime 60
mp_warmup_pausetimer 0
mp_timelimit 0
```

| Cvar | Meaning |
| --- | --- |
| `mp_maxrounds` | Rounds in regulation. `24` is MR12, CS2's competitive length |
| `mp_overtime_maxrounds` | Rounds per overtime. `6` is MR3 |
| `mp_halftime` | Swap sides at the half. Off makes a one-sided match |
| `mp_match_can_clinch` | End the match once a score is unreachable |
| `mp_roundtime_defuse` | Round length in minutes. `1.92` is 1:55 |
| `mp_freezetime` | Buy and talk time before a round starts |
| `mp_buytime` | Seconds the buy menu stays open after freezetime |
| `mp_maxmoney` | Money ceiling. `16000` is the competitive value |
| `mp_death_drop_gun` | `0` nothing, `1` best weapon, `2` current weapon |
| `mp_free_armor` | `0` none, `1` kevlar, `2` kevlar and helmet, free each round |
| `mp_autoteambalance` | Off for any match. On for casual servers that fill unevenly |
| `mp_timelimit` | Minutes per map. `0` means rounds decide it |

`mp_roundtime` is the fallback and the two specific ones win on the map types they name, so set all three or you will get 1:55 on defuse maps and something else on hostage maps. Warm-up is ended with the `mp_warmup_end` command rather than by waiting, and `mp_warmup_pausetimer 1` freezes the warm-up clock indefinitely, which is how a match server waits for ten people to turn up.

Team names for a scrim are `mp_teamname_1` and `mp_teamname_2`, with `mp_teamflag_1` and `mp_teamflag_2` taking two-letter country codes. They show in the scoreboard and in GOTV. The whole match-server arrangement, including a knife round and demo handling, is in [a CS2 competitive match server](https://www.renode.space/blog/cs2-competitive-match-server-config).

#### Tick rate and sub-tick

CS2 servers run at 64 tick unless you pass `-tickrate 128`. What that changes is smaller than it was in CS:GO, and it is worth understanding why before you pay for it.

Source 2 timestamps player inputs with the moment they happened rather than the tick they arrived in, so shooting and movement are evaluated at sub-tick resolution on a 64 tick server. Hit registration, which was the whole argument for 128 tick in CS:GO, is largely tick-independent now. What is still tick-bound is anything simulated per tick: grenade physics, the exact frames of a jump-throw, and the resolution of anything a plugin does in a tick handler. A 128 tick server also produces noticeably heavier GOTV demos.

The cost is roughly double the CPU per player. On a plan that buys a fixed share of a core that is a real constraint rather than an abstraction, and a 128 tick server at its CPU limit is worse than a 64 tick server that never reaches it. [What tick rate actually means](https://www.renode.space/blog/what-tick-rate-actually-means) goes through the measurement; the short version for CS2 is to run 64 for a community server and 128 only for a competitive one where people will argue about jump-throws.

Rate cvars are simpler than they were. `sv_minrate` and `sv_maxrate` cap the bytes per second per client, with `0` for no maximum, and the CS:GO `sv_maxcmdrate` and `sv_maxupdaterate` pair no longer applies the way old guides describe. Leave rates alone unless you have measured a problem. Roughly 60 to 120 KB/s per player is normal for CS2.

#### RCON, kicks and bans

RCON runs over TCP on the game port, needs `-usercon` on the launch line and a non-empty `rcon_password`. From a client console:

```text
rcon_address 203.0.113.10:27015
rcon_password a-long-random-string
rcon status
```

The panel console is the safer route, because it is authenticated by your panel account instead of by a password that travels with every command, and it does not need the port exposed at all. RCON over the internet is a plaintext protocol - [using RCON safely](https://www.renode.space/blog/rcon-safely) is short and worth the two minutes.

| Command | What it does |
| --- | --- |
| `status` | Players, their user ids, Steam ids, ping and the current map |
| `users` | Shorter player list |
| `kick <name>` | Removes a player by name |
| `kickid <userid> <reason>` | Removes by the id `status` printed. Reliable with odd names |
| `banid <minutes> <userid>` | Ban. `0` minutes is permanent |
| `banip <minutes> <ip>` | Address ban |
| `writeid` | Saves id bans to `banned_user.cfg` |
| `writeip` | Saves address bans to `banned_ip.cfg` |
| `removeid` / `removeip` | Lifts one entry |
| `changelevel <map>` | Changes map, keeping players connected |
| `mp_restartgame 1` | Restarts the game after one second |
| `mp_warmup_end` | Ends warm-up now |
| `mp_pause_match` / `mp_unpause_match` | Freezes and resumes play |
| `exec <file>` | Runs a config from `game/csgo/cfg/` |
| `say <text>` | Speaks in chat as the server |

Engine bans are thin: they are stored in a flat file, they need `writeid` or they vanish on restart, and they carry no reason, no expiry you can read back and no shared list between servers. For anything more than throwing one person out, a plugin with a database behind it is the answer, and that is the main reason community CS2 servers install CounterStrikeSharp at all.

#### Logging and finding a cvar you half-remember

`log on` plus `sv_logfile 1` writes to `game/csgo/logs/`, one file per session, with connections, kills, chat and admin actions. `sv_logecho 1` mirrors it into the console, which is what you want on a panel where the console is the thing you actually look at. `sv_logbans 1` records bans in the same stream so you can answer "who banned them and when" six weeks later.

CS2 ships log forwarding over HTTP with `logaddress_add_http "http://10.0.0.5:8080/"`, which is not the CS:GO UDP `logaddress_add` that older stats tools expect. If you are wiring up an external stats service, check which of the two it speaks before you spend an evening on a firewall rule.

Two console commands save more time than any guide:

```text
find alltalk
help mp_maxrounds
```

`find <text>` lists every cvar and command whose name or help text contains the text, with its current value. `help <cvar>` prints the description and the default. Between them you can settle any "does this cvar still exist in CS2" question in five seconds, which matters because a great deal of the CS2 advice on the internet is CS:GO advice with the numbers changed. [Reading the console](https://www.renode.space/blog/reading-the-console) covers what else is worth watching in that output.

#### Troubleshooting

**The server does not appear in the browser.** Almost always the token: no `sv_setsteamaccount`, a token that has been revoked, or the same token on two servers. Check the startup log for the Steam login lines. Direct connection working while the browser listing does not is the signature of a token problem, not a network problem.

**RCON refuses the password.** Confirm `-usercon` is on the launch line. Without it the server never opens the RCON listener and every password is wrong. Then confirm you are pointing at the game port over TCP - the same number as the UDP game port.

**A cvar reverts after every round or map.** The game mode config is resetting it. Move it into `gamemode_<mode>_server.cfg`.

**`mp_maxrounds` has no effect.** Either `mp_timelimit` is non-zero and ending the map first, or the mode is not competitive. Check `game_type` and `game_mode` with `status` and a `find game_mode`.

**Players connect and drop immediately.** Check `sv_lan` is `0`, and check the log for VAC or Steam authentication errors. A server started with `-insecure` will not authenticate clients normally.

**The console is full of "unknown command".** A CS:GO config on a CS2 server. Work through it with `find`; roughly one cvar in ten changed name or disappeared.

**High CPU with nobody on.** `sv_hibernate_when_empty` is `0`, or a plugin is holding the server awake. Watch the CPU graph across an empty period rather than guessing.

#### FAQ

##### Where is server.cfg on a CS2 server?

`game/csgo/cfg/server.cfg`, inside the install directory. Note the doubled path: the CS2 tree has a `game` folder and the mod folder inside it is still called `csgo`. It is executed on every map load, so a config change takes effect on the next map without a restart.

##### Why does my CS2 server reset mp_ settings?

Because the game mode config runs after `server.cfg` and sets the same cvars. Put `mp_` values in `game/csgo/cfg/gamemode_competitive_server.cfg` - the `_server` variant is Valve's supported override file and survives updates.

##### Is 128 tick worth it in CS2?

For a competitive server where people practise grenade line-ups, yes. For a community server, no. Sub-tick input timing removed most of the hit-registration argument, and 128 tick costs roughly twice the CPU per player.

##### Do I need a GSLT for a private CS2 server?

Only for the public browser. Without a token the server runs and friends can connect by address, which is enough for a private group. With a token it is listed, and the token must be yours and used on one server at a time.

##### How do I make one player an admin?

There is no engine concept of an admin in CS2 beyond the RCON password. Giving someone limited powers - kick, map change, mute - means installing Metamod:Source and a plugin framework that has an admin file with per-player flags.

##### How many players can a CS2 server hold?

Up to 64 with `-maxplayers_override`, but the practical answer is the mode. Competitive is 10, Wingman 4, casual 10 to 20 and deathmatch 16 to 24. Past about 24 the CPU cost per player and the map sizes stop making sense together.

CS2 servers on RE:NODE start at 1 GB with two port allocations, so the game port and GOTV both have somewhere to live, and the RCON password is generated per server rather than left blank. Your own game server token goes on the Setup tab, the console is unfiltered with tab completion, and the file manager edits `server.cfg` in place.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

---

### Counter-Strike 2 server setup and config

Published 2026-07-21, updated 2026-09-21 by RE:NODE Team. https://www.renode.space/blog/counter-strike-2-server-setup

A Counter-Strike 2 server is a headless Source 2 binary, one UDP port, a very large install, and one credential you have to fetch yourself. The credential is a Game Server Login Token from Valve, issued to an account that owns the game, and it is why most first servers appear to work in every way except being findable. Everything after that is `server.cfg`, a couple of files that quietly overwrite it, and - if you want anything the base game does not do - Metamod and CounterStrikeSharp.

This guide covers the whole path: the token, the SteamCMD install, the launch line and the game mode matrix, the cvars worth setting, ports and RCON, GOTV, workshop maps, plugins, and the errors people actually hit.

#### What a CS2 server is, and what you need before you start

The dedicated server ships under the same Steam app id as the game, `730`. There is no separate "server" app to find. It runs one match, on one map, in one mode, and it is configured by console variables rather than by a single settings file: what looks like configuration is really a stack of `.cfg` files executing in a fixed order at map load.

Before you start, you need four things.

- **A machine or a plan.** One fast CPU core does more for a CS2 server than four slow ones. Memory is rarely the limit.
- **A Game Server Login Token.** Covered in the next section. It is not optional for a public server.
- **Disk, far more than you expect.** The CS2 server install is in the region of 60 GB, and SteamCMD reserves the space before it starts downloading rather than filling the disk and failing halfway. A Source 1 server was two gigabytes; this is not that. Budget headroom on top for updates, demos and plugins.
- **One UDP port**, plus a second if you want GOTV.

It is worth deciding at this point which of three servers you are building, because they diverge quickly. A private 5v5 practice server needs almost no configuration beyond the match rules and a password. A community server - deathmatch, retakes, surf, minigames - needs plugins, and plugins are the part that breaks on Valve's update schedule. A public competitive server that strangers join needs the token, moderation and a map rotation. Everything below applies to all three; the plugin section only matters to the second.

#### Getting the Game Server Login Token

Valve issues one token per server, to a Steam account, from the Game Server Account Management page at `steamcommunity.com/dev/managegameservers`. Sign in with an account that owns CS2, enter app id `730` and a memo you will recognise in six months, and you get a 32-character token.

Three rules about that token, all learned the hard way by somebody else:

1. **It belongs to the account, not to the server.** If the token collects a ban, the ban lands on the Steam account that created it. That is the reason no host creates one for you and the reason nobody sane shares one between servers.
2. **One token per server.** Running two servers on the same token gets both of them deregistered from the master servers, usually at the worst moment.
3. **An unused token can be revoked.** Tokens that go a long time without being used are cleared out. If a server that has been off for months will not list any more, look at the token page before you look at anything else.

The token goes on the launch line as `+sv_setsteamaccount <token>`, or into the Startup or Setup tab of a panel. Do not also set it in `server.cfg`. Two sources for the same value means one of them is wrong and you will not know which.

> A token is a credential. If you paste it into a Discord channel to ask for help, revoke it and make a new one before you read the replies.

Without a token the server still runs, and people can still join it with `connect 203.0.113.10:27015` from the console. What it will not do is register with Valve's master servers, which means it never appears in the community browser and workshop content can fail to download. That is the single most common "my server is broken" report, and the server is not broken. [Steam game server tokens explained](https://www.renode.space/blog/steam-game-server-tokens-gslt) goes through bans, app ids and what happens when a token is revoked mid-match.

#### Installing the server with SteamCMD

The install is one SteamCMD command. On your own Linux machine:

```bash
$ steamcmd +force_install_dir /home/cs2/server +login anonymous \
    +app_update 730 validate +quit
```

Anonymous login works for app `730` today. Early in CS2's life it did not, which is why older guides tell you to log in with an account that owns the game - you can ignore that now. Keep `validate` in the line you use for updates: it re-checks every file, which is slow but is the only reliable fix for a half-applied update.

The layout that comes out the other end matters, because almost every path in this guide is relative to it:

```text
server/
  game/
    bin/linuxsteamrt64/cs2       the server binary
    csgo/                        the mod folder, still named csgo
      cfg/                       server.cfg and the gamemode configs
      addons/                    Metamod and plugins, if you add them
      maps/                      workshop maps land here
      gameinfo.gi                the search paths Metamod has to be added to
```

Yes, the folder is still called `csgo`. Valve kept the name through the Source 2 port, and so has every plugin that expects it. [SteamCMD explained](https://www.renode.space/blog/steamcmd-explained) covers app ids, betas and update scripts if this is your first Steam server.

#### The launch line, game modes and the first map

```bash
$ ./game/bin/linuxsteamrt64/cs2 -dedicated -usercon \
    -port 27015 \
    +game_type 0 +game_mode 1 \
    +sv_setsteamaccount YOUR_TOKEN_HERE \
    +exec server.cfg \
    +map de_dust2
```

`-dedicated` starts it headless. `-usercon` enables RCON and is easy to forget, since nothing complains about its absence until you try to connect a remote console. `-port` sets the game port. Put `+map` last: the mode cvars are read when the map loads, so a map argument earlier in the line loads before the mode is set and you get a competitive server running casual rules.

The mode itself is two numbers, carried over from CS:GO:

| Mode | `game_type` | `game_mode` |
| --- | --- | --- |
| Casual | 0 | 0 |
| Competitive | 0 | 1 |
| Wingman (2v2) | 0 | 2 |
| Arms Race | 1 | 0 |
| Deathmatch | 1 | 2 |
| Custom | 3 | 0 |

Not every CS:GO combination survived the port, and Valve has moved modes around since. The server prints the mode it resolved during map load, so read the console on the first start rather than trusting a table - including this one. Custom (`3 0`) is the one to use when a plugin owns the rules and you want the game to stop applying its own.

On a panel host you do not write that line at all. The same arguments appear as fields on the Startup tab, the token goes on the Setup tab, and the binary path is already right. That is most of the value of a panel for this game: the install is 60 GB of Valve's files and none of it is interesting.

#### server.cfg and the configs that overwrite it

`game/csgo/cfg/server.cfg` executes on every map load. So do the game mode configs - `gamemode_competitive.cfg`, `gamemode_casual.cfg` and the rest - and they run **after** `server.cfg`. This catches everybody once: you set `mp_maxrounds` in `server.cfg`, the map changes, and the mode config resets it.

The fix is the companion file. For each `gamemode_<mode>.cfg` there is a `gamemode_<mode>_server.cfg` that Valve ships empty for exactly this purpose and executes last. Mode-specific rules go there; everything else goes in `server.cfg`.

game/csgo/cfg/server.cfg:

```cfg
hostname "Longship 5v5 - EU"
rcon_password "a-long-random-string"
sv_password ""
sv_cheats 0
sv_hibernate_when_empty 1
sv_allow_votes 1
bot_quota 0
mp_autokick 0
mp_autoteambalance 1
mp_limitteams 2
mp_friendlyfire 1
sv_deadtalk 0
```

game/csgo/cfg/gamemode_competitive_server.cfg:

```cfg
mp_maxrounds 24
mp_overtime_enable 1
mp_overtime_maxrounds 6
mp_overtime_startmoney 10000
mp_match_can_clinch 1
mp_roundtime 1.92
mp_roundtime_defuse 1.92
mp_freezetime 15
mp_startmoney 800
mp_maxmoney 16000
mp_buytime 20
mp_warmuptime 60
```

A few of those deserve a sentence each.

| Cvar | Common value | What it does |
| --- | --- | --- |
| `mp_maxrounds` | `24` | Rounds in regulation. `24` is MR12, the current competitive format |
| `mp_roundtime_defuse` | `1.92` | Round length in minutes on bomb maps. `1.92` is 115 seconds |
| `mp_overtime_maxrounds` | `6` | MR3 overtime, repeated until someone wins |
| `mp_match_can_clinch` | `1` | End the match when the score is unreachable, rather than playing it out |
| `mp_autokick` | `0` | Off. Otherwise idle or team-damaging players are removed automatically |
| `bot_quota` | `0` | Bots. Each one costs real CPU, so keep it at zero unless you want them |
| `sv_hibernate_when_empty` | `1` | Sleep at near-zero CPU with nobody connected |
| `sv_deadtalk` | `0` | Whether dead players can be heard by the living |

`sv_hibernate_when_empty` is the one with a side effect worth knowing. A hibernating server uses almost nothing, which is the whole point on a shared plan, but it also stops doing work: a scheduled map change will not happen while it sleeps, and the first player to join waits a moment for it to wake. If you run a rotation on a timer, turn hibernation off and accept the CPU. The full list of cvars, with the ones that only exist in CS2, is in [CS2 server commands and cvars](https://www.renode.space/blog/cs2-server-commands-and-cvars).

#### Ports, RCON and GOTV

| Port | Protocol | Purpose |
| --- | --- | --- |
| `27015` | UDP | Game traffic and the Steam query the browser uses |
| `27015` | TCP | RCON, if `-usercon` is set |
| `27020` | UDP | GOTV, set by `tv_port` |

The game port carries both play and the query that the server browser reads, which is why a UDP-only firewall hole is enough for a server to be joinable and findable, and why a TCP-only rule gets you neither. If you change `-port`, nothing else moves with it; GOTV keeps its own number. [Game server ports explained](https://www.renode.space/blog/game-server-ports-explained) covers what a query port is doing and how to test one from outside.

RCON is a plain TCP connection on the game port, authenticated by a password sent in the clear. It has no rate limiting worth the name. Give it a long random password, never the one you use anywhere else, and prefer running commands from the panel console - which talks to the process directly rather than over the network - when you have that option. [Using RCON safely](https://www.renode.space/blog/rcon-safely) is short and worth the two minutes.

GOTV is the spectator relay and the demo recorder in one:

```cfg
tv_enable 1
tv_port 27020
tv_delay 105
tv_autorecord 1
tv_delaymapchange 1
tv_maxclients 10
```

`tv_delay` in seconds is what stops spectators from calling positions; 105 is the competitive convention. `tv_autorecord 1` writes a `.dem` into `game/csgo/` for every match, which is the cheapest anti-cheat measure available to a community server and the only way to settle an argument about round 14. Demos are small but they accumulate, so sweep the folder on a schedule.

```diagram
title: How a player finds and joins a CS2 server
player = CS2 client | browser or connect
master = Valve master | needs the token
server = CS2 server | UDP 27015
gotv = GOTV relay | UDP 27020
demos = Demo files | game/csgo/*.dem
server -> master : registers with GSLT
player -> master : browses
player -> server : direct connect
server -> gotv : delayed feed
gotv --> demos : tv_autorecord
```

#### Sizing: what actually costs CPU and memory

Start with the thing you can stop paying for. **CS2 has no tick rate to buy.** The 64 versus 128 argument belonged to CS:GO. CS2 timestamps player input between ticks - the sub-tick system - so the `-tickrate` argument is not honoured and a host advertising a "128 tick CS2 server" is selling you a number that the engine ignores. If you want the longer version of why tick rate was never the whole story anyway, [what tick rate actually means](https://www.renode.space/blog/what-tick-rate-actually-means) has it.

What does cost CPU, in rough order:

- **Bots.** Pathfinding is expensive and a full bot roster can cost more than the human players it replaces.
- **Plugin timers.** A CounterStrikeSharp plugin running work on every server frame instead of every second is the usual cause of a server that is fine with four players and bad with sixteen.
- **Player count in modes with constant respawning.** Deathmatch and retakes are heavier per player than competitive.
- **GOTV**, mildly, plus bandwidth per spectator.

| Server | RAM | CPU | Notes |
| --- | --- | --- | --- |
| 10-slot competitive or practice | 1 GB | 1 fast core | The common case, and it is genuinely this small |
| 12-16 casual | 2 GB | 1.5 cores | More entities, more respawns |
| 20-24 deathmatch or retakes | 2-3 GB | 2 cores | Respawn churn is the cost |
| Community server with plugins | 3-4 GB | 2-3 cores | Depends entirely on the plugins |

Memory is almost never the limit for CS2; single-core clock speed is. Before buying more of either, check which one is actually pinned - [CPU vs RAM for game servers](https://www.renode.space/blog/cpu-vs-ram-for-game-servers) explains how to read that from a load graph rather than a feeling.

On RE:NODE, CS2 plans start at 1 GB and run to 6 GB, from $7 a month, with two port allocations so GOTV has a number of its own and an RCON password generated per server rather than left blank. The install and its updates are run for you; what you supply is the token on the Setup tab, and the install waits there until you do.

#### Workshop maps and plugins

Workshop maps are loaded by id, not by file:

```cfg
host_workshop_map 3070394480
```

That downloads the map if it is missing, keeps it updated, and loads it. `host_workshop_collection <id>` does the same for a collection, and `ds_workshop_changelevel <mapname>` switches between maps already in it. Workshop downloads go through the Steam account behind your token, so a server without a valid token often shows up as "the workshop map will not download" rather than as a token problem.

Plugins are a two-layer stack and neither layer is SourceMod. SourceMod does not support CS2 and there is no sign that it will.

1. **Metamod:Source** is the loader. It unpacks into `game/csgo/addons/metamod`, and then - this is the step - `game/csgo/gameinfo.gi` has to be edited to add `csgo/addons/metamod` to its search paths. Nothing loads until it is.
2. **CounterStrikeSharp** is the plugin runtime almost everything is written against. Plugins are .NET assemblies under `addons/counterstrikesharp/plugins`, each in its own folder.

On top of that sits whatever you actually wanted: MatchZy for 5v5 matches with knife rounds, pauses, per-round backups and automatic demo upload; retake and deathmatch plugins; admin menus. [Metamod and CounterStrikeSharp on CS2](https://www.renode.space/blog/cs2-plugins-metamod-counterstrikesharp) walks the install, and [a competitive match server config](https://www.renode.space/blog/cs2-competitive-match-server-config) covers the scrim and practice setup end to end.

> [!WARNING]
> Every CS2 update rewrites `gameinfo.gi` and reverts the Metamod line, and often breaks the plugins themselves until they are rebuilt. A server that updated overnight and came back with no plugins is not corrupted; it has lost one line in one file. Keep a copy of the edited `gameinfo.gi` and of the whole `addons` folder, and do not auto-update a modded server on patch day.

#### Troubleshooting

**The server does not appear in the community browser.** In order: is the token set and valid, is UDP `27015` open from outside, and is the server actually finished loading a map. Test with `connect <ip>:27015` from a client console - if that works, the server is fine and the listing is the problem.

**"Your server needs to be restarted in order to receive the latest update."** Valve pushed a client update. The server has to be updated to match before anyone can join. Run the SteamCMD line again with `validate`.

**The server starts and exits within seconds.** Almost always disk. SteamCMD reserves space for an update and gives up, leaving an install that cannot start. Check free space first, then run `validate`.

**"Invalid Game Server Login Token".** The token was regenerated, revoked for inactivity, or is being used by a second server at the same time. Make a new one and replace it in one place only.

**Everything is bots, or teams keep shuffling.** `bot_quota 0` and `mp_autoteambalance` respectively, and check which file is setting them - a gamemode config executing after `server.cfg` is the usual culprit.

**Warmup never ends.** `mp_warmuptime` is running down but `mp_warmup_pausetimer` is set, or a plugin is holding warmup open for a match start it never received. `mp_warmup_end` in RCON forces it.

**Plugins stopped working after an update.** `gameinfo.gi`. See the warning above.

#### FAQ

##### Do I need a Game Server Login Token for a private server?

Not if everyone connects by IP with `connect <address>`. The token is what registers the server with Valve so it appears in the browser and can fetch workshop content. A private practice server with a password works without one.

##### Can I run a 128 tick CS2 server?

No, and neither can anyone else. CS2 replaced tick rate with sub-tick input timestamps, and the `-tickrate` argument is ignored by the engine. Any host selling 128 tick CS2 is selling a label.

##### How much RAM does a CS2 server need?

A 10-slot competitive server is comfortable in 1 GB. Deathmatch and retake servers with 20 or more slots want 2-3 GB, and a plugin-heavy community server 3-4 GB. CPU clock speed limits a CS2 server long before memory does.

##### Does SourceMod work on CS2?

No. The CS2 plugin stack is Metamod:Source plus CounterStrikeSharp, and plugins have to be written or ported for it. SourceMod plugins from CS:GO do not run.

##### Why is the server install so large?

Because the dedicated server ships the same asset set as the game rather than a stripped-down version. Expect something in the region of 60 GB, and note that SteamCMD reserves the space up front, so a disk with less free will refuse the install outright instead of getting halfway.

##### Can I use one token on two servers?

No. Valve issues one token per server and running two on the same one deregisters both. Create a second token with its own memo on the same page.

CS2 servers on RE:NODE start at 1 GB from $7 a month, with two port allocations so GOTV gets its own, an RCON password generated per server, and the install and updates handled for you. You paste your own Game Server Login Token into the Setup tab - it has to be yours, because a shared token is a ban that takes everybody with it.

[See CS2 plans](https://www.renode.space/game-servers/counter-strike-2)

## Rules for the assistant

- Never ask the user for a password, token, API key or `.env` contents, and tell them not to paste one into this chat. Describe where a secret goes instead.
- Secrets reach the server through the panel: `.env` is uploaded through the Files tab, startup variables are set on the Startup tab. `.env` never goes in the repository.
- An app server has exactly one reachable port. Read it from `SERVER_PORT` (also `PORT` when the panel starts a linked repository) and bind `0.0.0.0`; never hard-code a port.
- On every panel-managed server (everything except VDS and dedicated servers, which come with full root) only `/home/container` persists, and the process runs unprivileged: no root, `sudo`, `apt`, `systemd` or Docker.
- Memory is a hard limit; a process that reaches it is killed with no error message. Suggest a bigger plan only after ruling out a leak.
- Do not suggest changing the server's startup command or image to work around a code problem - fix the code or the repository.
- Prices and plans above were read when this file was generated. Send the user to the page linked at the top before quoting a price as current.
- For a specific server, the panel's Connect AI link (Console tab) gives the exact runtime, port, path and branch. Prefer it over these general rules when the user has one.
- If something here does not answer the question, the full deploy docs are at https://www.renode.space/llms-full.txt and support is at https://www.renode.space/contact.
