Deploy a fully automated, always-up-to-date Enshrouded Dedicated Server using Docker. No manual updates, no configuration drift, no root containers.
The container ships Wine + SteamCMD baked into the image. On every startup, it:
enshrouded_server.exe via WineThe Docker image itself never changes between game updates — SteamCMD handles that at runtime. Your saves and config live in mounted volumes and survive any image rebuild or upgrade.
curl -fsSL https://raw.githubusercontent.com/MrGuato/enshrouded-docker/main/setup.sh | bash
This script:
docker compose up -d --buildNote: If Docker was just installed, the script will exit and ask you to log out and back in (group membership change). Re-run the script after logging back in.
git clone https://github.com/MrGuato/enshrouded-docker
cd enshrouded-docker
docker compose up -d
Watch startup progress:
docker compose logs -f
First run downloads ~6 GB from Steam. Subsequent starts are fast because the game files are cached in a volume.
Edit environment variables directly in docker-compose.yml, or pass them via a .env file in the same directory.
| Variable | Default | Description |
|---|---|---|
SERVER_NAME |
Enshrouded Docker Server |
Name shown in the server browser |
SERVER_SLOTS |
16 |
Maximum players |
SERVER_PASSWORD |
(empty) | Leave empty for a public server |
GAME_PORT |
15637 |
UDP game port |
QUERY_PORT |
27015 |
UDP query port |
UPDATE_ON_START |
1 |
Set to 0 to skip Steam update on startup |
WINEPREFIX |
/home/steam/.wine |
Wine prefix location (don’t change unless you know why) |
SERVER_NAME=My Awesome Server
SERVER_SLOTS=8
SERVER_PASSWORD=secretpassword
UPDATE_ON_START=1
| Port | Protocol | Purpose |
|---|---|---|
15637 |
UDP | Game traffic (required) |
27015 |
UDP | Server discovery / query (required) |
Firewall (UFW):
sudo ufw allow 15637/udp
sudo ufw allow 27015/udp
iptables:
sudo iptables -A INPUT -p udp --dport 15637 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 27015 -j ACCEPT
If you’re on a home network, also forward both ports on your router to the VM’s local IP.
All state lives outside the container in three directories created automatically on first run:
enshrouded-config/
├─ savegame/ ← world saves
├─ logs/ ← server logs
└─ enshrouded_server.json ← auto-generated server config
enshrouded-server/ ← game binaries (SteamCMD target)
enshrouded-wine/ ← Wine prefix
You can safely:
SERVER_NAME, slots, or passwordYour world data will be intact as long as these directories are preserved.
Game updates happen automatically on container restart when UPDATE_ON_START=1. SteamCMD only downloads changed files, so updates are fast.
To also pull the latest Docker image:
docker compose pull
docker compose up -d
To restart without updating the game:
UPDATE_ON_START=0 docker compose up -d
Stop the server:
docker compose down
Restart:
docker compose restart
View live logs:
docker compose logs -f
Open a shell inside the container:
docker exec -it enshrouded-server bash
Back up your world:
tar -czf enshrouded-backup-$(date +%Y%m%d).tar.gz enshrouded-config/savegame/
sudo ufw statusdocker psCheck logs:
docker compose logs --tail=50
Common causes:
sudo chown -R $USER:$USER ./enshrouded-config ./enshrouded-server ./enshrouded-wine
These are usually harmless warnings from Wine initializing a new prefix. If the server still starts, ignore them. If it doesn’t start, check that enshrouded-wine/ is not corrupted — delete it and let the container re-initialize.
rm -rf ./enshrouded-wine
docker compose up -d
steam, uid 999)restart: unless-stopped so the server comes back after a VM rebootenshrouded-config/savegame/ on a schedule (cron + tar works fine)sha-abc1234 or YYYYMMDD) if you want controlled upgrades instead of always-latestUPDATE_ON_START=1 — it protects you from running a mismatched server version after a game updateOpen an issue at github.com/MrGuato/enshrouded-docker