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
- 5 Go de disque libre et 2 Go de RAM
- Un jeton de serveur de jeu Steam (GSLT) pour que le serveur soit joignable par adresse et listé ; créé avec l'identifiant d'application 304930 : créer le jeton sur Steam
Ce guide installe le serveur dédié Unturned avec SteamCMD, l'outil de Valve : un utilisateur dédié, le serveur (1,9 Go), ses réglages dans Commands.dat, un service qui l'arrête proprement et le démarre avec la machine, la console commandée depuis le terminal à travers screen, le pare-feu, la sonde qui prouve qu'il répond, la connexion depuis le jeu, la sauvegarde de nuit 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 unturned, dont le dossier personnel est /opt/unturned, 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/unturned/server /opt/unturned/steamcmd && useradd -r -s /bin/bash -d /opt/unturned unturned && chown -R unturned:unturned /opt/unturnedsu - unturned -c "cd /opt/unturned/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 Unturned (1,9 Go)
SteamCMD se met à jour puis télécharge l'application 1110390, le serveur dédié Unturned. Comptez de deux à cinq minutes. Il arrive souvent que le premier passage se termine sur « ERROR! Failed to install app '1110390' (Missing configuration) » sans rien télécharger : relancez la même commande, elle passe.
su - unturned -c "/opt/unturned/steamcmd/steamcmd.sh +force_install_dir /opt/unturned/server +login anonymous +app_update 1110390 validate +quit"... Update state (0x61) downloading, progress: 17.98 (342121649 / 1902468407) ... Update state (0x0) unknown, progress: 0.00 (0 / 0) Success! App '1110390' fully installed.
du -sh /opt/unturned/server && ls -l /opt/unturned/server/ServerHelper.sh1.9G /opt/unturned/server -rwxrwxr-x 1 unturned unturned 925 Sep 21 16:22 /opt/unturned/server/ServerHelper.sh (les droits et la date varient)
4Écrire les réglages du serveur
Le lanceur ServerHelper.sh démarre un serveur nommé (ici MonServeur) et lit ses réglages dans Servers/MonServeur/Server/Commands.dat, une commande par ligne : le fichier est créé avant le premier démarrage. Changez le mot de passe. Avec un jeton GSLT, ajoutez une ligne GSLT suivie du jeton ; sans jeton, le serveur n'est ni listé ni joignable par adresse, seul son code de serveur (étape 7) permet d'entrer.
mkdir -p /opt/unturned/server/Servers/MonServeur/Server
cat > /opt/unturned/server/Servers/MonServeur/Server/Commands.dat << 'EOF'
Name Mon serveur Unturned
Password ChangezMoi
Map PEI
Port 27015
MaxPlayers 8
Perspective Both
Welcome Bienvenue sur mon serveur Unturned
EOF
chown -R unturned:unturned /opt/unturnedName- Le nom affiché dans la liste des serveurs
Password- Le mot de passe demandé aux joueurs
GSLT VOTRE_JETON- Le jeton Steam : sans lui, pas de liste Internet ni de connexion par adresse
Map- La carte : PEI, Washington, Russia, Germany, Yukon (dossier Maps)
Port- 27015 : le premier port sert à la liste des serveurs, le suivant (27016) au jeu
MaxPlayers- Le nombre de places
Owner VOTRE_STEAMID64- Votre identifiant Steam à 17 chiffres : les commandes d'administration depuis le jeu
Perspective- First, Third, Both ou Vehicle : les caméras permises
Mode, PvE, Cheats- Easy, Normal ou Hard ; PvE désactive le combat entre joueurs ; Cheats permet aux administrateurs de faire apparaître des objets
Welcome- Le message affiché à l'arrivée
5Démarrer le serveur comme un service
Unturned ne lit ses commandes que depuis un terminal : le service le lance dans screen, un terminal détaché, et l'arrête par la commande Shutdown, qui sauvegarde ; coupé autrement, il ne sauvegarde pas.
apt install -y screendnf install -y epel-release && dnf install -y screendnf install -y screenzypper -n install screendnf install -y policycoreutils-python-utils && semanage fcontext -a -t bin_t /usr/bin/screen && restorecon -v /usr/bin/screenRelabeled /usr/bin/screen from system_u:object_r:screen_exec_t:s0 to system_u:object_r:bin_t:s0
dnf install -y policycoreutils-python-utils && semanage fcontext -a -t bin_t /usr/bin/screen && restorecon -v /usr/bin/screenRelabeled /usr/bin/screen from system_u:object_r:screen_exec_t:s0 to system_u:object_r:bin_t:s0
cat > /etc/systemd/system/unturned.service << 'EOF'
[Unit]
Description=Serveur Unturned
After=network.target
[Service]
User=unturned
Group=unturned
WorkingDirectory=/opt/unturned/server
ExecStart=/usr/bin/screen -DmS unturned /opt/unturned/server/ServerHelper.sh +InternetServer/MonServeur
ExecStop=/bin/sh -c '/usr/bin/screen -S unturned -X stuff "Shutdown\n"; while /usr/bin/screen -ls | grep -q "[0-9].unturned"; do sleep 1; done'
TimeoutStopSec=90
Restart=on-failure
RestartSec=15
[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload && systemctl enable --now unturnedCreated symlink /etc/systemd/system/multi-user.target.wants/unturned.service → /etc/systemd/system/unturned.service.
Le serveur écrit son journal dans Logs/Server_MonServeur.log : les réglages lus, le code de serveur, l'avertissement sur le jeton, puis « Loading level: 100% » au bout d'une trentaine de secondes. Il prend 800 Mo de mémoire au repos.
systemctl is-active unturned && grep -E 'Successfully set name|Server Code|GSLT|Loading level: 100' /opt/unturned/server/Logs/Server_MonServeur.log | cut -c1-100 && ss -lunp | grep -E ':2701[56] 'active
[2026-09-21 16:38:32] Successfully set name to Mon serveur Unturned!
[2026-09-21 16:38:50] Server Code: 90293153879467016
[2026-09-21 16:38:51] Steam Game Server Login Token (GSLT) not set
[2026-09-21 16:38:51] Loading level: 100%
UNCONN 0 0 0.0.0.0:27015 0.0.0.0:* users:(("Unturned_Headle",pid=3867,fd=33))
UNCONN 0 0 *:27016 *:* users:(("Unturned_Headle",pid=3867,fd=39))
(le code de serveur est propre à chaque démarrage ; la ligne GSLT n'apparaît pas si le jeton est dans Commands.dat)6Ouvrir les ports dans le pare-feu
Le serveur écoute en UDP sur le port 27015 (liste des serveurs) et sur le port 27016 (jeu). 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:27016/udp && 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-27016/udp && firewall-cmd --reload... success success
dnf install -y firewalld && systemctl enable --now firewalld && firewall-cmd --permanent --add-port=27015-27016/udp && firewall-cmd --reload... success success
firewall-cmd --permanent --add-port=27015-27016/udp && firewall-cmd --reloadsuccess success
Depuis une autre machine, la sonde ci-dessous interroge le serveur comme le fait la liste des serveurs (remplacez 203.0.113.42 par l'adresse de votre serveur) :
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[2].decode())
EOFMon serveur Unturned | PEI | Unturned
7Se connecter au serveur
- Avec un jeton GSLT : lancez Unturned, puis Jouer (Play) et l'écran de connexion par adresse (Connect) : l'adresse IP de votre serveur (203.0.113.42), le port 27015 et le mot de passe.
- Sans jeton : donnez à vos amis le code de serveur du journal (« Server Code », étape 5) ; il s'entre dans le menu Connect Directly du jeu, sans adresse ni port.
8Commander le serveur depuis le terminal
Chaque commande s'envoie à la console du serveur à travers screen, en tant qu'utilisateur unturned ; la réponse s'écrit dans le journal du serveur, que la deuxième partie de la commande affiche.
su - unturned -c 'screen -S unturned -X stuff "Players\n"' && sleep 3 && tail -n 1 /opt/unturned/server/Logs/Server_MonServeur.log[2026-09-21 16:39:31] Failed to find any players.
PlayersSay BonjourSaveAdmin STEAMID64Kick STEAMID64/raisonHelpShutdownPour voir la console en direct : su - unturned -c 'screen -r unturned', puis Ctrl+A suivi de D pour la quitter sans arrêter le serveur.
9Gérer, sauvegarder et mettre à jour le serveur
systemctl status unturnedtail -f /opt/unturned/server/Logs/Server_MonServeur.logsystemctl restart unturnedsystemctl stop unturnedsystemctl stop unturned && grep -E 'Saving during server shutdown|Quit game' /opt/unturned/server/Logs/Server_MonServeur.log && systemctl start unturned[2026-09-21 16:31:44] Saving during server shutdown [2026-09-21 16:31:44] Quit game: server shutdown (arrêté pendant son chargement, le serveur n'écrit que la seconde ligne)
Tout ce qui est propre à votre serveur, monde, joueurs et réglages, vit dans Servers/MonServeur. Le script ci-dessous demande une sauvegarde au serveur, puis archive ce dossier ; chaque nuit, il conserve les 7 dernières archives.
cat > /opt/unturned/backup.sh << 'EOF'
#!/bin/sh
BACKUP_DIR=/opt/unturned/backups
DATE=$(date +%Y-%m-%d_%H-%M)
mkdir -p $BACKUP_DIR
screen -S unturned -X stuff 'Save\n'
sleep 5
tar -czf $BACKUP_DIR/unturned-$DATE.tar.gz -C /opt/unturned/server/Servers MonServeur
cd $BACKUP_DIR && ls -t | tail -n +8 | xargs -r rm
EOF
chmod +x /opt/unturned/backup.sh && chown unturned:unturned /opt/unturned/backup.shsu - unturned -c '/opt/unturned/backup.sh && ls -la /opt/unturned/backups'total 28 drwxrwxr-x 2 unturned unturned 46 Sep 21 16:55 . drwxr-xr-x 7 unturned unturned 96 Sep 21 16:55 .. -rw-rw-r-- 1 unturned unturned 27975 Sep 21 16:55 unturned-2026-09-21_16-55.tar.gz (la taille grandit avec le monde exploré)
apt install -y cron && systemctl enable --now crondnf install -y cronie && systemctl enable --now cronddnf install -y cronie && systemctl enable --now crondzypper -n install cronie && systemctl enable --now cronsu - unturned -c '(crontab -l 2>/dev/null; echo "0 4 * * * /opt/unturned/backup.sh") | crontab - && crontab -l'0 4 * * * /opt/unturned/backup.sh
Aprè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é. Le dossier Servers n'est pas touché.
systemctl stop unturned && su - unturned -c "/opt/unturned/steamcmd/steamcmd.sh +force_install_dir /opt/unturned/server +login anonymous +app_update 1110390 +quit" && systemctl start unturned... Success! App '1110390' already up to date. (« fully installed » quand une mise à jour a été téléchargée)
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.
Le serveur tourne sans jeton : seul le code de serveur (Connect Directly) fonctionne. Créez le jeton sur Steam avec l'identifiant 304930, ajoutez la ligne GSLT dans Commands.dat, puis systemctl restart unturned.
La commande du jeton s'appelle GSLT, pas LoginToken : GSLT suivi du jeton, dans Commands.dat ou sur la console.
Elles n'arrivent pas dans screen : l'utilisateur unturned est le seul à voir la session (su - unturned -c '...'), et son nom est unturned (screen -ls, en tant que unturned, l'affiche).
SELinux refuse au service de lancer screen : appliquez la boîte semanage de l'étape 5 (« Relabeled ... bin_t »), puis systemctl restart unturned.
Ports 27015 et 27016 UDP fermés, ou serveur pas encore chargé (« Loading level: 100% » dans le journal). Elle interroge le port 27015 ; le port 27016 ne répond pas à cette sonde.
Serveur prêt
Votre serveur Unturned démarre avec la machine, sauvegarde à l'arrêt et chaque nuit, et écoute sur les ports 27015 et 27016. La même base SteamCMD sert aux autres serveurs de jeux.