This guide explains how to deploy the Enshrouded Dedicated Server using Docker with runtime SteamCMD auto-updates, persistent storage, and a production-style workflow.
app_update 2278520 validate)Typical UDP ports:
15637/udp — game port27015/udp — query port (commonly used for server discovery)Ensure these ports are allowed through your firewall and forwarded on your router if hosting publicly.
Create a folder on your host and add this docker-compose.yml:
services:
enshrouded:
image: ghcr.io/<your-username>/<repo>:latest
restart: unless-stopped
ports:
- "15637:15637/udp"
- "27015:27015/udp"
environment:
- UPDATE_ON_START=1
- SERVER_NAME=My Enshrouded Server
- SERVER_SLOTS=16
# - SERVER_PASSWORD=ChangeMe
volumes:
- ./data:/home/steam/enshrouded
Start the server:
docker compose up -d
docker logs -f enshrouded
All persistent data lives in the ./data directory on your host:
data/
├─ savegame/
├─ logs/
├─ enshrouded_server.json
You can rebuild images, switch tags, or move hosts without losing world data.
On container start, the entrypoint runs SteamCMD to pull the latest Enshrouded dedicated server:
+@sSteamCmdForcePlatformType windows
+app_update 2278520 validate
The Docker image itself remains unchanged, while the server binaries update automatically whenever Steam publishes a new build.
To temporarily disable updates:
UPDATE_ON_START=0
docker ps)./dataEnsure the directory is writable by Docker. On Linux hosts:
sudo chown -R $USER:$USER ./data
Check logs:
docker logs -f enshrouded
If you see Wine or X-related errors, ensure Xvfb is started by the entrypoint. If SteamCMD fails, it is often transient network or Steam-side—restart the container.
This aligns with baseline container hardening practices and reduces host risk.
restart: unless-stopped./data directory periodicallylatestTreat this service like production infrastructure: automate it, back it up, and keep it observable.