Containerized Ark: Survival Ascended server
This project runs the Windows Ark: SA binaries in Debian 12 Linux headless with GE Proton.
Disclaimer: This is not an official image. No support, implied or otherwise is offered to any end user by the author or anyone else. Feel free to do what you please with the contents of this repository.
The processes within the container do NOT run as root. Everything runs as the user steam (gid:10000/uid:10000). There is no interface at all, everything runs headless. If you exec into the container, you will be operating as the steam user.
| Port | Protocol | Default |
|---|---|---|
| Game Port | UDP | 7777 |
| RCON Port | TCP | 27020 |
This is the port required by Ark: SA. If you have read elsewhere about the query port, that is deprecated and not used in the Survival Ascended version of Ark. If you are not able to see your server, make sure you have enabled the correct port forwarding on your router.
If you are still running into issues, there is one potential cause that may be out of your control that I feel I must mention. Some ISPs (internet service providers) utilize a technology called CGNAT (Carrier Grade Network Address Translation). CGNAT can cause issues with port forwarding. If you suspect this may be the case, you will need to contact your ISP for assistance.
| Name | Description | Default | Required |
|---|---|---|---|
| SERVER_MAP | The map that the server runs | TheIsland_WP | True |
| SESSION_NAME | The name for your server/session | None | True |
| SERVER_PASSWORD | The password to join your server | None | False |
| SERVER_ADMIN_PASSWORD | The password for utilizing admin functions | None | True |
| GAME_PORT | This is the port that the server accepts incoming traffic on | 7777 | True |
| RCON_PORT | The port for the RCON service to listen on | 27020 | False |
| MODS | Comma separated list of CurseForge project IDs. Example: ModId1,ModId2,etc | None | False |
| EXTRA_FLAGS | Space separated list of additional server start flags. Example: -NoBattlEye -ForceAllowCaveFlyers | None | False |
| EXTRA_SETTINGS | ? Separated list of additional server settings. Example: ?serverPVE=True?ServerHardcore=True | None | False |
| TZ | Set timezone for the container | America/Toronto | False |
| Name | Description | Default | Required |
|---|---|---|---|
| BACKUP_ENABLED | Enable automated backups | false | False |
| BACKUP_REPOSITORY | Restic repository URL/path | None | True if backups enabled |
| BACKUP_PASSWORD | Password for the Restic repository | None | True if backups enabled |
| BACKUP_SCHEDULE | Cron schedule for backups | 0 0 * * * (daily at midnight) | False |
| BACKUP_RETENTION_DAYS | Number of days to keep backups | 7 | False |
| BACKUP_PATHS | Paths to backup | /home/steam/ark/ShooterGame/Saved | False |
| BACKUP_EXCLUDE | Space separated list of exclude patterns | None | False |
| BACKUP_BEFORE_UPDATE | Whether to backup before updating | true | False |
This container is available from both Docker Hub and GitHub Container Registry (GHCR).
docker pull sknnr/ark-ascended-server:latestdocker pull ghcr.io/doomhound188/ark-ascended-server:latestTo run the container in Docker, run the following command:
docker volume create ark-persistent-data
docker run \
--detach \
--name Ark-Ascended-Server \
--mount type=volume,source=ark-persistent-data,target=/home/steam/ \
--publish 7777:7777/udp \
--publish 27020:27020/tcp \
--env=SERVER_MAP=TheIsland_WP \
--env=SESSION_NAME="Ark Ascended Containerized" \
--env=SERVER_PASSWORD="PleaseChangeMe" \
--env=SERVER_ADMIN_PASSWORD="AlsoChangeMe" \
--env=GAME_PORT=7777 \
--env=RCON_PORT=27020 \
sknnr/ark-ascended-server:latestYou can also use the GHCR image by replacing sknnr/ark-ascended-server:latest with ghcr.io/doomhound188/ark-ascended-server:latest.
To use Docker Compose, either clone this repo or copy the compose.yaml file out of the container directory to your local machine. Edit the compose file to change the environment variables to the desired values.
compose.yaml:
services:
ark-ascended:
# Use one of the following image options:
image: sknnr/ark-ascended-server:latest # Docker Hub
# image: ghcr.io/doomhound188/ark-ascended-server:latest # GitHub Container Registry
ports:
- "7777:7777/udp"
- "27020:27020/tcp"
environment:
- SESSION_NAME=Ark Ascended Containerized
- SERVER_PASSWORD=PleaseChangeMe
- SERVER_MAP=TheIsland_WP
- SERVER_ADMIN_PASSWORD=AlsoChangeMe
- GAME_PORT=7777
- RCON_PORT=27020
volumes:
- ark-persistent-data:/home/steam/
volumes:
ark-persistent-data:To bring the container up:
docker compose up -dTo bring the container down:
docker compose downTo run the container in Podman, run the following command:
podman volume create ark-persistent-data
podman run \
--detach \
--name Ark-Ascended-Server \
--mount type=volume,source=ark-persistent-data,target=/home/steam/ \
--publish 7777:7777/udp \
--publish 27020:27020/tcp \
--env=SERVER_MAP=TheIsland_WP \
--env=SESSION_NAME="Ark Ascended Containerized" \
--env=SERVER_PASSWORD="PleaseChangeMe" \
--env=SERVER_ADMIN_PASSWORD="AlsoChangeMe" \
--env=GAME_PORT=7777 \
--env=RCON_PORT=27020 \
--restart always \
--label io.containers.autoupdate=registry \
docker.io/sknnr/ark-ascended-server:latest
# Or use GHCR:
# ghcr.io/doomhound188/ark-ascended-server:latestI've built a Helm chart and have included it in the helm directory within this repo. Modify the values.yaml file to your liking and install the chart into your cluster. Be sure to create and use a PersistentVolume and PersistentVolumeClaim for the data storage.
The container includes a built-in backup system using Restic which can automatically back up your server data on a schedule. To enable backups, you need to set the appropriate environment variables.
docker run \
--detach \
--name Ark-Ascended-Server \
--mount type=volume,source=ark-persistent-data,target=/home/steam/ \
--publish 7777:7777/udp \
--publish 27020:27020/tcp \
--env=SESSION_NAME="Ark Ascended Containerized" \
--env=SERVER_ADMIN_PASSWORD="YourAdminPassword" \
--env=BACKUP_ENABLED=true \
--env=BACKUP_REPOSITORY="s3:https://s3.amazonaws.com/your-bucket-name" \
--env=BACKUP_PASSWORD="YourSecureBackupPassword" \
sknnr/ark-ascended-server:latestRestic supports various repository types including:
- Local:
/path/to/repository - S3:
s3:https://s3.amazonaws.com/bucket_name - SFTP:
sftp:user@host:/path - Rest Server:
rest:https://user:pass@host:8000/
For complete details on repository types, see the Restic documentation.
This repository includes a GitHub Actions workflow that automatically builds and publishes the container image to GitHub Container Registry (GHCR) when:
- Changes are pushed to the
mainbranch that affect files in thecontainer/directory - A new release is published
- The workflow is manually triggered
The workflow builds the container image using the container/Containerfile and pushes it to GHCR with the following tags:
latest- For the most recent build from the main branchv1.2.3- Full semantic version tag (when a release is created with a tag like v1.2.3)v1.2- Major.Minor version tagv1- Major version tagsha-abc123- Short commit SHA for all builds
To use this workflow:
- Fork this repository
- Ensure your repository has permission to publish packages
- Make your changes to the container
- Push to main or create a release to trigger the workflow
The Makefile includes targets for building and pushing to GHCR manually:
# Build the image for GHCR
make build-ghcr
# Build and push to GHCR
make push-ghcrBefore using these targets, you need to:
-
Log in to GHCR:
echo $GITHUB_TOKEN | buildah login ghcr.io -u USERNAME --password-stdin
-
Update the
GHCR_NAMESPACEin the Makefile to your GitHub username
The Makefile will tag the image with both latest and the short git commit hash.
Watchtower can automatically update your running Docker containers. To use Watchtower:
-
Run Watchtower:
docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower
-
Configure Watchtower (optional):
docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --interval 300 \ --notifications email \ --notification-email-from watchtower@example.com \ --notification-email-to you@example.com \ --notification-email-server smtp.example.com \ --notification-email-server-port 587 \ --notification-email-server-user user@example.com \ --notification-email-server-password password
Podman supports automatic updates with the io.containers.autoupdate label.
-
Ensure your Podman run command includes the
--label io.containers.autoupdate=registryoption as shown in the Podman example above. -
Create a systemd unit file for auto-update:
[Unit] Description=Podman auto-update service Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/usr/bin/podman auto-update --authfile /path/to/auth.json
-
Create a systemd timer to run the update service daily:
[Unit] Description=Run Podman auto-update daily [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target
-
Enable and start the timer:
sudo systemctl enable podman-auto-update.timer sudo systemctl start podman-auto-update.timer
The chart in this repo is also hosted in my helm-charts repository here
To install this chart from my helm-charts repository:
helm repo add doomhound188 https://doomhound188.github.io/helm-charts
helm repo updateTo install the chart from the repo:
helm install ark-survival-ascended doomhound188/ark-survival-ascended --values myvalues.yaml
# Where myvalues.yaml is your copy of the Values.yaml file with the settings that you wantIf you are having issues connecting to the server once the container is deployed, I promise the issue is not with this image. You need to make sure that the ports 7777/udp and 27020/tcp (or whichever ports you have configured) are open and forwarded correctly on your router.
I recommend having Docker or Podman manage the volume that gets mounted into the container. However, if you absolutely must bind mount a directory into the container you need to make sure that ownership and permissions are set correctly. Use chown -R 10000:10000 /your/mount/path to set the correct ownership.
If backups aren't working:
- Check that
BACKUP_ENABLEDis set totrue - Verify that
BACKUP_REPOSITORYandBACKUP_PASSWORDare set correctly - Check the backup logs with
docker exec Ark-Ascended-Server cat /home/steam/backup.log