# 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](https://satisfactory.wiki.gg/wiki/Dedicated_servers)). 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/tcp` ouverts (gérés par le rôle). Les ports `7778/udp` et `27015/udp` encore ouverts sont des restes pré-1.0, inutiles. - **storage-01 nftables** (rôle `gateway`) : DNAT `192.168.1.200 → 192.168.10.20` (7777 TCP+UDP, 8888 TCP) + règles forward associées. Redéploiement : `--tags gateway`. ## Exploitation ```bash # é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ème `satisfactory` - **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 — et `Nice=5` (priorité CPU au llama-server). À ajuster via host_vars si besoin. ## Pièges rencontrés à l'installation (2026-07-02) 1. **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. 2. **SELinux 203/EXEC** : `steamcmd.sh` extrait depuis /tmp gardait le contexte `user_tmp_t`, le jeu héritait de `var_t` (/srv) — systemd (init_t) refuse d'exécuter ces types. Le rôle pose un fcontext **`bin_t`** sur `steamcmd/` et `server/` + `restorecon`. Symptôme : `Failed at step EXEC ... Permission denied`. 3. **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`. 4. **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)`). Un `systemctl restart` recharge 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 `.sav` ne suffit pas, le nom de session est embarqué dedans.