Windrose is a Windows-only dedicated server -- there's no native Linux version. But thanks to Wine, it runs perfectly fine in Docker. Headless, no GUI, fully automated.
It's built on my Steam Game Server Framework. Here's everything you need to set up your own Windrose server.
Quick Start
Create a directory and add a docker-compose.yml:
mkdir windrose-server && cd windrose-server
services:windrose:
# Docker Hub:
image: rndmjoker/gameserver-steam-windrose:latest
# Alternativ von GitHub Container Registry:
# image: ghcr.io/rndmjoker/gameserver-steam-windrose:latest
container_name: windrose-server
restart: unless-stopped
network_mode: host
security_opt:
- seccomp=unconfined
mem_limit: 8g
volumes:
- serverdata:/home/steam/serverdata
- serverconfig:/home/steam/serverconfig
environment:
- AUTOBACKUP=true
- GAME_PORT=7777
- GAME_ARGS=-log -nullrhi
- MaxPlayerCount=4
- UserSelectedRegion=EU
- UseDirectConnection=true
- DirectConnectionServerPort=7777
- WorldName=The Archipelago
- WorldPresetType=Medium
volumes:serverdata:serverconfig:
docker compose up -d
docker compose logs -f
The first start takes a bit longer -- SteamCMD downloads the server (~3 GB), then the Wine prefix gets initialized (Mono/Gecko). From the second start onwards it's much faster.
Alternative with docker run
docker run -d \
--name windrose-server \
--restart unless-stopped \
--network host \
--security-opt seccomp=unconfined \
--memory 8g \
-e AUTOBACKUP=true \
-e GAME_PORT=7777 \
-e GAME_ARGS="-log -nullrhi" \
-e MaxPlayerCount=4 \
-e UserSelectedRegion=EU \
-e UseDirectConnection=true \
-e DirectConnectionServerPort=7777 \
-e WorldName="The Archipelago" \
-e WorldPresetType=Medium \
-v serverdata:/home/steam/serverdata \
-v serverconfig:/home/steam/serverconfig \
rndmjoker/gameserver-steam-windrose:latest
Technical Details
| Property | Value |
|---|---|
| Steam App ID | 4129620 |
| Platform | Windows (via Wine 11.0) |
| Default Port | 7777/udp + 7777/tcp |
| RAM Recommendation | 8 GB |
| Server Binary | R5/Binaries/Win64/WindroseServer-Win64-Shipping.exe |
| Start Arguments | -log -nullrhi (headless, no rendering) |
Why -nullrhi?
Windrose is built on Unreal Engine 5. Without -nullrhi the server tries to start a rendering interface -- which fails in a headless Docker environment. -nullrhi disables that, -log writes output to the console.
Networking
The server runs in host network mode.
| Port | Protocol | Description |
|---|---|---|
7777 |
UDP + TCP | Game port (player connections) |
If you have an external firewall, you need to open port 7777 for both UDP and TCP.
Direct Connection
Windrose supports two connection methods: invite codes and direct connection via IP. For a dedicated server you should enable direct connection:
- UseDirectConnection=true
- DirectConnectionServerAddress=0.0.0.0
- DirectConnectionServerPort=7777
- DirectConnectionProxyAddress=0.0.0.0
Players then connect directly via your server IP and port 7777.
Configuration
The entire server is configured via environment variables. You don't need to edit any config files -- anything you want to change, you just add as -e VARIABLE=value to your docker run or in the environment: section of your docker-compose.yml. The config file (ServerDescription.json) is generated from these variables on every container start.
The Quick Start above shows a minimal example. The complete docker-compose.yml and the .env.example with all parameters are in the GitHub repo.
Here are all available settings:
Server Basics
| Variable | Default | Description |
|---|---|---|
ServerName |
My Windrose Server |
Server name |
MaxPlayerCount |
4 |
Max players |
Password |
(empty) | Password to join |
UserSelectedRegion |
EU |
Server region |
GAME_PORT |
7777 |
Game port |
GAME_ARGS |
-log -nullrhi |
Start arguments |
| AUTOBACKUP | true | Auto-backup saves on every container start (keeps last 5) |
Direct Connection
| Variable | Default | Description |
|---|---|---|
UseDirectConnection |
true |
Enable direct connect |
DirectConnectionServerAddress |
0.0.0.0 |
Bind address |
DirectConnectionServerPort |
7777 |
Connection port |
DirectConnectionProxyAddress |
0.0.0.0 |
Proxy address |
World Settings
| Variable | Default | Description |
|---|---|---|
WorldName |
The Archipelago |
World name |
WorldPresetType |
Medium |
Preset (Easy, Medium, Hard) |
Difficulty
| Variable | Default | Description |
|---|---|---|
MobHealthMultiplier |
1.0 |
Enemy health |
MobDamageMultiplier |
1.0 |
Enemy damage |
ShipsHealthMultiplier |
1.0 |
Ship health |
ShipsDamageMultiplier |
1.0 |
Ship damage |
BoardingDifficultyMultiplier |
1.0 |
Boarding difficulty |
CoopStatsCorrectionModifier |
1.0 |
Coop stat correction |
CoopShipStatsCorrectionModifier |
0.0 |
Coop ship correction |
CombatDifficulty |
Normal |
Combat difficulty (Easy, Normal, Hard) |
SharedQuests |
true |
Shared quests |
EasyExplore |
false |
Simplified exploration |
Build from Source
git clone https://github.com/RndmJoker/gameserver-steam-windrose.git steam-windrose
cd steam-windrose
cp .env.example .env
nano .env
docker compose up -d --build
Server Management
View logs
docker compose logs -f
Restart
docker compose restart
Stop the server
docker compose down
Fast restart (skip update)
- SKIP_STEAM_UPDATE=true
Volumes and Backups
All server data persists in Docker volumes across restarts and rebuilds.
| Volume | Container Path | Contents |
|---|---|---|
serverdata |
/home/steam/serverdata |
Game files, save games, logs, backups |
serverconfig |
/home/steam/serverconfig |
Config templates |
Important directories inside serverdata
| Path | Contents |
|---|---|
R5/ServerDescription.json |
Server config (name, password, invite code) |
R5/Saved/SaveProfiles/Default/RocksDB_v2/ |
World saves (RocksDB database) |
R5/Saved/SaveProfiles/Default/RocksDB_v2_Backups/ |
Game-internal automatic backups |
R5/Saved/Logs/ |
UE5 game logs (R5.log) |
backups/ |
Docker auto-backup snapshots (timestamped) |
Automatic backup
The container automatically backs up world saves on every start when AUTOBACKUP=true (default).
Backups are timestamped and the last 5 are kept. Older backups are removed automatically.
Bind-mount for direct host access
If you want direct access to saves, logs, or backups on the host:
volumes:
- serverdata:/home/steam/serverdata
- serverconfig:/home/steam/serverconfig
- ./saves:/home/steam/serverdata/R5/Saved/SaveProfiles
- ./logs:/home/steam/serverdata/R5/Saved/Logs
- ./backups:/home/steam/serverdata/backups
Manual backup
docker cp windrose-server:/home/steam/serverdata/R5/Saved ./windrose-backup-$(date +%Y%m%d)
Troubleshooting
Server won't start
Check the logs:
docker logs windrose-server 2>&1 | tail -50
Common causes:
- Not enough RAM -- at least 8 GB required
- Wine prefix not initialized -- normal on first start, just wait
"fixme:" messages in the logs
These are Wine debug messages and completely normal. You can ignore them. The relevant messages come from the framework itself and are marked with timestamps.
Players can't connect
- Server running?
docker ps | grep windrose - Port open?
ss -tulnp | grep 7777 - Direct connection enabled?
UseDirectConnection=true - Firewall? Port
7777must be open for UDP and TCP
Config not being applied
The ServerDescription.json is regenerated from your environment variables on every start. If you change settings, just restart the container:
docker compose restart
Links
- GitHub: github.com/RndmJoker/gameserver-steam-windrose
- Docker Hub: hub.docker.com/r/rndmjoker/gameserver-steam-windrose
- Official Windrose Docs: playwindrose.com/dedicated-server-guide
- Framework: Steam Game Server Framework
If you have questions or need help, reach out via the contact form.