--- title: "Deploying a CS 1.6 Server on a Hetzner Cloud VPS" excerpt: "Pick the right Hetzner Cloud plan for a 32-bit game server, provision Ubuntu, lock down the Cloud Firewall, and stand up HLDS as an unprivileged user." category: "installation" tags: "hetzner, vps" image: "" read_time: "8 min read" ---
Hetzner Cloud is one of the cheapest reliable homes for a CS 1.6 server, but there is one decision that will make or break the deployment before you type a single command: the CPU architecture. HLDS is a 32-bit x86 binary, and Hetzner sells both x86 and ARM instances under confusingly similar names. Get that right and the rest is a standard Linux install.
In the Hetzner Cloud Console at console.hetzner.cloud, create a project and add a server. The plan families matter:
box86/box64 emulation, which is fragile and costs you CPU. Avoid CAX for a game server.The smallest CX or CPX plan comfortably runs a full 32-slot server; CS 1.6 is not demanding. Pick a location close to your players — ping is everything for a shooter — and see choosing a VPS for CS 1.6 if you are weighing providers.
Select the Ubuntu 24.04 image and attach your SSH public key during creation rather than using a root password — Hetzner emails a root password otherwise, and password auth on a public IP is a magnet for brute-force bots. Once the server boots, connect:
ssh root@YOUR_SERVER_IP
Hetzner offers a stateful Cloud Firewall that runs outside the VM, so it protects the box even before the OS firewall is configured. In the Console, create a firewall and attach it to the server. CS 1.6 needs one inbound rule that most people get wrong — the query and game traffic is UDP, not TCP:
Inbound UDP 27015 (game + A2S queries) Inbound TCP 22 (SSH, ideally from your IP only)
If you add RCON over a separate port or run HLTV, open those too. The full port list and the reasoning behind UDP is in CS 1.6 firewall ports.
Never run the game server as root. Create a dedicated user now:
adduser --disabled-password --gecos "" csserver su - csserver
Everything from here happens as csserver. The full rationale and a systemd unit that enforces it live in installing HLDS without root.
A fresh 64-bit Ubuntu cannot load a 32-bit binary until you add the i386 architecture and its libraries. As root:
dpkg --add-architecture i386 apt update apt install -y lib32gcc-s1 lib32stdc++6
Skipping this produces the classic No such file or directory on an executable that clearly exists — the loader is missing, not the file. See 32-bit libraries for CS 1.6 and the No such file fix.
Back as csserver, install SteamCMD and pull the dedicated server. This follows the same steps as any Linux box — nothing about Hetzner changes them:
mkdir -p ~/steamcmd ~/hlds cd ~/steamcmd curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxf - ./steamcmd.sh +force_install_dir ~/hlds +login anonymous +app_update 90 validate +quit
App 90 is the Half-Life dedicated server; it will download the CS files. The complete walkthrough, including selecting Counter-Strike as the mod, is in the SteamCMD dedicated server guide and the Ubuntu-specific 24.04 guide.
Start it once by hand to confirm it binds:
cd ~/hlds ./hlds_run -game cstrike +map de_dust2 +maxplayers 24 -port 27015
The -game cstrike and -port flags plus the rest are covered in HLDS command-line parameters. Once it works, wrap it in a systemd service so it survives reboots and crashes.
sv_lan is 1. Set sv_lan 0 in server.cfg and confirm the UDP rule.hlds_run: No such file or directory — the 32-bit loader is missing. Complete step 5.ufw may also be blocking.From your own PC, open the console in CS 1.6 and run connect YOUR_SERVER_IP:27015. If you join, the network path is correct. Then query it externally — the server should appear in the internet tab within a minute of sv_lan 0 and a live master-list connection. If it connects directly but never lists, revisit the firewall and sv_lan before touching anything else.