Prérequis
- Un serveur sous Ubuntu, Debian, AlmaLinux, Rocky, CentOS, Fedora ou openSUSE : voir nos VPS au Canada
- Une connexion SSH ouverte en root : Se connecter en SSH à votre VPS
- 4 Go de disque libre et 2 Go de RAM
Ce guide installe le serveur dédié Counter-Strike 1.6 (HLDS, le moteur GoldSrc) avec SteamCMD, l'outil de Valve : un utilisateur dédié, le serveur (moins de 1 Go), server.cfg, un service qui le démarre avec la machine, la sonde qui prouve qu'il répond, le pare-feu, la connexion depuis le jeu, RCON et la mise à jour. Choisissez votre système ci-dessus. Copiez la commande avec le bouton Copier, collez-la dans votre terminal, et comparez avec le résultat attendu.
1Mettre à jour le système et installer les bibliothèques 32 bits
SteamCMD, l'outil de Valve qui télécharge les serveurs de jeux, est un programme 32 bits : il lui faut les bibliothèques 32 bits du système. On met d'abord le système à jour ; sans cela, l'installation 32 bits échoue sur AlmaLinux, Rocky, CentOS et Fedora (conflit avec une bibliothèque plus ancienne), et SteamCMD ne peut pas joindre Steam sur une Fedora fraîche (certificats absents).
apt update && apt upgrade -y... 212 upgraded, 8 newly installed, 0 to remove and 4 not upgraded. (les nombres dépendent de l'âge de l'image)
dnf upgrade -y... Complete!
dnf upgrade -y... Complete!
zypper -n refresh && zypper -n updateAll repositories have been refreshed. ...
dpkg --add-architecture i386 && apt update && apt install -y lib32gcc-s1 lib32stdc++6 curldnf install -y glibc.i686 libstdc++.i686dnf install -y glibc.i686 libstdc++.i686zypper -n install glibc-32bit libstdc++6-32bitopenSUSE Leap 16 livre son noyau avec l'exécution des programmes 32 bits désactivée : sans cette étape, SteamCMD répond « Exec format error ». On l'active dans GRUB et on redémarre (reconnectez-vous en SSH après une minute).
sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="ia32_emulation=1 /' /etc/default/grub && grub2-mkconfig -o /boot/grub2/grub.cfg && rebootgrep -o ia32_emulation=1 /proc/cmdlineia32_emulation=1
2Créer un utilisateur dédié et installer SteamCMD
Le serveur ne tourne jamais en root : un utilisateur cs16, dont le dossier personnel est /opt/cs16, possède SteamCMD et le serveur. Le dossier est créé avant l'utilisateur : sur Rocky et CentOS, SELinux refuse à useradd de le créer lui-même sous /opt.
mkdir -p /opt/cs16/server /opt/cs16/steamcmd && useradd -r -s /bin/bash -d /opt/cs16 cs16 && chown -R cs16:cs16 /opt/cs16su - cs16 -c "cd /opt/cs16/steamcmd && curl -fsSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar zxf - && ls"linux32 steamcmd.sh
3Télécharger le serveur Counter-Strike 1.6
Le serveur Counter-Strike 1.6 est l'application 90 de Steam, le serveur Half-Life, avec le mod cstrike : l'option +app_set_config 90 mod cstrike dit à SteamCMD de prendre ce mod. Une à deux minutes. Si le passage se termine sur « ERROR! Failed to install app '90' (Missing configuration) » sans rien télécharger : relancez la même commande, elle passe.
su - cs16 -c "/opt/cs16/steamcmd/steamcmd.sh +force_install_dir /opt/cs16/server +login anonymous +app_set_config 90 mod cstrike +app_update 90 validate +quit"... Success! App '90' fully installed.
du -sh /opt/cs16/server && ls -l /opt/cs16/server/hlds_run && ls /opt/cs16/server/cstrike/maps/*.bsp | wc -l1.1G /opt/cs16/server -rwxrwxr-x 1 cs16 cs16 7778 Sep 21 23:18 /opt/cs16/server/hlds_run 25 (931M à 1.1G selon le système ; les droits et la date varient)
cd /opt/cs16/server && LD_LIBRARY_PATH=. ldd hlds_linux engine_i486.so cstrike/dlls/cs.so | grep -c 'not found'; cd /4Préparer le serveur : bibliothèque Steam, configuration, script de démarrage
Le serveur est un programme 32 bits : il cherche steamclient.so dans ~/.steam/sdk32, on y met un lien vers celui de SteamCMD. Le jeu livre un server.cfg d'exemple ; celui ci-dessous le remplace avec le nom du serveur et le mot de passe RCON : changez-les.
su - cs16 -c "mkdir -p ~/.steam/sdk32 && ln -sf /opt/cs16/steamcmd/linux32/steamclient.so ~/.steam/sdk32/steamclient.so"cat > /opt/cs16/server/cstrike/server.cfg << 'EOF'
hostname "Mon serveur Counter-Strike 1.6"
rcon_password "ChangezMoi"
sv_password ""
sv_region 0
sv_aim 0
pausable 0
sv_cheats 0
mp_timelimit 20
mp_friendlyfire 0
EOF
chown cs16:cs16 /opt/cs16/server/cstrike/server.cfgLe script de démarrage porte la carte et le nombre de joueurs.
cat > /opt/cs16/start.sh << 'EOF'
#!/bin/sh
cd /opt/cs16/server
exec ./hlds_run -game cstrike -console -condebug -norestart -ip 0.0.0.0 -port 27015 +maxplayers 16 +map de_dust2
EOF
chmod +x /opt/cs16/start.sh && chown -R cs16:cs16 /opt/cs16+map de_dust2- La carte de départ ; 25 cartes sont livrées dans cstrike/maps (de_dust, de_inferno, de_nuke, de_train, de_aztec, cs_office, cs_italy, cs_assault...)
+maxplayers 16- Le nombre de joueurs
-condebug- Écrit la console du serveur dans cstrike/qconsole.log
mp_timelimit- Dans server.cfg : la durée d'une carte en minutes
mp_friendlyfire- Dans server.cfg : 1 pour que les tirs blessent aussi les coéquipiers
sv_aim, pausable, sv_cheats- Dans server.cfg : la visée assistée, la pause par les joueurs et les triches, tous à 0
cstrike/mapcycle.txt- L'ordre des cartes, livré avec le jeu : une carte par ligne
5Démarrer le serveur comme un service
Le service systemd lance start.sh avec l'utilisateur cs16, relance le serveur s'il plante et le démarre avec la machine.
cat > /etc/systemd/system/cs16.service << 'EOF'
[Unit]
Description=Serveur Counter-Strike 1.6
After=network.target
[Service]
User=cs16
Group=cs16
WorkingDirectory=/opt/cs16/server
ExecStart=/opt/cs16/start.sh
Restart=on-failure
RestartSec=15
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload && systemctl enable --now cs16Created symlink /etc/systemd/system/multi-user.target.wants/cs16.service → /etc/systemd/system/cs16.service.
Le serveur est prêt en moins d'une minute : il annonce sa connexion à Steam dans cstrike/qconsole.log et écoute sur le port 27015. Il prend 130 Mo de mémoire sans joueur.
systemctl is-active cs16 && grep -E 'Connection to Steam|VAC secure' /opt/cs16/server/cstrike/qconsole.log && ss -lunp | grep 27015active
Connection to Steam servers successful.
VAC secure mode is activated.
UNCONN 0 0 0.0.0.0:27015 0.0.0.0:* users:(("hlds_linux",pid=50785,fd=10))La sonde ci-dessous interroge le serveur comme le fait la liste des serveurs.
python3 - << 'EOF'
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.settimeout(5)
q = b'\xff\xff\xff\xffTSource Engine Query\x00'
s.sendto(q, ('127.0.0.1', 27015)); r = s.recvfrom(4096)[0]
if r[4:5] == b'A':
s.sendto(q + r[5:9], ('127.0.0.1', 27015)); r = s.recvfrom(4096)[0]
p = r[6:].split(b'\x00')
print(p[0].decode(), '|', p[1].decode(), '|', p[2].decode())
EOFMon serveur Counter-Strike 1.6 | de_dust2 | cstrike
6Ouvrir les ports dans le pare-feu
Les joueurs se connectent en UDP sur le port 27015 ; le TCP sert à RCON. La commande active le pare-feu du système en gardant SSH autorisé, puis ouvre les ports.
apt install -y ufw && ufw allow 22/tcp && ufw allow 27015/udp && ufw allow 27015/tcp && ufw --force enable... Firewall is active and enabled on system startup
dnf install -y firewalld && systemctl enable --now firewalld && firewall-cmd --permanent --add-port=27015/udp --add-port=27015/tcp && firewall-cmd --reload... success success
dnf install -y firewalld && systemctl enable --now firewalld && firewall-cmd --permanent --add-port=27015/udp --add-port=27015/tcp && firewall-cmd --reload... success success
firewall-cmd --permanent --add-port=27015/udp --add-port=27015/tcp && firewall-cmd --reloadsuccess success
ufw statusStatus: active 22/tcp ALLOW Anywhere 27015/udp ALLOW Anywhere 27015/tcp ALLOW Anywhere
firewall-cmd --list-ports27015/udp 27015/tcp
firewall-cmd --list-ports27015/udp 27015/tcp
firewall-cmd --list-ports27015/udp 27015/tcp
7Se connecter et administrer
- Lancez Counter-Strike 1.6 et activez la console dans les options (Clavier, Avancé, Activer la console de développement).
- Ouvrez la console avec la touche ~ (ou ` selon le clavier).
- Si le serveur a un mot de passe (sv_password), tapez d'abord : password votre_mot_de_passe
- Tapez : connect 203.0.113.42:27015 (l'adresse IP de votre serveur).
Depuis la console du jeu, une fois connecté, vous commandez le serveur avec le mot de passe RCON de server.cfg :
rcon_password ChangezMoircon changelevel de_infernorcon kick NOMrcon statusrcon sv_password motdepassercon mp_timelimit 308Gérer et mettre à jour le serveur
systemctl status cs16tail -f /opt/cs16/server/cstrike/qconsole.logsystemctl restart cs16systemctl stop cs16Après une mise à jour du jeu, mettez le serveur à jour : la même commande que l'installation, serveur arrêté.
systemctl stop cs16 && su - cs16 -c "/opt/cs16/steamcmd/steamcmd.sh +force_install_dir /opt/cs16/server +login anonymous +app_set_config 90 mod cstrike +app_update 90 +quit" && systemctl start cs16... Success! App '90' already up to date. (« fully installed » quand une mise à jour a été téléchargée)
Serveur prêt
Votre serveur Counter-Strike 1.6 démarre avec la machine, se relance s'il tombe et écoute sur le port 27015. La même base SteamCMD sert aux autres serveurs de jeux.
Erreurs fréquentes
L'image du serveur a été construite sur un autre disque et GRUB demande où se réinstaller : choisissez le disque de la machine (celui que lsblk affiche, en général /dev/sda) ; la mise à jour continue ensuite.
Un raté passager côté Steam : relancez la même commande, le téléchargement reprend.
Le système n'a pas été mis à jour avant : faites la première boîte de l'étape 1, puis réessayez.
Les programmes 32 bits sont désactivés dans le noyau : appliquez la dernière boîte de l'étape 1 et redémarrez.
Plusieurs serveurs de jeux tournent sur la même machine, chacun avec son utilisateur, et SteamCMD a déjà créé dix dossiers /tmp/dumps, /tmp/dumps01... /tmp/dumps09 qui appartiennent aux autres : lancez rm -rf /tmp/dumps* en root, puis relancez la commande.
Trois fichiers facultatifs que le serveur cherche à chaque démarrage (réglages par carte, adresses et joueurs bannis) : sans effet tant que vous n'en avez pas. La ligne « Connection to Steam servers successful. » qui suit dit que le serveur est en service.
Le serveur n'a pas fini de démarrer, ou le service n'est pas actif : attendez une minute et vérifiez systemctl status cs16. Depuis une autre machine, il faut aussi le pare-feu de l'étape 6.