Hosting Guides

Headless Satisfactory Dedicated Server via Docker Compose

7 min readDebian 12Docker ComposeUnreal
Once your server is online, jump to the Satisfactory command and config reference.

Satisfactory's headless dedicated server is one of the cleaner Unreal Engine 5 ports on Linux. It boots quickly, holds onto memory predictably, and exposes a JSON HTTPS API for remote management instead of relying on the legacy RCON protocol. The two operational pain points that bite factory hosts are autosave induced lag spikes (the world snapshot of a mid game factory can take 5 seconds and stall every player) and the lack of a panel, which makes Docker Compose the obvious deployment shape.

This guide deploys the official Coffee Stain image on Debian 12 with Compose, configures autosave to avoid simulation hitches, and exposes the Beacon API on the standard HTTPS port for use with external admin tools.

Prerequisites

  • Debian 12 with Docker Engine and the Compose plugin installed.
  • 8 GB of RAM for a four player factory, 16 GB for late game megabases.
  • 20 GB of storage for the server install plus headroom for save files.
  • UDP 7777 (game) and TCP 7777 (Beacon HTTPS API) open at the firewall.

Step 1: Project Layout

user@host
sudo mkdir -p /opt/satisfactory/{config,saves}
sudo chown -R 1000:1000 /opt/satisfactory
cd /opt/satisfactory

UID 1000 matches the steam user inside the official Coffee Stain image. Setting ownership correctly up front prevents the all too common situation where the server boots, writes nothing, and silently fails to persist anything on the first save.

Step 2: The Compose File

docker-compose.yml
services:
satisfactory:
image: wolveix/satisfactory-server:latest
container_name: satisfactory
restart: unless-stopped
ports:
- "7777:7777/udp"
- "7777:7777/tcp"
volumes:
- ./config:/config
- ./saves:/config/gamefiles/FactoryGame/Saved/SaveGames
environment:
MAXPLAYERS: 8
PGID: 1000
PUID: 1000
ROOTLESS: "false"
STEAMBETA: "false"
AUTOSAVENUM: 5
AUTOSAVEINTERVAL: 600
DISABLESEASONALEVENTS: "false"
LOG: "true"
deploy:
resources:
limits:
memory: 12G

AUTOSAVEINTERVAL defaults to 300 seconds, which is wildly too aggressive for a megabase. The save serialization is single threaded and blocks the world tick, so a 5 second hitch every 5 minutes is the worst case. Setting the value to 600 cuts that frequency in half. Combined with the rolling 5 slot retention, you still have roughly 50 minutes of history protection without doubling the IO pressure.

Step 3: First Boot

user@host
docker compose up -d
docker compose logs -f satisfactory

First boot downloads roughly 8 GB of Unreal binaries from Steam, generates a fresh save under ./saves, and starts listening on UDP 7777. Connect from the in game server browser by hostname, accept the admin password prompt, and claim the server as ADMIN. The Beacon API then becomes available over HTTPS on TCP 7777.

Step 4: Autosave Tuning for Large Factories

Once your factory exceeds roughly 50 megawatts of installed power, you will start to see autosave hitches on lower spec hosts. The right answer is to push the interval up gradually rather than disable autosaves entirely. Edit the compose file, restart the stack, and confirm the new cadence in the server log.

docker-compose.yml override
AUTOSAVEINTERVAL: 1200 # one save every 20 minutes
AUTOSAVENUM: 3 # keep last 3 autosaves on disk

Pair the longer interval with manual saves before risky factory changes. server.SaveGame over the Beacon API writes a named snapshot you can keep around indefinitely.

Performance and Tuning

  • Cap the container at 12 GB of RAM. The Unreal allocator will happily eat more, but the marginal benefit above 12 GB is invisible to players.
  • Use NVMe storage for ./saves. Save serialization stalls are dominated by sequential write throughput, not CPU.
  • Keep MAXPLAYERS realistic. Eight is the documented hard cap, and factory simulation cost grows non linearly past four active builders.
  • Mount ./config on persistent storage so that admin password resets and Beacon certificates survive container recreation.

Conclusion

With the autosave cadence tuned to your factory size and the Beacon API exposed for remote admin tools, the headless Satisfactory server runs as a low maintenance Compose stack. Snapshot the ./saves directory nightly with rsync or your S3 client of choice, and resist the urge to wipe between updates: Coffee Stain has been admirably good about save migration across game versions, and a clean Compose redeploy carries the world forward without issue.