Post

Running Satisfactory Server with Docker

Deploy a Satisfactory dedicated server using the wolveix/satisfactory-server Docker image. Docker run and Compose examples with all environment variables explained.

Running Satisfactory Server with Docker

Overview

This guide deploys a Satisfactory dedicated server using the wolveix/satisfactory-server Docker image — the same image used in the production Kubernetes deployment powering this documentation. The image handles SteamCMD downloads, auto-updates, and server startup automatically.


Prerequisites


Option A: Docker Run (Quick Start)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run -d \
  --name satisfactory-server \
  --restart unless-stopped \
  -p 7777:7777/tcp \
  -p 7777:7777/udp \
  -p 8888:8888/tcp \
  -p 8080:8080/tcp \
  -p 8081:8081/tcp \
  -e MAXPLAYERS=8 \
  -e PGID=1000 \
  -e PUID=1000 \
  -e STEAMBETA=false \
  -e SKIPUPDATE=false \
  -e AUTOSAVEINTERVAL=300 \
  -v /home/satisfactory/data:/config \
  wolveix/satisfactory-server:latest

Create the data directory first:

1
mkdir -p /home/satisfactory/data

Create the directory and compose file:

1
2
mkdir -p /home/satisfactory
cd /home/satisfactory

Create docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
services:
  satisfactory:
    image: wolveix/satisfactory-server:latest
    container_name: satisfactory-server
    restart: unless-stopped
    ports:
      - "7777:7777/tcp"
      - "7777:7777/udp"
      - "8888:8888/tcp"
      - "8080:8080/tcp"
      - "8081:8081/tcp"
    environment:
      - MAXPLAYERS=8
      - PGID=1000
      - PUID=1000
      - STEAMBETA=false
      - SKIPUPDATE=false
      - AUTOSAVEINTERVAL=300
    volumes:
      - ./data:/config

Start the server:

1
docker compose up -d

Environment Variables

VariableDefaultDescription
MAXPLAYERS4Maximum simultaneous connected players
PGID1000Group ID for file ownership inside the container
PUID1000User ID for file ownership inside the container
STEAMBETAfalseUse Steam beta (experimental) branch
SKIPUPDATEfalseSkip SteamCMD update check on startup
AUTOSAVEINTERVAL300Autosave every N seconds (300 = 5 minutes)

PGID and PUID should match the user owning the /config volume on the host. The default 1000 matches the first non-root user on most Ubuntu installations.


Data Volume

All server data is stored in /config inside the container, mapped to ./data on the host (or /home/satisfactory/data if using the docker run command).

1
2
3
4
5
6
7
8
9
data/
├── config/          ← Server configuration files
│   ├── GameUserSettings.ini
│   └── ServerSettings.ini
├── saves/           ← Game save files
│   └── session_name/
│       └── *.sav
└── logs/            ← Server logs
    └── FactoryGame.log

Never delete the data/ directory. It contains your game world saves. Back it up regularly.


First Boot

On the very first start, the container:

  1. Downloads the Satisfactory Dedicated Server via SteamCMD (~8–10 GB)
  2. Extracts and configures the server
  3. Starts the game server process

First boot takes 10–30 minutes depending on your internet connection and server speed. Follow the progress:

1
docker logs -f satisfactory-server

Look for these lines in the log output:

1
2
3
4
5
...
Update state (0x61) downloading, progress: 98.74 (7,856,547,712 / 7,946,123,264)
Success! App '1690800' fully installed.
...
LogGameState: Match State Changed from WaitingToStart to InProgress

The server is ready when you see the InProgress line.


Verify the Server is Running

Test the vanilla API (no authentication required):

1
2
3
curl -k -X POST https://YOUR_SERVER_IP:7777/api/v1 \
  -H "Content-Type: application/json" \
  -d '{"function": "HealthCheck", "data": {}}'

Expected response:

1
{"data":{"health":"healthy"}}

Use -k because the Satisfactory server uses a self-signed TLS certificate.


Managing the Container

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# View live logs
docker logs -f satisfactory-server

# Stop the server
docker compose down          # (or: docker stop satisfactory-server)

# Start the server
docker compose up -d         # (or: docker start satisfactory-server)

# Restart
docker compose restart       # (or: docker restart satisfactory-server)

# View resource usage
docker stats satisfactory-server

Auto-Updates

The container checks for Satisfactory server updates on every restart (controlled by SKIPUPDATE=false). To apply an update:

1
docker compose pull && docker compose up -d

Set SKIPUPDATE=true to disable automatic update checks (useful for scheduled maintenance windows).


Next Step

Firewall & Port Configuration →

This post is licensed under CC BY 4.0 by the author.