Add 3 tutorials (3 files)
Browse Source
3 changed files
with 216 additions and 0 deletions
A
cs16-server-setup-checklist/en.md
+91 -0
A
fix-server-not-in-master-list/en.md
+46 -0
A
install-cs16-server-ubuntu-24-04/en.md
+79 -0
cs16-server-setup-checklist/en.md
A
| @@ -0,0 +1,91 @@ | ||
| 1 | +--- | |
| 2 | +title: "CS 1.6 Server Setup Checklist: From Empty VPS to Public Server" | |
| 3 | +excerpt: "An ordered checklist for standing up a public CS 1.6 server: OS prep, engine and game DLL, Metamod and AMXX, non-Steam support, security, and the go-live verification." | |
| 4 | +category: "installation" | |
| 5 | +tags: "checklist, server-setup" | |
| 6 | +image: "" | |
| 7 | +read_time: "8 min read" | |
| 8 | +--- | |
| 9 | +<p>This is the order, not a tutorial for each step — each phase links to its full guide. Follow it top to bottom on a fresh VPS and you will not paint yourself into a corner, which is what happens when people install AMXX before Metamod or open the firewall before setting an RCON password. Treat every checkbox as "done and verified" before moving on.</p> | |
| 10 | + | |
| 11 | +<h2>1. Prepare the OS</h2> | |
| 12 | +<ul> | |
| 13 | +<li>A 64-bit Debian or Ubuntu VPS is fine — HLDS is 32-bit, so you must add multiarch and the i386 runtime. This is the number-one "won't start" cause.</li> | |
| 14 | +<li>Create an unprivileged <code>steam</code> user. Never run the server as root.</li> | |
| 15 | +</ul> | |
| 16 | +<pre>sudo dpkg --add-architecture i386 && sudo apt update | |
| 17 | +sudo apt install -y lib32gcc-s1 lib32stdc++6 libc6:i386 | |
| 18 | +sudo adduser --disabled-password --gecos "" steam</pre> | |
| 19 | +<p>Full detail: <a href="/tutorials/install-cs16-dedicated-server-linux-steamcmd">the SteamCMD install guide</a>.</p> | |
| 20 | + | |
| 21 | +<h2>2. Install the base server (App 90)</h2> | |
| 22 | +<ul> | |
| 23 | +<li>Install SteamCMD, <code>login anonymous</code>, <code>app_update 90 validate</code> — twice, the first pass often skips <code>cstrike/</code>.</li> | |
| 24 | +<li>Get it from SteamCMD only, never a "ready pack" — see <a href="/tutorials/download-cs16-server-files-safely">safe downloads</a>.</li> | |
| 25 | +<li>Verify: <code>liblist.gam</code>, <code>hlds_run</code> and <code>hlds_linux</code> all exist, and the server boots to a map.</li> | |
| 26 | +</ul> | |
| 27 | + | |
| 28 | +<h2>3. Replace the engine and game logic</h2> | |
| 29 | +<ul> | |
| 30 | +<li><a href="/tutorials/install-rehlds-on-linux">ReHLDS</a> over stock HLDS — verify with <code>rehlds_version</code>.</li> | |
| 31 | +<li><a href="/tutorials/install-regamedll-cs16">ReGameDLL_CS</a> over <code>cs.so</code> — verify with <code>regamedll_version</code>, and copy <code>delta.lst</code> or you will crash on connect.</li> | |
| 32 | +</ul> | |
| 33 | + | |
| 34 | +<h2>4. Metamod and AMX Mod X</h2> | |
| 35 | +<ul> | |
| 36 | +<li><a href="/tutorials/install-metamod-r">Metamod-r</a> — pointed at from <code>liblist.gam</code>; verify with <code>meta list</code>.</li> | |
| 37 | +<li><a href="/tutorials/install-amx-mod-x-1-9">AMX Mod X 1.9</a> — listed in Metamod's <code>plugins.ini</code>; verify with <code>amxx version</code>.</li> | |
| 38 | +<li>Load the modules you need (<code>cstrike</code>, <code>fun</code>, etc.) and confirm with <code>amxx modules</code>.</li> | |
| 39 | +</ul> | |
| 40 | +<p>Order is load-bearing: engine → game DLL → Metamod → AMXX → ReAPI. Installing out of order is how you get <code>bad load</code>.</p> | |
| 41 | + | |
| 42 | +<h2>5. Admins and core plugins</h2> | |
| 43 | +<ul> | |
| 44 | +<li>Set up admins in <code>addons/amxmodx/configs/users.ini</code> by SteamID (or by name+password for non-Steam).</li> | |
| 45 | +<li>Install the plugins you run — see <a href="/tutorials/install-amxx-plugin-files">installing a plugin correctly</a>. An <a href="/plugins/csb-admin-menu">admin menu</a> and <a href="/plugins/csb-ban-manager">ban manager</a> are the usual first two.</li> | |
| 46 | +</ul> | |
| 47 | + | |
| 48 | +<h2>6. Non-Steam support (if you want it)</h2> | |
| 49 | +<ul> | |
| 50 | +<li>On ReHLDS, install <a href="/tutorials/make-server-accept-nonsteam">Reunion</a> and set a <code>SteamIdHashSalt</code> of at least 16 characters, or it refuses to load.</li> | |
| 51 | +<li>Decide your policy — Steam-only, non-Steam-only, or both — it affects how admins are identified.</li> | |
| 52 | +</ul> | |
| 53 | + | |
| 54 | +<h2>7. Configure and secure</h2> | |
| 55 | +<ul> | |
| 56 | +<li>Write <code>server.cfg</code>: <code>hostname</code>, rates, <code>mp_*</code> gameplay, and a long <code>rcon_password</code>.</li> | |
| 57 | +<li><strong><code>sv_lan 0</code></strong> — mandatory to appear in the master list.</li> | |
| 58 | +<li>Harden RCON: <code>sv_rcon_maxfailures</code>, <code>sv_rcon_minfailures</code>, <code>sv_filterban 1</code>.</li> | |
| 59 | +</ul> | |
| 60 | +<pre>hostname "My CS 1.6 Server" | |
| 61 | +sv_lan 0 | |
| 62 | +rcon_password "a-long-random-string" | |
| 63 | +sv_maxrate 25000 | |
| 64 | +sv_minrate 15000 | |
| 65 | +sv_rcon_maxfailures 5</pre> | |
| 66 | + | |
| 67 | +<h2>8. Firewall and go-live</h2> | |
| 68 | +<ul> | |
| 69 | +<li>Open UDP 27015 (game) and TCP 27015 (RCON).</li> | |
| 70 | +<li>Put the server under systemd so it survives a reboot.</li> | |
| 71 | +</ul> | |
| 72 | +<pre>sudo ufw allow 27015/udp | |
| 73 | +sudo ufw allow 27015/tcp</pre> | |
| 74 | + | |
| 75 | +<h2>Pre-launch verification</h2> | |
| 76 | +<p>Run this list in the server console before you advertise the IP. Every one must pass:</p> | |
| 77 | +<pre>rehlds_version // prints a version | |
| 78 | +regamedll_version // prints a version | |
| 79 | +meta list // every plugin RUN | |
| 80 | +amxx plugins // every plugin running | |
| 81 | +status // correct map, slots, public IP</pre> | |
| 82 | +<p>Then, from a second machine, <code>connect YOUR_IP:27015</code> and play a full round including a map change — the map change is where a bad <code>delta.lst</code> or a missing asset shows up. Confirm the server appears in the internet list (needs <code>sv_lan 0</code> and a reachable UDP port); if it does not, that is a master-list problem, not a config one. When all of that holds, the server is genuinely public-ready.</p> | |
| 83 | + | |
| 84 | +<h2>Why the order is not negotiable</h2> | |
| 85 | +<p>The temptation is to skip ahead — install AMXX before Metamod, open the firewall before setting a password, add plugins before the engine is stable. Each shortcut has a specific cost. AMXX before Metamod cannot load, because Metamod is what loads it. ReAPI before ReGameDLL fails, because ReAPI hooks functions that only exist in ReGameDLL. A public port before an RCON password is a window in which anyone scanning the internet list can try to seize your console. The dependency chain — engine, then game DLL, then loader, then AMXX, then anything that hooks the game — is the same chain that determines what crashes when something is wrong, which is why every troubleshooting guide asks "did you install in order" first.</p> | |
| 86 | + | |
| 87 | +<h2>Post-launch, keep it running</h2> | |
| 88 | +<p>Launching is not the end. Three things separate a server that survives its first week from one that does not. Put it under a process supervisor (systemd) so a crash restarts it and a reboot brings it back — <code>hlds_run</code> restarts the inner binary but not the whole service. Keep the Valve <code>.bak</code> files you made when swapping the engine and game DLL; they are your only fast rollback. And watch the logs for the first few days:</p> | |
| 89 | +<pre>tail -f /home/steam/hlds/cstrike/addons/amxmodx/logs/*.log | |
| 90 | +tail -f /home/steam/hlds/debug.log</pre> | |
| 91 | +<p>A repeating warning on every map change is a real problem that has not crashed you yet — a stale <code>delta.lst</code>, a plugin erroring quietly, a missing asset. Fix those while the server is small, because they get exponentially harder to diagnose once there are thirty players and a full plugin set to bisect. A server that boots clean, cycles its whole mapcycle with players on it, and logs nothing repeating is one you can safely walk away from.</p> |
fix-server-not-in-master-list/en.md
A
| @@ -0,0 +1,46 @@ | ||
| 1 | +--- | |
| 2 | +title: "Fix: My CS 1.6 Server Doesn't Show in the Internet Server List" | |
| 3 | +excerpt: "A methodical checklist for a CS 1.6 server that runs fine but never appears in the internet server browser: sv_lan, heartbeats, inbound UDP, NAT, and the master server." | |
| 4 | +category: "errors" | |
| 5 | +tags: "master-server, listing" | |
| 6 | +image: "" | |
| 7 | +read_time: "8 min read" | |
| 8 | +--- | |
| 9 | +<p>Your server boots, you can connect to it by IP, but it never appears in the internet tab of the server browser. That is almost always one of three things: <code>sv_lan</code> is wrong, the server cannot reach the master server to heartbeat, or the master and clients cannot reach <em>your</em> game port to query it. Work them in order — the first is a one-line fix and rules out the most common cause.</p> | |
| 10 | + | |
| 11 | +<h2>1. sv_lan 0</h2> | |
| 12 | +<p>With <code>sv_lan 1</code> the engine never contacts the master list at all. It is the default reason a server is invisible. In <code>server.cfg</code>:</p> | |
| 13 | +<pre>sv_lan 0</pre> | |
| 14 | +<p>Set it in the config <em>and</em> pass <code>+sv_lan 0</code> on the command line so nothing else can flip it back. Restart fully; <code>sv_lan</code> is read at startup for master registration.</p> | |
| 15 | + | |
| 16 | +<h2>2. Force a heartbeat and watch</h2> | |
| 17 | +<p>The server announces itself to the master by sending a heartbeat. Trigger one manually and watch the console:</p> | |
| 18 | +<pre>heartbeat</pre> | |
| 19 | +<p>On a healthy server this produces master-server traffic. If nothing happens, the engine either thinks it is in LAN mode (step 1) or cannot route outbound to the master. Note that after the 2023 update, some old engine builds fail to reach the current master infrastructure at all — if you are on stock HLDS from years ago, move to <a href="/tutorials/install-rehlds-on-linux">ReHLDS</a>, which is maintained against the live master servers.</p> | |
| 20 | + | |
| 21 | +<h2>3. Your game port must be reachable from the internet</h2> | |
| 22 | +<p>The server browser does not just trust the heartbeat — it (and every client) queries your game port with an A2S_INFO request over UDP. If inbound UDP 27015 is blocked, the server may register but shows as unresponsive or never appears. Open it:</p> | |
| 23 | +<pre>sudo ufw allow 27015/udp | |
| 24 | +sudo ufw allow 27015/tcp</pre> | |
| 25 | +<p>Then verify the port is actually reachable from <em>outside</em> your network — a local test proves nothing. Use an external A2S/UDP port checker against <code>YOUR_PUBLIC_IP:27015</code>, or ask someone off your network to <code>connect</code> by IP. See <a href="/tutorials/cs16-server-firewall-ports">which ports to open</a> for the full list.</p> | |
| 26 | + | |
| 27 | +<h2>4. NAT and public IP</h2> | |
| 28 | +<p>If the box is behind NAT (a home connection, or a provider that hands you a private IP), the master sees your router's public address but the query never reaches the server unless UDP 27015 is forwarded to the machine's LAN IP. Forward it, and if the engine binds the wrong interface, pin it with <code>-ip</code>:</p> | |
| 29 | +<pre>./hlds_run -game cstrike -ip 0.0.0.0 -port 27015 +sv_lan 0 ...</pre> | |
| 30 | +<p>The full NAT walkthrough is in <a href="/tutorials/run-cs16-server-behind-nat">running a server behind NAT</a>. A server on a proper VPS with a public IP skips this entirely.</p> | |
| 31 | + | |
| 32 | +<h2>5. Region and provider blocks</h2> | |
| 33 | +<p>Set a sensible <code>sv_region</code> so the server lands in the right regional filter (an unset or wrong region can hide it from players filtering by continent):</p> | |
| 34 | +<pre>sv_region 3</pre> | |
| 35 | +<p>The region codes are the standard Valve set — 0 US East, 1 US West, 2 South America, 3 Europe, 4 Asia, 5 Australia, 6 Middle East, 7 Africa, 255 world. Pick the one your box actually sits in; a European server advertising itself as US East will still appear, but players filtering by their own region may never see it. Some budget hosts also block or rate-limit game UDP by default — if everything above checks out and it is still invisible, ask the provider directly whether they filter inbound UDP or the Steam master ports, because that is a wall no server-side setting can climb over.</p> | |
| 36 | + | |
| 37 | +<h2>Common errors</h2> | |
| 38 | +<ul> | |
| 39 | +<li><strong>Reachable by direct <code>connect</code> but never in the list</strong> — classic <code>sv_lan 1</code>, or the heartbeat is not leaving the box. Steps 1 and 2.</li> | |
| 40 | +<li><strong>Appears then disappears</strong> — intermittent outbound connectivity to the master, or the server is timing out A2S queries under load. Check for packet loss and query-flood protection set too aggressively.</li> | |
| 41 | +<li><strong>Shows in the list but "server not responding" on click</strong> — inbound UDP 27015 is filtered; the master knows about it but clients cannot query it. Step 3.</li> | |
| 42 | +<li><strong>Only friends on your LAN see it</strong> — NAT with no port forward, step 4.</li> | |
| 43 | +</ul> | |
| 44 | + | |
| 45 | +<h2>Verification</h2> | |
| 46 | +<p>In the console, <code>status</code> should show your <strong>public</strong> IP, not a 10.x/192.168.x address. From a machine on a different network, open the server browser, add the server to favourites by <code>YOUR_PUBLIC_IP:27015</code>, and confirm it shows as responsive with the correct map and player count. If favourites work but the internet tab does not after all of the above, the remaining variable is the provider — the engine side is correct. For the ground-up setup that avoids all of this, see the <a href="/tutorials/install-cs16-dedicated-server-linux-steamcmd">Linux install guide</a>.</p> |
install-cs16-server-ubuntu-24-04/en.md
A
| @@ -0,0 +1,79 @@ | ||
| 1 | +--- | |
| 2 | +title: "Install a CS 1.6 Server on Ubuntu 24.04 LTS" | |
| 3 | +excerpt: "A focused, current install of a CS 1.6 dedicated server on Ubuntu 24.04 LTS: the exact i386 packages, SteamCMD from multiverse, and the 24.04-specific gotchas." | |
| 4 | +category: "installation" | |
| 5 | +tags: "ubuntu, linux" | |
| 6 | +image: "" | |
| 7 | +read_time: "8 min read" | |
| 8 | +--- | |
| 9 | +<p>Ubuntu 24.04 LTS (Noble) is a fine host for a CS 1.6 server, but it is a pure 64-bit release that ships none of the 32-bit runtime HLDS is built against. Nearly every "installed but won't start" report on 24.04 comes from that gap. This guide is the 24.04-specific path; for the platform-agnostic detail see <a href="/tutorials/install-cs16-dedicated-server-linux-steamcmd">the general SteamCMD guide</a>.</p> | |
| 10 | + | |
| 11 | +<h2>1. Create an unprivileged user</h2> | |
| 12 | +<p>Do not run a 20-year-old network binary as root.</p> | |
| 13 | +<pre>sudo adduser --disabled-password --gecos "" steam | |
| 14 | +sudo su - steam</pre> | |
| 15 | + | |
| 16 | +<h2>2. Enable i386 and multiverse, then install the runtime</h2> | |
| 17 | +<p>On 24.04 the package names are the current ones — <code>lib32gcc-s1</code>, not the old <code>lib32gcc1</code>:</p> | |
| 18 | +<pre>sudo dpkg --add-architecture i386 | |
| 19 | +sudo add-apt-repository multiverse | |
| 20 | +sudo apt update | |
| 21 | +sudo apt install -y lib32gcc-s1 lib32stdc++6 libc6:i386 \ | |
| 22 | + libncurses6:i386 libcurl4:i386 ca-certificates tar wget</pre> | |
| 23 | +<p>The full reasoning and per-package breakdown is in <a href="/tutorials/install-32bit-libraries-cs16-linux">the 32-bit library guide</a>. Skip these and the server dies with <code>./hlds_linux: No such file or directory</code> — which is the kernel reporting the missing 32-bit ELF loader, not a missing binary.</p> | |
| 24 | + | |
| 25 | +<h2>3. Install SteamCMD</h2> | |
| 26 | +<p>Ubuntu packages SteamCMD in multiverse, which is the tidy option on 24.04:</p> | |
| 27 | +<pre>sudo apt install -y steamcmd</pre> | |
| 28 | +<p>That installs the <code>steamcmd</code> wrapper. (If you prefer the tarball, the manual method in the general guide works identically on 24.04.) Run it once so it self-updates:</p> | |
| 29 | +<pre>steamcmd +quit</pre> | |
| 30 | + | |
| 31 | +<h2>4. Download App 90</h2> | |
| 32 | +<pre>steamcmd +force_install_dir /home/steam/hlds \ | |
| 33 | + +login anonymous \ | |
| 34 | + +app_set_config 90 mod cstrike \ | |
| 35 | + +app_update 90 validate \ | |
| 36 | + +quit</pre> | |
| 37 | +<p>Run the exact same command a second time. App 90's anonymous download regularly finishes the base Half-Life files and skips <code>cstrike/</code> on the first pass; the second pass fills it in. If you see <code>Error! App '90' state is 0x402 after update job.</code>, that means the download was interrupted — just re-run and SteamCMD resumes.</p> | |
| 38 | + | |
| 39 | +<h2>5. Verify the files exist</h2> | |
| 40 | +<pre>ls /home/steam/hlds/cstrike/liblist.gam | |
| 41 | +ls /home/steam/hlds/hlds_run /home/steam/hlds/hlds_linux</pre> | |
| 42 | +<p>All three must be present. <code>liblist.gam</code> is what tells the engine which game library to load; if it is missing, the mod did not download and you repeat step 4.</p> | |
| 43 | + | |
| 44 | +<h2>6. Minimal config and first start</h2> | |
| 45 | +<p>Create <code>/home/steam/hlds/cstrike/server.cfg</code> with at least a hostname, an rcon password, and <code>sv_lan 0</code> (a full annotated file is in <a href="/tutorials/setup-server-cfg-cs16">the server.cfg guide</a>). Then:</p> | |
| 46 | +<pre>cd /home/steam/hlds | |
| 47 | +./hlds_run -game cstrike -strictportbind -ip 0.0.0.0 -port 27015 \ | |
| 48 | + +map de_dust2 +maxplayers 20 +sv_lan 0</pre> | |
| 49 | +<p><code>sv_lan 0</code> is mandatory to appear on the master list; with <code>sv_lan 1</code> the server never heartbeats and Steam clients are refused.</p> | |
| 50 | + | |
| 51 | +<h2>7. Firewall with ufw</h2> | |
| 52 | +<p>24.04 ships ufw. Open the game port for both protocols (UDP is gameplay, TCP is RCON):</p> | |
| 53 | +<pre>sudo ufw allow 27015/udp | |
| 54 | +sudo ufw allow 27015/tcp</pre> | |
| 55 | +<p>Details and the optional HLTV/query ports are in <a href="/tutorials/cs16-server-firewall-ports">which ports to open</a>.</p> | |
| 56 | + | |
| 57 | +<h2>Why 24.04 needs this when older boxes did not</h2> | |
| 58 | +<p>Old CS 1.6 tutorials assume a 32-bit or multilib-by-default distro, which is why they never mention the i386 packages. 24.04 dropped all of that: it is 64-bit only and installs no 32-bit userland at all. The HLDS binary has not changed — it is still the same 2003-era 32-bit ELF — so the fix is to add back the runtime it expects. This is a one-time step per host; once the i386 libraries are present, ReHLDS, ReGameDLL, Metamod and every AMXX module reuse them.</p> | |
| 59 | + | |
| 60 | +<h2>Harden the box while you are here</h2> | |
| 61 | +<p>24.04 ships ufw disabled by default. If you enable it, set a default-deny inbound policy and then open only what you need, or you will lock yourself out of SSH:</p> | |
| 62 | +<pre>sudo ufw allow OpenSSH | |
| 63 | +sudo ufw allow 27015/udp | |
| 64 | +sudo ufw allow 27015/tcp | |
| 65 | +sudo ufw enable</pre> | |
| 66 | +<p>Run the server as the unprivileged <code>steam</code> user (step 1), keep the OS patched, and put the launch behind a <a href="/tutorials/hlds-systemd-service">systemd unit</a> rather than a login shell so a dropped SSH session never takes the server down with it.</p> | |
| 67 | + | |
| 68 | +<h2>Common errors on 24.04</h2> | |
| 69 | +<ul> | |
| 70 | +<li><strong><code>./hlds_linux: No such file or directory</code></strong> — the i386 runtime is missing even though the file is clearly there. Install the packages in step 2. This is the number-one 24.04 issue.</li> | |
| 71 | +<li><strong><code>error while loading shared libraries: libstdc++.so.6: cannot open shared object file</code></strong> — you have the 64-bit <code>libstdc++6</code> but not <code>lib32stdc++6</code>. Add the 32-bit one.</li> | |
| 72 | +<li><strong><code>steamcmd: command not found</code></strong> — multiverse is not enabled. Run <code>add-apt-repository multiverse</code> and <code>apt update</code>.</li> | |
| 73 | +<li><strong>SteamCMD complains it cannot find a 32-bit loader</strong> — the <code>steamcmd</code> package pulls i386 deps, but if you added the repo after installing, run <code>sudo apt install --reinstall steamcmd</code>.</li> | |
| 74 | +<li><strong>Server starts but nobody finds it</strong> — <code>sv_lan</code> is 1, or the provider blocks inbound UDP. Confirm the bind with <code>ss -lunp | grep 27015</code>.</li> | |
| 75 | +</ul> | |
| 76 | + | |
| 77 | +<h2>Verification</h2> | |
| 78 | +<pre>ss -lunp | grep 27015</pre> | |
| 79 | +<p>should show <code>hlds_linux</code> bound to the UDP port. Type <code>status</code> in the console for the map, hostname, and slot count, then from another machine run <code>connect YOUR_IP:27015</code>. Once you spawn, the base install is done. Next, put it behind a <a href="/tutorials/hlds-systemd-service">systemd service</a> so it survives reboots, and upgrade the engine to <a href="/tutorials/install-rehlds-on-linux">ReHLDS</a>.</p> | |
| 0 | 80 |









