Le restart de session planifié (minuit) échoue si le nom de session contient un espace : l'URL ServerTravel est bloquée et le serveur reste sans session chargée (process vivant, injoignable). Fix : re-sauvegarder sous un nom sans espace. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
4.4 KiB
Serveur dédié Satisfactory (gpu-01)
Serveur de jeu Satisfactory hébergé sur gpu-01 (192.168.10.20), à côté du
llama-server. Installé par le rôle Ansible satisfactory_server (steamcmd, login
anonyme Steam, app 1690800) — service systemd satisfactory-server.
Accès
| Depuis | Adresse |
|---|---|
| LAN domestique (192.168.1.x) | 192.168.10.20:7777 (route via s01) ou 192.168.1.200:7777 (DNAT) |
| Internet (amis) | kaya.freeboxos.fr:7777 — redirections Freebox → funk-s01, le DNAT fait le reste |
⚠️ Le remap de port (ex. 17777→7777) ne marche PAS : le serveur annonce ses ports au client dans le protocole (API → port de jeu, jeu → reliable port). Externe = interne obligatoire (wiki). Free IPv4 partagée ne permettant pas de rediriger < 16384, l'option IPv4 full-stack (gratuite, espace abonné Free) a été activée le 2026-07-03 (IP fixe
82.67.223.17) pour pouvoir ouvrir 7777/8888 en 1:1. Redirections Freebox requises (destination funk-s01) :7777/tcp,7777/udp,8888/tcp— ports de début/fin/destination identiques.
Dans le jeu : Server Manager → Add Server. Nom du serveur et mot de passe admin se définissent en jeu à la première connexion (pas de fichier de config).
Réseau
Le serveur utilise trois sockets (Satisfactory ≥ 1.1) :
| Port | Proto | Rôle |
|---|---|---|
| 7777 | UDP | Jeu |
| 7777 | TCP | API HTTPS (Server Manager) |
| 8888 | TCP | Reliable Messaging — bloqué = déconnexion ~60 s après chaque join |
- gpu-01 firewalld :
7777/tcp+udp+8888/tcpouverts (gérés par le rôle). Les ports7778/udpet27015/udpencore ouverts sont des restes pré-1.0, inutiles. - storage-01 nftables (rôle
gateway) : DNAT192.168.1.200 → 192.168.10.20(7777 TCP+UDP, 8888 TCP) + règles forward associées. Redéploiement :--tags gateway.
Exploitation
# état / logs (sur gpu-01)
systemctl status satisfactory-server
journalctl -u satisfactory-server -f
# mise à jour du jeu = simple restart (steamcmd +app_update en ExecStartPre)
systemctl restart satisfactory-server
- Install :
/srv/satisfactory/server(~10 Go, disque OS), user systèmesatisfactory - Sauvegardes :
/srv/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server/— ⚠️ aucun backup automatisé (gap connu, comme etcd/PostgreSQL) - Garde-fous ressources (32 Go partagés avec llama-server) :
MemoryMax=16G— une usine late-game qui explose la RAM fait tuer le jeu, pas le LLM — etNice=5(priorité CPU au llama-server). À ajuster via host_vars si besoin.
Pièges rencontrés à l'installation (2026-07-02)
- steamcmd « Missing configuration » (rc=8) au tout premier
+app_update— bug connu steamcmd (app info pas encore en cache). Le rôle fait des retries. - SELinux 203/EXEC :
steamcmd.shextrait depuis /tmp gardait le contexteuser_tmp_t, le jeu héritait devar_t(/srv) — systemd (init_t) refuse d'exécuter ces types. Le rôle pose un fcontextbin_tsursteamcmd/etserver/+restorecon. Symptôme :Failed at step EXEC ... Permission denied. - Déconnexion ~60 s après chaque join (« Your connection to the host has been
lost ») : le port 8888/tcp (Reliable Messaging) n'était pas ouvert. Le join UDP
réussit, puis le client tente le socket TCP 8888, se fait rejeter par firewalld et
abandonne. Diagnostic dans le log client
(
.../FactoryGame/Saved/Logs/FactoryGame.log) :LogReliableMessaging: Error: Failed to connect to server socket. - Serveur injoignable au matin, process pourtant vivant (2026-07-05) : un espace
dans le nom de session (
test1.2) casse le redémarrage de session planifié que le serveur exécute chaque nuit à minuit (« Session Restart Timer elapsed »). L'URL interne de rechargement est rejetée —LogGameMode: Error: CanServerTravel: FURL ... blocked, contains : or \— et le serveur reste sans session chargée (pas de crash systemd,active (running)). Unsystemctl restartrecharge la session (le contrôle ne s'applique pas au boot). Fix durable : re-sauvegarder en jeu sous un nom de session sans espace. NB : renommer le fichier.savne suffit pas, le nom de session est embarqué dedans.