All apps · 0 apps
ARK-Survival-Ascended
Docker app from Blairwin's Repository
Overview
Readme
View on GitHubARK: Survival Ascended — Docker server for Unraid
A SteamCMD-based ASA dedicated server container, laid out the way ich777's game
server images are, so it should feel familiar if you were running his: the same
/serverdata/steamcmd + /serverdata/serverfiles split, the same UID/GID/
VALIDATE/USERNAME environment variables, the same "download everything on
first boot so the image stays small" approach.
The one structural difference is Proton. Wildcard still ships no native Linux
server binary for ASA, so this installs the Windows depot (SteamCMD is told
+@sSteamCmdForcePlatformType windows) and runs ArkAscendedServer.exe under
GE-Proton.
What this one does differently
The download is the easy part. Almost everything that goes wrong with a dedicated ASA server happens afterwards, and this container is built around four of those failures in particular.
You can actually edit the config files. Getting an ini file editable over
SMB from a Windows box needs three things to line up at once: the files have to
be owned by the right uid, they have to carry permissive modes, and every
directory above them has to be traversable. Permissive files behind a locked
parent are still unreachable, which is why the top-level mode defaults to 775
rather than the tighter 770 you might expect. The permission pass runs on
every start and again on shutdown, so it repairs a migrated install or files
wine created with its own tight modes, not just the ones created from here on.
CONFIG_UMASK translates a plain umask into the two modes it implies, applying
them to files and directories separately so directories keep the execute bit
that makes them possible to enter. Full detail in
Editing the configs over SMB.
Stopping the container saves the world. ARK writes its save on exit, so a
hard kill is how people lose hours. On docker stop this sends SaveWorld over
RCON, waits, sends DoExit, and only kills the wine prefix if the server is
still up after STOP_TIMEOUT. That is also why the entrypoint deliberately does
not use process-group signalling — it would deliver SIGTERM straight to the wine
processes and skip the save entirely.
The container never overwrites your edits. GameUserSettings.ini is seeded
once, with RCON enabled, and then left alone permanently — there is no code path
here that rewrites a config file you may have changed. ARK itself is a different
matter: it rewrites that file when it shuts down, so stop the container before
editing rather than while it runs.
The install is located, not assumed. The server binary is found by searching
for it rather than by hardcoding ShooterGame/Binaries/Win64. That layout has
shifted before, and it means an existing install laid out by some other setup is
found rather than ignored.
Two smaller things. GE-Proton splits its releases by architecture, and the ARM
build sorts first in the release listing, so the x86_64 tarball is selected
explicitly rather than by taking whichever tarball appears first; pinning
accepts either the release tag or the full asset name. And if GitHub is
unreachable or rate-limiting you, the container falls back to whatever Proton
build is already on disk instead of refusing to boot. The RCON client is a short
Python script using nothing outside the standard library, so there is no extra
package to install or keep current just to send SaveWorld.
Before you start
- Disk: about 15GB installed, growing with saves and mods. Put it on a cache pool or SSD share rather than the array — not for the space, but because ARK is heavy on random I/O and spinning disks make startup and world saves noticeably slower.
- RAM: 16GB is a sensible floor for a vanilla map. Mods and players push it well past that. ASA is considerably hungrier than ASE.
- First boot is slow and quiet. A ~13GB download, then Proton builds its prefix, then the server does its own startup — around 45 seconds once the files are in place. Watch the logs rather than assuming it has hung.
Get the image
docker pull ferment9348/ark-survival-ascended:latest
Tagged releases are published as :1.2.3 and :1.2, and :latest always points
at the most recent release rather than at the tip of main.
Or build it yourself — on Unraid you can do this on the server itself:
git clone https://github.com/blckassassin/ArkSA.git
cd ArkSA
docker build -t ferment9348/ark-survival-ascended:latest .
If you build under a different name, change <Repository> in
templates/ark-survival-ascended.xml to match.
Install on Unraid
- Copy
templates/ark-survival-ascended.xmlto/boot/config/plugins/dockerMan/templates-user/. - Docker tab → Add Container → pick
ARK-Survival-Ascendedfrom the template dropdown. - Set your paths, server name and admin password, then apply.
Ports
| Port | Proto | What it does |
|---|---|---|
| 7777 | UDP | Game traffic. The only one you have to forward. |
| 7778 | UDP | Peer port. Rarely needed; worth trying for flaky connects. |
| 27015 | UDP | Legacy Steam query port. Vestigial in ASA — see below. |
| 27020 | TCP | RCON. Forward only if you administer from outside the LAN. |
Server discovery in ASA runs through Epic Online Services, not Steam's A2S query protocol, so you do not need to forward 27015 for your server to appear in the Unofficial list. It is mapped only because some third-party tooling still expects it to exist.
Configuration
Environment variables of note:
| Variable | Default | Notes |
|---|---|---|
SERVER_NAME |
ASA Server |
Session name in the server browser. |
MAP |
TheIsland_WP |
Needs the _WP suffix — the bare ASE name will not load. |
MAX_PLAYERS |
20 |
Becomes -WinLiveMaxPlayers. |
SRV_PWD |
empty | Join password. Blank for an open server. |
SRV_ADMIN_PWD |
adminpassword |
Admin and RCON password. Change it. |
MODS |
empty | Comma-separated CurseForge project IDs. |
CROSSPLAY |
false |
true adds -crossplay so Epic players can join. |
BATTLEYE |
false |
false passes -NoBattlEye. |
GAME_PARAMS_EXTRA |
empty | Extra dash flags, space separated. |
QUERY_PARAMS_EXTRA |
empty | Extra ?key=value pairs, no leading ?. |
CLUSTER_ID |
empty | Same value on every server in a cluster. |
PROTON_VERSION |
GE-Proton10-34 |
Pinned deliberately — see below. latest is opt-in. |
VALIDATE |
empty | true makes SteamCMD verify every file on start. Slow. |
DEBUG |
false |
true captures verbose wine output and a Proton log. See below. |
STOP_TIMEOUT |
120 |
Seconds allowed for a graceful save before force kill. |
FIX_PERMS |
true |
Keeps the Saved tree editable over SMB. See below. |
CONFIG_UMASK |
inherits UMASK |
umask applied to the Saved tree. See below. |
DATA_PERM |
775 |
Mode on the top-level server files folder. |
UMASK |
000 |
New files 666, new directories 777. |
The launch-argument traps
ASA moved several settings off the ?-string and onto dash flags, and the old
forms are silently ignored rather than erroring:
-WinLiveMaxPlayers=Nsets the player cap.?MaxPlayers=does nothing.-port=Nsets the game port.?Port=does nothing.ServerAdminPasswordmust be the last?argument — anything after it gets swallowed into the password value. The script already handles this, but keep it in mind if you add your ownQUERY_PARAMS_EXTRA.- Mods are CurseForge project IDs, not Steam Workshop IDs. A Workshop-only mod is not an ASA mod.
INI files
GameUserSettings.ini and Game.ini live in:
<serverfiles>/ShooterGame/Saved/Config/WindowsServer/
That path says WindowsServer even though you are on Linux — you are running
the Windows binary, and ASA has no LinuxServer variant.
For convenience a config symlink is created at the top of the game files
folder, so you can also reach them at <serverfiles>/config/. If your Samba
setup has follow symlinks disabled the shortcut will not show up over the
network — use the full path in that case.
The container seeds GameUserSettings.ini with RCON enabled on first run and
then never touches it again, so your edits are safe.
Stop the container before editing. ARK rewrites GameUserSettings.ini when
it shuts down, so changes you make while it is running get overwritten.
Editing the configs over SMB from Windows
This is set up to work out of the box. Three things have to line up, and the container handles all of them:
- Ownership. Everything is chowned to your
UID/GID, which on Unraid defaults to99:100(nobody:users) — the ids Unraid's SMB stack expects. - File modes.
UMASK=000means files the server creates land as666and directories as777. On top of that,FIX_PERMS=truere-applies those modes across theSavedtree on every start and again on shutdown, which repairs anything that already exists with a tight mode — a migrated install, or files wine created itself. - Traversal. Permissive files are useless if a parent directory blocks the
way in, so the chain down to
Savedis opened up too. This is whyDATA_PERMdefaults to775and not ich777's770: with770, an SMB user who is neither the owner nor a member of group100cannot get in at all.
Tightening it: CONFIG_UMASK
CONFIG_UMASK is a plain umask, and it means what you would expect — files
start from 666, directories from 777, and the umask bits come off. Leave it
blank and it just follows the container-wide UMASK, so by default there is a
single number governing everything.
CONFIG_UMASK |
Files | Dirs | Who can edit over SMB |
|---|---|---|---|
000 (default) |
666 |
777 |
Anyone. |
007 |
660 |
770 |
Owner and group users only. |
022 |
644 |
755 |
Nobody but the owner — read-only for you. |
077 |
600 |
700 |
Owner only. Not editable over SMB at all. |
007 is the sensible choice if 000 feels too open: Unraid accounts belong to
the users group (gid 100), so SMB editing keeps working while everything
else is shut out. Note that 022 and 077 will make the files read-only or
invisible from Windows — that is the intended meaning, but it is the opposite
of what you asked for, so pick them deliberately.
An invalid value falls back to 000 with a warning in the log rather than
failing the boot.
CONFIG_UMASK sets what the modes become; FIX_PERMS decides whether the pass
runs at all. Set FIX_PERMS=false to skip it entirely and manage permissions
yourself — there is no umask value that means "leave these alone".
Two things on the Unraid side that this container cannot do for you:
- The appdata share must be exported over SMB. It often is not by default. Shares → appdata → SMB Security Settings.
- If permissions are already tangled from a previous container, run Tools →
Docker Safe New Permissions once with the containers stopped, or start this
one with
FORCE_CHOWN=truefor a single boot.
Use an editor that respects existing line endings — Notepad++ or VS Code rather than stock Notepad — for the larger ini files.
Watching the server
The engine log is streamed into the container log, so ARK's own output appears
under Logs on the Unraid Docker tab, or via docker logs, alongside this
container's ---...--- messages. You do not need shell access to see what the
server is doing.
The file itself is still at ShooterGame/Saved/Logs/ShooterGame.log if you want
to search back through it.
Passwords end up in the engine log
This container prints <query string hidden> instead of the launch arguments,
but ARK itself writes the whole command line — ServerPassword and
ServerAdminPassword in clear text — into
ShooterGame/Saved/Logs/ShooterGame.log. Nothing here can prevent that.
Worth knowing before you paste a log into a forum or an issue, and a reason to
treat that file as sensitive. ServerAdminPassword is also the RCON password.
Stopping safely
ARK writes its world on exit, so a hard kill is how people lose hours of
progress. On docker stop the container sends SaveWorld, then DoExit over
RCON, waits up to STOP_TIMEOUT seconds, and only then kills the wine prefix.
This depends on RCON being enabled in GameUserSettings.ini. If you disable it,
you lose the safe shutdown.
On Unraid, raise the container stop timeout (Settings → Docker →
Default shutdown time-out) to something above your STOP_TIMEOUT. Unraid's
default is far shorter than a graceful ARK shutdown takes, so it will SIGKILL
the container partway through.
You can tell this has happened: the log reaches ---Sending DoExit--- and then
just stops, without ---Server stopped---. The save itself completes before
that point — World Saved comes back from RCON first — so it is not data loss,
but the server never gets to shut down cleanly.
RCON from the command line
docker exec ARK-Survival-Ascended /opt/scripts/rcon-cli.sh SaveWorld
docker exec ARK-Survival-Ascended /opt/scripts/rcon-cli.sh ListPlayers
docker exec ARK-Survival-Ascended /opt/scripts/rcon-cli.sh "Broadcast Restart in 5 minutes"
Worth knowing: ASA moderation commands take a player's EOS ID, not a Steam64 ID.
Clusters
Set the same CLUSTER_ID on each container and point every one of them at a
shared CLUSTER_DIR (map the same host path into each container). Give each
server its own GAME_PORT and its own serverfiles path. Proton lives inside
that folder, so each server automatically gets its own wine prefix — two
servers cannot end up sharing one. The SteamCMD folder is the exception: it is
only a downloader, so pointing every container at the same one is fine.
Troubleshooting
Server never appears in the list. Check 7777/udp is forwarded to the Unraid
host. If only Epic players cannot see it, set CROSSPLAY=true.
Crashes on startup, or wine errors about file descriptors. The container
raises its own limit, but the Docker-level ceiling matters too — the template
passes --ulimit nofile=1048576:1048576 in Extra Parameters. Make sure that
survived any edits you made.
Cannot open or save the ini files from Windows. Check the appdata share is
actually exported over SMB, then confirm FIX_PERMS is true and restart the
container — the recursive fix runs on start. If it is still wrong, the files are
probably owned by the wrong uid; start once with FORCE_CHOWN=true.
Out-of-memory or mmap errors under load. Unreal engine servers can exhaust
the default vm.max_map_count. On the Unraid host:
sysctl -w vm.max_map_count=262144
Add it to your go file to make it stick across reboots.
Server exits a second after startup, engine log stops after Sentry. That is
Proton's lsteamclient failing to find the native steamclient.so and
aborting the process. It looks for ~/.steam/sdk64/steamclient.so, which the
container links from SteamCMD automatically. If you see
unable to load native steamclient library in a DEBUG=true log, check that
SteamCMD actually finished its first run — the libraries only appear after it
has downloaded its own payload.
A Proton update broke something. PROTON_VERSION is pinned to
GE-Proton10-34 rather than tracking latest, so an upstream release cannot
change what runs here without you choosing it. That is the whole reason for the
pin: reproducibility, not a belief that newer builds are broken.
Do not set latest. GE-Proton 11 hangs ArkAscendedServer.exe before the
engine writes anything at all — no crash, no exception, no log, the container
simply never comes up. Verified directly with this image on 2026-08-20:
GE-Proton11-5 hung indefinitely while GE-Proton10-34 reached "advertising for
join" in 44 seconds, on the same machine with the same game files and only the
Proton build changed. The maintainer of another Linux ASA launcher reported the
same behaviour against GE-Proton11-1 in July 2026, so it spans the series
rather than one build.
This failure is silent by nature, so the container also warns if no engine output has appeared several minutes after launch.
The container warns in its log whenever the Proton build in use is not the one
the image was tested against, so a container still carrying an older
PROTON_VERSION setting says so on every start rather than failing silently.
Changing PROTON_VERSION is enough on its own. A wine prefix belongs to the
build that created it, so the container records which one that was and discards
the prefix when it changes, letting Proton rebuild. You do not have to delete
anything by hand, and your saves and configs are never involved — they live
under ShooterGame/Saved, not in the prefix. Deleting <serverfiles>/proton forces a clean prefix rebuild, which is
worth trying before anything drastic — that folder holds only the Proton build
and the wine prefix, both of which are rebuilt automatically. Your saves and
configs are under ShooterGame/, untouched.
SteamCMD keeps failing partway. Steam's CDN deprioritises anonymous logins
under load. Set VALIDATE=true and restart; it resumes rather than starting
over.
Credit
The structure, environment variable naming and general Unraid ergonomics here are lifted from ich777's game server containers, which were the standard for this on Unraid for years.
License
MIT — see LICENSE.
Install ARK-Survival-Ascended on Unraid in a few clicks.
Find ARK-Survival-Ascended in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Requirements
Categories
Download Statistics
Related apps
Explore more like this
Explore allDetails
ferment9348/ark-survival-ascended:latestRuntime arguments
- Network
bridge- Shell
bash- Privileged
- false
- Extra Params
--restart=unless-stopped --ulimit nofile=1048576:1048576
Template configuration
Game traffic. This is the one that has to be forwarded.
- Target
- 7777
- Default
- 7777
- Value
- 7777
Game port + 1. Not normally required, but cheap to forward if players report flaky connects.
- Target
- 7778
- Default
- 7778
- Value
- 7778
Legacy Steam query port. Vestigial in ASA - discovery runs through EOS. Left here for tooling that expects it.
- Target
- 27015
- Default
- 27015
- Value
- 27015
Source RCON. Only forward at the router if you administer remotely, and never without a strong admin password.
- Target
- 27020
- Default
- 27020
- Value
- 27020
Where the server files, saves and configs live - about 15GB. Use a cache pool or SSD share: ARK is heavy on random I/O and spinning disks slow startup and world saves.
- Target
- /serverdata/serverfiles
- Default
- /mnt/cache/appdata/ark-survival-ascended
- Value
- /mnt/cache/appdata/ark-survival-ascended
Shared SteamCMD install. Safe to point several game containers at the same folder.
- Target
- /serverdata/steamcmd
- Default
- /mnt/cache/appdata/steamcmd
- Value
- /mnt/cache/appdata/steamcmd
Session name shown in the Unofficial server list.
- Target
- SERVER_NAME
- Default
- ASA Server
- Value
- ASA Server
Note the _WP suffix - ASA maps are World Partition and the bare ASE name will not load. e.g. TheIsland_WP, ScorchedEarth_WP, TheCenter_WP, Aberration_WP, Extinction_WP, Ragnarok_WP, Astraeos_WP
- Target
- MAP
- Default
- TheIsland_WP
- Value
- TheIsland_WP
Passed as -WinLiveMaxPlayers. The old ?MaxPlayers= is ignored by ASA.
- Target
- MAX_PLAYERS
- Default
- 20
- Value
- 20
Join password. Leave blank for an open server.
- Target
- SRV_PWD
Admin password, and also the RCON password - ASA has no separate RCON credential. Change this from the default.
- Target
- SRV_ADMIN_PWD
- Value
- changeme
Comma separated CurseForge project IDs, no spaces. ASA mods come from CurseForge, not the Steam Workshop. Load order follows the list, leftmost first.
- Target
- MODS
Set true to let Epic Games Store players join. Not on by default for self-hosted servers - this is the usual reason Epic players cannot find a server.
- Target
- CROSSPLAY
- Default
- false
- Value
- false
BattlEye does not run cleanly under Proton, so this defaults to false (which passes -NoBattlEye).
- Target
- BATTLEYE
- Default
- false
- Value
- false
Extra dash flags, space separated. e.g. -ForceAllowCaveFlyers -servergamelog -NoTransferFromFiltering
- Target
- GAME_PARAMS_EXTRA
Extra ?key=value pairs for the map string, no leading ?. e.g. AllowCrateSpawnsOnTopOfStructures=true?PreventDownloadSurvivors=false
- Target
- QUERY_PARAMS_EXTRA
Set the same value on every server in a cluster to enable transfers. Leave blank for a standalone server.
- Target
- CLUSTER_ID
Shared transfer folder. For a real cluster, map this to a path shared by all the containers.
- Target
- CLUSTER_DIR
- Default
- /serverdata/serverfiles/cluster
- Value
- /serverdata/serverfiles/cluster
Set to true to have SteamCMD verify every file on start. Slow - turn it back off once it has run.
- Target
- VALIDATE
Set true to capture verbose wine output and a Proton log in the logs folder under your game files. Use this when the server exits during startup without writing an engine log. Noisy and slower - turn it back off afterwards.
- Target
- DEBUG
- Default
- false
- Value
- false
Leave this alone unless you know why you are changing it. GE-Proton 11 hangs the ASA server before it writes any log at all - no crash, no error, it just never starts. Verified with this image: GE-Proton11-5 hangs, GE-Proton10-34 starts in under a minute on the same files. Setting 'latest' will currently get you GE-Proton 11.
- Target
- PROTON_VERSION
- Default
- GE-Proton10-34
- Value
- GE-Proton10-34
Seconds to wait for a graceful save-and-exit before force killing. Also raise Unraid's own container stop timeout to match.
- Target
- STOP_TIMEOUT
- Default
- 120
- Value
- 120
Leave blank. The ASA server app downloads anonymously.
- Target
- USERNAME
Leave blank. The ASA server app downloads anonymously.
- Target
- PASSWRD
User ID. 99 is the Unraid default.
- Default
- 99
- Value
- 99
Group ID. 100 is the Unraid default.
- Default
- 100
- Value
- 100
Keeps the Saved folder (configs and saves) readable and writable over SMB, so you can edit the ini files from a Windows PC. Runs on every start and again on shutdown. Set false only if you want to manage permissions yourself.
- Target
- FIX_PERMS
- Default
- true
- Value
- true
umask applied to the Saved folder (configs and saves) when Fix Share Permissions is on. Leave blank to reuse the container UMASK, which is the usual choice. 000 = everyone can edit. 007 = owner and group only, which still works for Unraid SMB users since they belong to the users group. 022 = read-only for everyone but the owner. 077 = owner only.
- Target
- CONFIG_UMASK
chmod applied to the top-level server files folder. 775 rather than 770 so an SMB client that is not the owner and not in the group can still traverse into it.
- Target
- DATA_PERM
- Default
- 775
- Value
- 775
umask for files the server creates. 000 means new files land as 666 and new directories as 777, which keeps them editable over the share.
- Default
- 000
- Value
- 000