Guides

Satisfactory dedicated server on Linux: SteamCMD, ports 7777 and 8888, RAM and claiming

Run a Satisfactory dedicated server on Linux: SteamCMD app 1690800, ports 7777 TCP/UDP and 8888 TCP, RAM for the late game, claiming, systemd and backups.

Published ~10 min read

Short answer: a Satisfactory dedicated server is the free Satisfactory Dedicated Server tool, SteamCMD app 1690800, which keeps your factory running without anyone’s PC switched on. On Linux you download it with SteamCMD, open 7777 over TCP and UDP plus 8888 over TCP, give it at least 8 GB of RAM (16 GB for a late-game save), run FactoryServer.sh under systemd with a SIGINT stop, and then claim it from the in-game Server Manager. This guide walks through each step on Ubuntu 24.04 and Debian 12/13.

ItemValueNote
SteamCMD app ID1690800Anonymous login works; -beta experimental for the Experimental branch
Game port7777 TCP + UDPGame traffic and the server's HTTPS API
Reliable messaging8888 TCPNeeded since patch 1.1
RAM8 GB minimum16 GB for large saves or more than four players
Start scriptFactoryServer.shStop it with SIGINT for a graceful shutdown
Player limit4 by defaultRaised with MaxPlayers in Game.ini

What hardware does a Satisfactory server need?

The official wiki lists 8 GB of RAM as the minimum and 16 GB for larger saves or more than four players. It also names a minimum single-thread CPU score, which tells you what matters: per-core speed, not a high core count. The server is x86-64 only; there is no ARM build. The Linux server files take about 8 GB, so size the disk for that plus saves and a few backup archives.

  • Fresh world, two or three friends: 8 GB works. The server is light until the factory grows.
  • Late game: memory follows the save. Thousands of machines, belts and trains on the map push usage well past the starting figure, so for a world you intend to finish, budget for the 16 GB the wiki recommends from the start.
  • Leave room for the OS. If the server takes every last megabyte, the kernel’s OOM killer ends it mid-session. Keep 1 to 2 GB free for the operating system, and add a small swap file as a safety net.

On VMHeaven, Hi-CPU KVM is the line built for this kind of load: AMD EPYC with ECC memory, fewer vCores per plan, aimed at work that sits on one or two threads. If you also want to host other things on the same box, Standard KVM gives more Intel cores at the same prices. To size Satisfactory against eight other games on both lines, see gaming VPS.

How do I install the server with SteamCMD?

  1. 1Create a user for the server

    Never run a game server as root. Give it its own account and home directory:

    Debian · Ubuntu
    sudo useradd --system --create-home --home-dir /opt/satisfactory \
      --shell /usr/sbin/nologin satisfactory
  2. 2Install SteamCMD

    SteamCMD is a 32-bit program, so both distributions need the i386 architecture. Ubuntu ships it in multiverse, Debian in non-free. The installer shows the Steam licence once; accept it to continue.

    Ubuntu 24.04
    sudo add-apt-repository -y multiverse
    sudo dpkg --add-architecture i386
    sudo apt update
    sudo apt install -y steamcmd
    Debian 12 · 13
    sudo dpkg --add-architecture i386
    # adds only the non-free component; skip this if your sources already list it
    sudo tee /etc/apt/sources.list.d/non-free.sources >/dev/null <<EOF
    Types: deb
    URIs: http://deb.debian.org/debian
    Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
    Components: non-free
    Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
    EOF
    sudo apt update
    sudo apt install -y steamcmd
  3. 3Download the dedicated server

    Run SteamCMD as the service user so every file belongs to it. The install directory must come before the login:

    Debian · Ubuntu
    sudo -u satisfactory -H /usr/games/steamcmd \
      +force_install_dir /opt/satisfactory/server \
      +login anonymous +app_update 1690800 validate +quit
    
    # Experimental branch instead (players must be on Experimental too):
    #   +app_update 1690800 -beta experimental validate

    The run ends with Success! App '1690800' fully installed. Repeat the same command to update later.

Which ports does a Satisfactory server use?

Since patch 1.1 the server needs two ports. Port 7777 carries game traffic over UDP and the server’s HTTPS API over TCP, so open it for both protocols. Port 8888 over TCP is the reliable messaging channel. The query ports 15000 and 15777 from the Early Access days have not been used since 1.0, so remove old rules for them. Port 7777 cannot be remapped: the port players connect to must be the one the server listens on.

ufw · Debian, Ubuntu
sudo ufw allow 7777 comment 'Satisfactory game + API'
sudo ufw allow 8888/tcp comment 'Satisfactory reliable messaging'
sudo ufw status

# after the server has started, check that it listens on both:
sudo ss -tulpn | grep -E ':(7777|8888)\b'

ufw allow 7777 without a protocol opens TCP and UDP together. Opening only 7777 is the mistake older guides still make: they were written before 1.1 added the second port. If ufw is not enabled yet, allow SSH before you turn it on, as the UFW setup guide explains.

How do I run it as a systemd service?

A systemd unit restarts the server after a crash, starts it on boot and can update it before each start. One line matters more than the rest: KillSignal=SIGINT. systemd stops services with SIGTERM by default; the official wiki’s unit sends SIGINT instead, the signal the wiki names for a graceful shutdown.

/etc/systemd/system/satisfactory.service
[Unit]
Description=Satisfactory dedicated server
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=satisfactory
Group=satisfactory
WorkingDirectory=/opt/satisfactory/server
# update before every start; delete this line to stay on the installed build
ExecStartPre=/usr/games/steamcmd +force_install_dir /opt/satisfactory/server +login anonymous +app_update 1690800 +quit
ExecStart=/opt/satisfactory/server/FactoryServer.sh
# the wiki's unit stops the server with SIGINT for a graceful shutdown
KillSignal=SIGINT
# room for a large update in ExecStartPre
TimeoutStartSec=900
TimeoutStopSec=120
Restart=on-failure
RestartSec=60

[Install]
WantedBy=multi-user.target
enable and watch it
sudo systemctl daemon-reload
sudo systemctl enable --now satisfactory
sudo systemctl status satisfactory
sudo journalctl -u satisfactory -f

For more players, add -ini:Game:[/Script/Engine.GameSession]:MaxPlayers=8 to the ExecStart line. The same key also works in Game.ini (below), but the switch is the sturdier choice here: this unit updates the server on every start, and a game update can reset INI edits. More on units, restart policies and logs is in creating a systemd service.

How do I claim the server in the game?

A new server has no owner and no world. The first player to connect through the Server Manager claims it and sets the admin password, so do this right after the first start, before anyone else finds the address.

  1. 1Add the server

    Start Satisfactory, open Server Manager from the main menu and click Add Server. Enter the VPS IP address and port 7777.

  2. 2Claim it

    The server shows up as unclaimed. Give it a name and a strong administrator password. That password is what lets you change settings, load saves and shut the server down later.

  3. 3Create or upload a world

    Create a new session and pick a starting area, or open Manage Saves, upload a save from your PC and load it. Set Auto-Load Session Name so the same world comes back after a restart.

  4. 4Decide who may join

    A player password is off by default. Set one in the server settings unless you want anyone with the IP to walk in.

Friends join through the Server Manager as well. If someone gets Encryption token missing, they used Join Game instead: add the server in the Server Manager and connect from there.

Where are the saves and config files?

Saves live in the home directory of the user that runs the server, under .config/Epic/FactoryGame/Saved/SaveGames/server/. With the user created above, that is /opt/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server/. The settings you chose in the Server Manager sit one level up in ServerSettings.7777.sav.

The INI files are in /opt/satisfactory/server/FactoryGame/Saved/Config/LinuxServer/. Edit them only while the server is stopped: they are rewritten on a clean shutdown, so changes made while it runs are overwritten.

Two keys worth knowing: MaxPlayers in Game.ini (default 4) and the number of rotating autosaves in Engine.ini (default 3).

Game.ini
[/Script/Engine.GameSession]
MaxPlayers=8
Engine.ini
[/Script/FactoryGame.FGSaveSession]
mNumRotatingAutosaves=6

The autosave interval and auto-save on disconnect are set in the Server Manager. For an off-machine copy, archive the save folder on a schedule. Several rotating autosaves exist at any time, so an archive still holds complete saves if one of them is being written at that moment:

/opt/satisfactory/backup.sh
#!/bin/bash
set -euo pipefail
SRC=/opt/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames
DEST=/opt/satisfactory/backups
mkdir -p "$DEST"
# exit code 1 only means a file changed while it was read; the archive is still usable
tar -czf "$DEST/saves-$(date +%F-%H%M).tar.gz" -C "$SRC" . || [ $? -eq 1 ]
# keep 14 days of archives
find "$DEST" -name 'saves-*.tar.gz' -mtime +14 -delete
install and schedule it
sudo nano /opt/satisfactory/backup.sh     # paste the script above
sudo chown satisfactory:satisfactory /opt/satisfactory/backup.sh
sudo chmod 750 /opt/satisfactory/backup.sh
sudo crontab -u satisfactory -e
# add:  15 */6 * * * /opt/satisfactory/backup.sh

Copy the archives somewhere else as well. A backup on the same disk does not survive a reinstall. On a VMHeaven VPS the panel can also take backups of the whole server, by hand or on a schedule, which is the quick way back after an update goes wrong.

Why can’t players connect? Common errors, most likely first

1. The server is not reachable at all

Check the firewall first (sudo ufw status), then that the server listens (sudo ss -tulpn | grep 7777). To see whether players’ packets arrive, watch the port while someone connects. Silence means the traffic is blocked before it reaches the server, usually by a firewall rule or a wrong IP in the Server Manager.

on the server
sudo apt install -y tcpdump
sudo tcpdump -ni any 'udp port 7777 or tcp port 8888'

2. Players connect, then fail while loading

TCP 8888 is closed. Open it as shown in the ports section and reconnect. Guides written before patch 1.1 leave this port out.

3. Encryption token missing

The player used Join Game. Add the server in the Server Manager and connect from there instead.

4. The server runs but feels sluggish

Ask the server itself. Its HTTPS API answers a health check without a login; the -k is there because the server uses a self-signed certificate unless you give it your own:

on the server
curl -sk https://127.0.0.1:7777/api/v1 \
  -H 'Content-Type: application/json' \
  -d '{"function":"HealthCheck","data":{"ClientCustomData":""}}'

healthy is fine. slow means the server has dropped to ten ticks per second or fewer, so the simulation is falling behind. Run top and press 1: one core pinned near 100 % while the others idle points at the main game thread, which fits the single-thread score in the official requirements. More cores do not fix that; faster ones do.

5. steamclient.so or SDL2 missing in the log

The server looks for steamclient.so in ~/.steam/sdk64 of its user. Link the copy SteamCMD downloaded into that folder, and install the 32-bit SDL2 library if the log names SDL:

Debian · Ubuntu
# where did SteamCMD put its 64-bit steamclient.so?
SC=$(sudo -u satisfactory find /opt/satisfactory -name steamclient.so -path '*linux64*' | head -n 1)
echo "$SC"     # must print a path; if it is empty, run the SteamCMD update once more

sudo -u satisfactory mkdir -p /opt/satisfactory/.steam/sdk64
sudo -u satisfactory ln -sf "$SC" /opt/satisfactory/.steam/sdk64/steamclient.so

# only if the log complains about SDL
sudo apt install -y libsdl2-2.0-0:i386
sudo systemctl restart satisfactory

6. The server dies in the late game

Look for the OOM killer with sudo journalctl -k | grep -i 'killed process'. If it is there, the save has outgrown the RAM; see processes killed when memory runs out.

7. The service fails with a timeout on start

A large update in ExecStartPre took longer than TimeoutStartSec. Raise the value, or run the update by hand before starting the service.

Game servers attract floods from players who lost a match. On VMHeaven, DDoS filtering is always on in Amsterdam and Frankfurt, and the panel’s browser VNC console still reaches the server when its network is down. The guide to DDoS-protected VPS hosting covers what such filtering can and cannot stop.

Frequently asked

What ports does a Satisfactory dedicated server use?

Port 7777 over both TCP and UDP for game traffic and the server's HTTPS API, and port 8888 over TCP for reliable messaging, which patch 1.1 added. The old query ports 15000 and 15777 have not been used since 1.0, and 7777 cannot be remapped to a different external port.

How much RAM does a Satisfactory dedicated server need?

The official minimum is 8 GB, and 16 GB is recommended for large late-game saves or more than four players. Keep 1 to 2 GB of the machine's memory free for the operating system, and favour fast CPU cores over many cores, because the official requirements set a minimum single-thread score.

How do I claim a Satisfactory dedicated server?

Start the game, open Server Manager from the main menu, click Add Server and enter the server's IP address and port 7777. An unclaimed server lets the first player who connects set its name and administrator password, so claim it right after the first start.

Related articles

All guides