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
- 15 Go de disque libre et 4 Go de RAM
- Un jeton de serveur de jeu Steam (GSLT) pour un serveur bien classé dans la liste publique, facultatif : créer le jeton sur Steam
Ce guide installe le serveur dédié Garry's Mod avec SteamCMD, l'outil de Valve : un utilisateur dédié, le serveur (6,5 Go), un service qui le démarre avec la machine, le pare-feu, la connexion depuis le jeu 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 gmod, dont le dossier personnel est /opt/gmod, 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/gmod/server /opt/gmod/steamcmd && useradd -r -s /bin/bash -d /opt/gmod gmod && chown -R gmod:gmod /opt/gmodsu - gmod -c "cd /opt/gmod/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 Garry's Mod (6,5 Go)
SteamCMD se met à jour puis télécharge l'application 4020, le serveur dédié Garry's Mod. Comptez de deux à dix minutes selon la machine. Si la commande se termine sur une erreur, relancez-la : elle reprend où elle en était.
su - gmod -c "/opt/gmod/steamcmd/steamcmd.sh +force_install_dir /opt/gmod/server +login anonymous +app_update 4020 validate +quit"... Update state (0x61) downloading, progress: 98.22 (6764344923 / 6886764390) Success! App '4020' fully installed.
du -sh /opt/gmod/server && ls -l /opt/gmod/server/srcds_run6.5G /opt/gmod/server -rwxrwxr-x 1 gmod gmod 10183 Sep 20 19:24 /opt/gmod/server/srcds_run (les droits et la date varient selon le système)
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 fichier server.cfg porte le nom du serveur et le mot de passe RCON ; changez-les.
su - gmod -c "mkdir -p ~/.steam/sdk32 && ln -sf /opt/gmod/steamcmd/linux32/steamclient.so ~/.steam/sdk32/steamclient.so"cat > /opt/gmod/server/garrysmod/cfg/server.cfg << 'EOF'
hostname "Mon serveur Garry's Mod"
rcon_password "ChangezMoi"
sv_password ""
sv_region 0
EOFLe script de démarrage porte la carte, le mode de jeu et le nombre de joueurs. Avec un jeton GSLT, ajoutez +sv_setsteamaccount VOTRE_TOKEN_GSLT à la fin de la ligne exec ; sans jeton, le serveur démarre en compte anonyme, joignable par son adresse, moins bien classé dans la liste publique.
cat > /opt/gmod/start.sh << 'EOF'
#!/bin/sh
cd /opt/gmod/server
exec ./srcds_run -game garrysmod -console -condebug -norestart -ip 0.0.0.0 -port 27015 +maxplayers 16 +map gm_construct +gamemode sandbox
EOF
chmod +x /opt/gmod/start.sh && chown -R gmod:gmod /opt/gmod+map gm_construct- La carte de départ ; gm_flatgrass est l'autre carte livrée avec le jeu
+gamemode sandbox- Le mode de jeu ; les autres viennent du Workshop
+maxplayers 16- Le nombre de joueurs
-condebug- Écrit la console du serveur dans garrysmod/console.log
+host_workshop_collection ID -authkey CLE- Charge une collection du Workshop au démarrage ; la clé vient de steamcommunity.com/dev/apikey
5Démarrer le serveur comme un service
Le service systemd lance start.sh avec l'utilisateur gmod, relance le serveur s'il plante et le démarre avec la machine.
cat > /etc/systemd/system/gmod.service << 'EOF'
[Unit]
Description=Serveur Garry's Mod
After=network.target
[Service]
User=gmod
Group=gmod
WorkingDirectory=/opt/gmod/server
ExecStart=/opt/gmod/start.sh
Restart=on-failure
RestartSec=15
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload && systemctl enable --now gmodCreated symlink /etc/systemd/system/multi-user.target.wants/gmod.service → /etc/systemd/system/gmod.service.
Sous systemd, le journal du serveur s'arrête après deux lignes « SteamAPI_Init » : c'est normal, le serveur tourne. Sa console est dans garrysmod/console.log, et la preuve qu'il répond vient du port et de la sonde ci-dessous, qui l'interroge comme le fait la liste des serveurs. Remplacez 203.0.113.42 par l'adresse IP de votre serveur : la sonde ne répond pas sur 127.0.0.1.
systemctl is-active gmod && ss -lunp | grep 27015active
UNCONN 0 0 0.0.0.0:27015 0.0.0.0:* users:(("srcds_linux",pid=33434,fd=7))python3 - 203.0.113.42 << 'EOF'
import socket, sys
h = sys.argv[1]
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.settimeout(5)
q = b'\xff\xff\xff\xffTSource Engine Query\x00'
s.sendto(q, (h, 27015)); r = s.recvfrom(4096)[0]
if r[4:5] == b'A':
s.sendto(q + r[5:9], (h, 27015)); r = s.recvfrom(4096)[0]
p = r[6:].split(b'\x00')
print(p[0].decode(), '|', p[1].decode(), '|', p[3].decode())
EOFMon serveur Garry's Mod | gm_construct | Sandbox
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
7Se connecter et administrer
- Lancez Garry's Mod et activez la console dans les paramètres (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 gm_flatgrassrcon kick NomDuJoueurrcon statusrcon sv_password motdepasse8Gérer et mettre à jour le serveur
systemctl status gmodtail -f /opt/gmod/server/garrysmod/console.logsystemctl restart gmodsystemctl stop gmodAprès une mise à jour du jeu, les joueurs à jour ne peuvent plus entrer sur un serveur en retard : la mise à jour est la même commande que l'installation, serveur arrêté.
systemctl stop gmod && su - gmod -c "/opt/gmod/steamcmd/steamcmd.sh +force_install_dir /opt/gmod/server +login anonymous +app_update 4020 +quit" && systemctl start gmod... Success! App '4020' fully installed. (ou « already up to date » s'il n'y a rien de neuf)
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.
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.
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.
Le serveur tourne : sans terminal, il garde sa sortie pour lui. Regardez garrysmod/console.log, le port 27015 et la sonde de l'étape 5.
Elle ne répond jamais sur 127.0.0.1 : mettez l'adresse IP publique du serveur. Depuis une autre machine, il faut aussi le pare-feu de l'étape 6.
Le serveur tourne sans jeton GSLT. La connexion par adresse marche ; pour un meilleur classement dans la liste publique, ajoutez +sv_setsteamaccount avec votre jeton dans start.sh, puis systemctl restart gmod.
Aucune collection du Workshop n'est demandée : le serveur tourne avec le contenu de base. Pour en charger une, ajoutez +host_workshop_collection et -authkey à start.sh.
Un avertissement sans effet sur le serveur : il ne concerne que l'édition de ligne dans une console interactive.
Serveur prêt
Votre serveur Garry's Mod 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.