A self-contained, portable CS:GO (legacy) dedicated server
| App ID | What it is | State |
|---|---|---|
| 740 | Counter-Strike Global Offensive - Dedicated Server | Still served anonymously, frozen at buildid 12426148, last updated 2023-10-13. This is the final real CS:GO server, not CS2. |
| 4465480 | Counter-Strike: Global Offensive (standalone legacy client) | Free, released, Windows + Linux. The 2026 unlisted re-release. |
| 730 | Counter-Strike 2 | The current game. Also carries the csgo_legacy beta branch. |
cd ~/Desktop/csgo_server
cp .env.example .env
$EDITOR .env # at minimum set RCON_PASSWORD
./scripts/lanparty.sh check # pre-flight: firewall, WARP, disk, docker
./scripts/lanparty.sh firewall open # open 27015/udp+tcp and 27020/udp (sudo)
docker compose up -d
docker compose logs -f # first run downloads ~14 GB (~35 GB on disk)When the log says Connection to Steam servers successful and the map has loaded:
./scripts/lanparty.sh info # prints the exact connect string to shareEveryday commands:
docker compose restart # apply cfg/ changes (bind-mounted)
docker compose up -d --build # apply scripts/ or Dockerfile changes
docker compose down # stop (keeps the 35 GB download)
docker compose down -v # stop AND delete the game files
docker attach csgo-server # live server console (Ctrl-P Ctrl-Q to detach)-
Everyone enables the console once: Settings > Game > Enable Developer Console > Yes.
-
Press
~(tilde) in game. -
Type:
connect 192.168.202.26:27015 -
If
SV_PASSWORDis set in.env, guests type this first, then connect:password yourpassword connect 192.168.202.26:27015
With SV_LAN=1 the server broadcasts itself. Guests go to
Play -> Browse Community Servers -> LAN tab and it appears with no typing.
This only works if everyone is on the same subnet
The client autoexec.cfg sets cl_join_advertise 2, so once one is in the server, their Steam friends can right-click > Join Game and get pulled straight in.
SourceTV is on. Anyone can watch without taking a player slot:
connect 192.168.202.26:27020
From inside the game, once connected:
rcon_password yourrconpassword
rcon mp_warmup_end // skip warmup, start the match
rcon exec practice // nade practice mode (infinite nades, trajectories)
rcon exec live // back to match rules, knife round, LIVE
rcon changelevel de_mirage
rcon status // who's connected
rcon bot_quota 6 // pad out the teams with bots
Minimal server requirements: 2 cores, 4 GB RAM, 40 GB disk, wired ethernet. Then:
Enabled by default via ENABLE_SOURCEMOD=1 in .env. Set it to 0 for a vanilla server.
scripts/install-sourcemod.sh pulls and installs, on first start:
| Component | Version | Why |
|---|---|---|
| MetaMod:Source | 1.11.0-git1156 | plugin loader, ships metamod.2.csgo.so |
| SourceMod | 1.11.0-git6970 | plugin platform, about 65 MB |
| PTaH | v1.1.4 | ships PTaH.ext.2.csgo.so, required by the skin plugin |
| kgns/weapons | v1.7.8 | the skin changer itself |
| Chat | Also | What it does |
|---|---|---|
!ws |
!ws in console as sm_ws, or the buyammo1 bind |
weapon skin menu: skin, float, StatTrak, name tag |
!knife |
!kf, or the buyammo2 bind |
knife model and its skin |
!nametag |
custom name tag on the current weapon | |
!seed |
pattern seed, the thing that decides fade percentage and case hardened blue | |
!wslang |
each player picks their own skin list language | |
!wsreset <player> |
admin only, root flag | wipes someone's saved skins and knife |
There is no !skin and no !skins. Those are commands from other plugins.
Gloves and agents come from two more plugins, both installed and verified loaded:
| Chat | Plugin | What it does |
|---|---|---|
!gloves |
kgns/gloves v1.0.5 | glove model and skin, with float |
!glove |
same | alias |
!gllang |
same | glove list language |
!agents |
Mazepa Agent Selector | agent model menu, 46 legacy agents |
!agent |
same | alias |
!tp |
same | third person, disabled by default, see below |
Enjoy!
P.S. This project was made with the help of AI