This is the guide I wish existed before I spent way too long fighting Portainer, and Umbrel’s sandboxing. As is the theme of this blog, I suffered so you don’t have to.
This method focuses on a simple, reliable path; a method that actually works on Umbrel.
I’m going to give you the TLDR right up front here. This is how easy it should technically be when you break it down:
1. Port forward 15637 (UDP) on your router.
2. Install and run Portainer on your Umbrel device.
3. Set up the Stack via Docker Compose, using the YAML provided.
4. Deploy the stack, run Enshrouded, search for your server name or join with IP:Port number.
5. *Optional* – once you can confirm it works, move any local world files to the directories explained above, make any necessary adjustments to the enshrouded_config.json, restart the container, attempt to connect to the server again.
⚠️ One important networking note (port forwarding)
For friends to join your server from outside your home network, you must forward UDP port 15637 on your router to your Umbrel device.
This guide assumes you know how to create a port forward on your router and will not cover router configuration.
You are forwarding:
UDP 15637 → <Umbrel local IP>
Once that port is forwarded, the rest of this guide will work.
What this guide assumes
You already have:
- UmbrelOS running
- Portainer installed from Umbrel Apps
- Existing Enshrouded world files (optional)
- Basic understanding of Docker concepts.
Docker image used:
mornedhels/enshrouded-server
There are a few options for servers, I liked this one. More info on how the server operates and how to config can be found on GitHub.
Why most Docker guides fail on Umbrel
Umbrel intentionally hides Docker internals. Because of this:
- Bind mounts often don’t work
- NAS mounts aren’t visible to containers
- Portainer file browser is limited
- SSH shows almost nothing
However, Umbrel does expose Docker volumes via the Files app. You just have to know where to find them. That is the key to making this easy.
Overview of what we’re doing
- Deploy the server with a Portainer Stack
- Let Docker create volumes automatically
- Use Umbrel Files to access the volume
- Copy world saves into the volume
- Restart the container
Should be pain free.
Step 1 — Create the Enshrouded Stack in Portainer
Open Portainer → Stacks → Add Stack
Paste this compose file.
This creates a basic server where only admins can join. I don’t plan on inviting anyone onto my server that I don’t trust to build and manipulate the environment.
Additional roles can be added later via environment variables.
version: "3.8"
services:
enshrouded:
image: mornedhels/enshrouded-server:latest
container_name: enshrouded
hostname: enshrouded
restart: unless-stopped
ports:
- "15637:15637/udp"
volumes:
- enshrouded_game:/opt/enshrouded
- enshrouded_backups:/opt/enshrouded/backups
environment:
- SERVER_NAME=MyServerName
- SERVER_SLOT_COUNT=4
- SERVER_IP=0.0.0.0
- SERVER_SAVE_DIR=/opt/enshrouded/savegame
- SERVER_LOG_DIR=/opt/enshrouded/logs
- UPDATE_CRON=*/30 * * * *
- BACKUP_CRON=*/60 * * * *
- BACKUP_MAX_COUNT=10
- PUID=1000
- PGID=1000
- SERVER_ROLE_0_NAME=Admins
- SERVER_ROLE_0_PASSWORD=password
- SERVER_ROLE_0_CAN_KICK_BAN=true
- SERVER_ROLE_0_CAN_ACCESS_INVENTORIES=true
- SERVER_ROLE_0_CAN_EDIT_WORLD=true
- SERVER_ROLE_0_CAN_EDIT_BASE=true
- SERVER_ROLE_0_CAN_EXTEND_BASE=true
- SERVER_ROLE_0_RESERVED_SLOTS=1
volumes:
enshrouded_game:
enshrouded_backups:
Deploy the stack and wait until the container is fully running.
Launch the game once and confirm you can connect to the server.
This ensures Docker creates the correct volume structure.
Step 2 — Stop the container before copying saves
In Portainer:
Containers → enshrouded → Stop
Always stop the server before modifying save files.
Step 3 — Locate the Docker volume in Umbrel Files
Open Umbrel → Files
Navigate to:
/Apps/portainer/data/docker/data/volumes
Inside you will find folders including:
enshrouded_game
enshrouded_backups
Open:
enshrouded_game → _data
You should see folders like:
savegame
logs
This is the actual game data used by the container.
Step 4 — Copy your world files into the volume
Your Enshrouded saves look like:
world.db
world.meta
<world_id_folder>/
Copy ALL files and folders from your machine into:
.../enshrouded_game/_data/savegame/
Overwrite existing files if prompted.
This replaces the default world with your existing one.
Step 5 — Start the server
Return to Portainer → Containers → Start the container.
Watch logs briefly to confirm the world loads correctly.
Load the game, go to the “Join” menu, search for your server by name or IP:Port address. If it shows up, everything is working, and you should be able to join with the admin password you created. Make sure to set it as a favorite.
Editing server config later
Server config lives inside the same volume:
/Apps/portainer/data/docker/data/volumes/<volume>/_data/server
Edit the enshrouded_server.json file and restart the container to apply changes.
Backups (highly recommended)
Regularly copy the entire savegame folder to wherever you are storing your Umbrel backups. The native Umbrel backup is fantastic, and I have it syncing with my NAS with near-zero effort.
This protects against corruption and updates.
Final Thoughts
Hopefully this guide makes this look easy. I learned a lot about Docker in the process of getting this to work, especially on how it works on UmbrelOS. It was frustrating, but I am grateful. If you followed the guide correctly, this should just work.

Leave a Reply