How to Host a Satisfactory Dedicated Server on Linux
A dedicated Satisfactory server solves one very specific group problem: the factory no longer disappears when the player who created the session logs off. Coffee Stain publishes a free native Linux server, so the software itself is straightforward. The traps are stale port guides, updating while the process still owns its files, and missing the in-game claim step after the first boot.
Skip the Linux setup with managed Satisfactory hosting and a persistent factoryWhat the current server needs
The official dedicated-server guide recommends an x86-64 processor with strong single-core performance and 8 GB RAM. It suggests 16 GB for larger saves or more than four players. The Linux server files use roughly 2 GB, but leave room for saves, logs, SteamCMD and operating-system updates. ARM is not an officially supported server target.
You also need two public ports. Since patch 1.1, the standard port carries TCP, UDP and the HTTPS API, while a reliable messaging port carries TCP. The defaults are 7777 and 8888. Ports 15000 and 15777 have been obsolete since 1.0, so a tutorial that still opens them is describing an older server.
1. Install SteamCMD and a service account
On Ubuntu 24.04, enable the i386 architecture SteamCMD uses and install it from multiverse:
sudo dpkg --add-architecture i386
sudo add-apt-repository multiverse
sudo apt-get update
sudo apt-get install -y steamcmd
sudo adduser --disabled-password --gecos "" satisfactory
sudo install -d -o satisfactory -g satisfactory /srv/satisfactory
Do not run the game as root. A separate account gives its HOME directory a stable place for server identity, configuration and saves.
2. Download the official native Linux server
Satisfactory Dedicated Server is Steam app 1690800. Anonymous login works, so a personal Steam account and game license do not belong on the host:
sudo -u satisfactory /usr/games/steamcmd +@sSteamCmdForcePlatformType linux +@sSteamCmdForcePlatformBitness 64 +force_install_dir /srv/satisfactory +login anonymous +app_update 1690800 validate +quit
The launch script is /srv/satisfactory/FactoryServer.sh. Run that script rather than reaching directly into the Unreal Engine binary tree, because the layout can change with an update.
3. Pick and open the two ports
This example keeps the pair consecutive: 7777 for the standard port and 7778 for reliable messaging. Consecutive ports are not required, but they are easier to reserve when several game servers share a host. -ExternalReliablePort tells clients which public reliable port to use.
sudo ufw allow 7777/tcp
sudo ufw allow 7777/udp
sudo ufw allow 7778/tcp
If the server sits behind a home router, forward the same external and internal number for the standard port. The current server does not support remapping that one. The reliable port can be remapped, but the external value then has to be supplied explicitly.
4. Start it once with explicit networking
cd /srv/satisfactory
sudo -u satisfactory ./FactoryServer.sh -Port=7777 -ReliablePort=7778 -ExternalReliablePort=7778 '-ini:Game:[/Script/Engine.GameSession]:MaxPlayers=4'
Check all three listeners instead of treating one green port as proof:
ss -Hltn 'sport = :7777'
ss -Hlun 'sport = :7777'
ss -Hltn 'sport = :7778'
curl -k https://127.0.0.1:7777
The final command should reach the self-signed HTTPS endpoint and return a route-handler error. That error is useful here: it proves the API is listening. Our game server port checker can test the public TCP side, but no TCP-only tool can prove the UDP listener.
5. Claim the server in Satisfactory
A fresh process is intentionally unclaimed. In the game, open Server Manager, choose Add Server, enter the public address and standard port, and connect. The first player claims the server, gives it a friendly name and creates the administrator password.
After that, create a new session from Server Manager or upload one you already play. The server's identity file is an Unreal save of its own, and Coffee Stain says the in-game Server Manager or HTTPS API are the supported ways to modify it. Do not replace it with a hand-written text file.
6. Upload an existing factory
Make a final manual save in the old session and keep an untouched copy of its .sav file. Claim the dedicated server, open its Manage Saves tab, upload the file and load it. This route validates the upload and keeps the session metadata with the world.
Steam and Epic clients store local saves under the FactoryGame SaveGames tree for the player's account. If locating that tree turns into the hard part, open the game's load screen first and use the visible session and timestamp to identify the right file. Do not delete the original until players have checked inventories, milestones and the active session on the server.
7. Run it as a systemd service
Create /etc/systemd/system/satisfactory.service:
[Unit]
Description=Satisfactory dedicated server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=satisfactory
Group=satisfactory
WorkingDirectory=/srv/satisfactory
ExecStart=/srv/satisfactory/FactoryServer.sh -Port=7777 -ReliablePort=7778 -ExternalReliablePort=7778 -ini:Game:[/Script/Engine.GameSession]:MaxPlayers=4
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=150
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
Then enable it:
sudo systemctl daemon-reload
sudo systemctl enable --now satisfactory.service
sudo journalctl -u satisfactory.service -f
KillSignal=SIGINT matters. Systemd otherwise sends SIGTERM, which is not the shutdown path the official service guidance recommends. Keep automatic saves enabled and use the HTTPS API to request a named save before a planned restart when you automate maintenance.
8. Update without locking the install
Stop the process before SteamCMD validates it. Updating a live server can fail with Steam state 0x606 because its files are still in use:
sudo systemctl stop satisfactory.service
sudo -u satisfactory /usr/games/steamcmd +force_install_dir /srv/satisfactory +login anonymous +app_update 1690800 validate +quit
sudo systemctl start satisfactory.service
Read the current logs after every update and make sure the standard TCP and UDP listeners plus the reliable TCP listener return. A client stuck forever on a loading screen often means the reliable port was never forwarded, even though the first connection reached the standard port.
9. Back up the data, not just the download
The Steam package is replaceable. The valuable state lives under the service account's FactoryGame data tree, including SaveGames and the port-specific server-settings file. Back up that tree while the server is stopped, and keep a copy off the host. SteamCMD can redownload binaries; it cannot rebuild the factory your group spent two hundred hours on.
Managed Satisfactory hosting
GHosting's Satisfactory hosting installs app 1690800 on native Linux, allocates both current ports, checks the HTTPS health endpoint, keeps runtime and customer data apart, and requests a save before managed stops. Claiming and save uploads stay in Satisfactory's own Server Manager, where Coffee Stain supports them. Plans are prepaid and never renew automatically.
GHosting is an independent hosting provider and is not affiliated with or endorsed by Coffee Stain Studios.