Sign inSign up

mornedhels/windrose-server

By mornedhels

Updated about 2 months ago

Windrose-Dedicated-Server with autoupdate (supervisord)

Image
Integration & delivery
Operating systems
1

10K+

mornedhels/windrose-server repository overview

Windrose-Dedicated-Server

Docker Pulls Docker Stars Docker Image Size (tag) GitHub

GitHub

Docker image for the game Windrose. The image is based on the steamcmd image and uses supervisor to handle startup, automatic updates and cleanup.

Environment Variables

Server Settings
VariableDefaultContraintsDescriptionWIP
SERVER_NAMEstringThe name of the server
SERVER_PASSWORDstringServer password. Also sets IsPasswordProtected (non-empty=true, empty=false)
SERVER_INVITE_CODEstringThe invite code for the server
SERVER_MAX_PLAYER_COUNT8integerMaximum number of players
SERVER_P2P_PROXY_ADDRESS127.0.0.1string (ip)P2P proxy address
SERVER_USER_SELECTED_REGIONstringSpecifies the region for the Connection Service. Supported options: SEA, CIS, EU (EU covers both EU & NA)
SERVER_USE_DIRECT_CONNECTIONfalsebooleanEnable direct connection
SERVER_DIRECT_CONNECTION_SERVER_ADDRESSstring (ip)Direct connection server address
SERVER_DIRECT_CONNECTION_SERVER_PORT7777integerDirect connection server port
SERVER_DIRECT_CONNECTION_PROXY_ADDRESS0.0.0.0string (ip)Direct connection proxy address

Note

Any `SERVER_*` environment variable is automatically mapped to the corresponding `ServerDescription_Persistent` field in `ServerDescription.json` using PascalCase conversion (e.g., `SERVER_MY_SETTING` → `MySetting`). The variables `PersistentServerId`, `WorldIslandId`, and `IsPasswordProtected` are excluded from this mapping. If an environment variable is not set, the corresponding field is left unchanged.
World Settings
VariableDefaultContraintsDescriptionWIP
WORLD_NAMEstringThe world name
WORLD_PRESET_TYPEMediumstringWorld preset type
WORLD_SETTINGS_COOP__SHARED_QUESTStruebooleanEnable shared quests
WORLD_SETTINGS_EASY_EXPLOREfalsebooleanEnable easy explore mode
WORLD_SETTINGS_MOB_HEALTH_MULTIPLIERfloatMob health multiplier
WORLD_SETTINGS_MOB_DAMAGE_MULTIPLIERfloatMob damage multiplier
WORLD_SETTINGS_SHIPS_HEALTH_MULTIPLIERfloatShips health multiplier
WORLD_SETTINGS_SHIPS_DAMAGE_MULTIPLIERfloatShips damage multiplier
WORLD_SETTINGS_BOARDING_DIFFICULTY_MULTIPLIERfloatBoarding difficulty multiplier
WORLD_SETTINGS_COOP__STATS_CORRECTION_MODIFIERfloatCoop stats correction modifier
WORLD_SETTINGS_COOP__SHIP_STATS_CORRECTION_MODIFIERfloatCoop ship stats correction modifier
WORLD_SETTINGS_COMBAT_DIFFICULTYstringCombat difficulty (Normal, Hard, etc.)

Note

Any `WORLD_*` environment variable is automatically mapped to the corresponding field in `WorldDescription.json`. Top-level fields use PascalCase conversion (e.g., `WORLD_PRESET_TYPE` → `WorldPresetType`). The fields `islandId` and `CreationTime` are excluded from this mapping.
General Settings
VariableDefaultContraintsDescriptionWIP
PUID4711integerThe UID to run server as (file permission)
PGID4711integerThe GID to run server as (file permission)
UPDATE_CRONstring (cron format)Update game server files cron (eg. */30 * * * * check for updates every 30 minutes)
BACKUP_CRONstring (cron format)Backup game server files cron (eg. */15 * * * * backup saves every 15 minutes) - don't set cron under 10 minutes
BACKUP_DIR./backupsstringFolder for backups (relative and absolute paths are supported)
BACKUP_MAX_COUNT0integerNumber of backups to keep (0 means infinite)
RESTART_CRONstring (cron format)Restart game server cron (eg. 0 3 * * * restart server daily at 3)
GAME_BRANCHpublicstringSteam branch (eg. testing) of the Enshrouded server
STEAMCMD_ARGSvalidatestringAdditional steamcmd args for the updater

⚠️: Work in Progress

Additional Information
  • During the update process, the container temporarily requires more disk space (up to 2x the game size).
Hooks
VariableDescriptionWIP
BOOTSTRAP_HOOKCommand to run after general bootstrap
UPDATE_PRE_HOOKCommand to run before update
UPDATE_POST_HOOKCommand to run after update
BACKUP_PRE_HOOKCommand to run before backup & cleanup
BACKUP_POST_HOOKCommand to run after backup & cleanup
RESTART_PRE_HOOKCommand to run before server restart
RESTART_POST_HOOKCommand to run after server restart

The scripts will wait for the hook to resolve/return before continuing.

⚠️: Work in Progress

Image Tags

TagVirtualizationDescription
latestprotonLatest image based on proton
<version>protonPinned image based on proton (>= 1.x.x)
stable-protonprotonSame as latest image
<version>-protonprotonPinned image based on proton
stable-winewineLatest image based on wine
<version>-winewinePinned image based on wine
dev-protonprotonDev build based on proton
dev-winewineDev build based on wine
dev-wine-stagingwineDev build based on wine (staging branch)

Ports (default)

Only needed if direct connection is set to true.

PortDescription
7777/tcpGame Port (Direct Connect)
7777/udpGame Port (Direct Connect)

Volumes

VolumeDescription
/opt/windroseGame files (steam download path)

Note: By default the volumes are created with the UID and GID 4711 (that user should not exist). To change this, set the environment variables PUID and PGID.

  • CPU: >= 2 cores
  • RAM: >= 8 GB
  • Disk: >= 35 GB (preferably SSD)

Official Docs

Usage

Docker
docker run -d --name windrose \
  --hostname windrose \
  --restart=unless-stopped \
  -p 7777:7777 \
  -p 7777:7777/udp \
  -v ./game:/opt/windrose \
  -e SERVER_NAME="Windrose Server" \
  -e UPDATE_CRON="*/30 * * * *" \
  -e PUID=4711 \
  -e PGID=4711 \
  mornedhels/windrose-server:latest
Docker Compose
services:
  windrose:
    image: mornedhels/windrose-server:latest
    container_name: windrose
    hostname: windrose
    restart: unless-stopped
    stop_grace_period: 90s
    ports:
      - "7777:7777"
      - "7777:7777/udp"
    volumes:
      - ./game:/opt/windrose
    # only add ntsync device if your kernel supports it (6.14 or newer)
    devices:
      - /dev/ntsync:/dev/ntsync
    environment:
      - SERVER_NAME=Windrose Server
      - UPDATE_CRON=*/30 * * * *
      - PUID=4711
      - PGID=4711

Note: The volumes are created next to the docker-compose.yml file. If you want to create the volumes, in the default location (eg. /var/lib/docker) you can use the following compose file:

services:
  windrose:
    image: mornedhels/windrose-server:latest
    container_name: windrose
    hostname: windrose
    restart: unless-stopped
    stop_grace_period: 90s
    ports:
      - "7777:7777"
      - "7777:7777/udp"
    volumes:
      - game:/opt/windrose
    # only add ntsync device if your kernel supports it (6.14 or newer)
    devices:
      - /dev/ntsync:/dev/ntsync
    environment:
      - SERVER_NAME=Windrose Server
      - UPDATE_CRON=*/30 * * * *
      - PUID=4711
      - PGID=4711

volumes:
  game:

Backup

The image includes a backup script that creates a zip file of the last saved game state. To enable backups, set the BACKUP_CRON environment variable. To limit the number of backups, set the BACKUP_MAX_COUNT environment variable.

To restore a backup, stop the server and simply extract the zip file to the savegame folder and start the server up again. If you want to keep the current savegame, make sure to make a backup before deleting or overwriting the files.

Warning

Verify the permissions of the extracted files. The files should be owned by the user with the UID and GID set in the environment variables. If the image is running in privileged mode, the files will be automatically chowned to the given `UID` and `GID`.

Commands

  • Force Update:
    docker compose exec windrose supervisorctl start windrose-force-update
    
  • Apply World Configuration: Selects the world referenced by WorldIslandId, applies the current WORLD_* variables, stops the server, runs the world-description updater, and restarts the server.
    docker compose exec windrose supervisorctl start windrose-world-update
    
  • Restart Windrose Server: (can be used for periodic restarts)
    docker compose exec windrose supervisorctl restart windrose-server
    
  • Get Invite Code:
    docker compose exec windrose windrose-invite-code
    

Known Issues

Docker >= 29.4.2: wine: socket: Function not implemented

Docker 29.4.2+ updated its default seccomp profile to block AF_ALG sockets as a mitigation for CVE-2026-31431 — a Linux kernel privilege escalation vulnerability. This breaks Wine/Proton which relies on these sockets.

For workarounds and mitigation strategies, see the official Docker blog post:
Mitigating CVE-2026-31431 (Copy Fail) in Docker Engine

Tag summary

Content type

Image

Digest

sha256:374927da1

Size

700.6 MB

Last updated

4 months ago

docker pull mornedhels/windrose-server