Game server hosting · Fast RAM · High-speed internet · Eat lag for breakfast
Try our Windrose server hosting free for 2 days!
A Docker container for running a Windrose dedicated server. The server binary is Windows-only and runs via Wine.
| 2 Players | 4 Players | 10 Players | |
|---|---|---|---|
| CPU | 2 cores @ 3.2 GHz | 2 cores @ 3.2 GHz | 2 cores @ 3.2 GHz |
| RAM | 8 GB | 12 GB | 16 GB |
| Storage | 35 GB SSD | 35 GB SSD | 35 GB SSD |
Copy the .env.example file to .env, fill in your values, then use either docker compose or docker run.
services:
windrose:
image: indifferentbroccoli/windrose-server-docker
restart: unless-stopped
container_name: windrose
stop_grace_period: 30s
env_file:
- .env
volumes:
- ./server-files:/home/steam/server-filesdocker compose up -ddocker run -d \
--restart unless-stopped \
--name windrose \
--stop-timeout 30 \
--env-file .env \
-v ./server-files:/home/steam/server-files \
indifferentbroccoli/windrose-server-docker| Variable | Default | Description |
|---|---|---|
PUID |
1000 |
User ID to run the server process as |
PGID |
1000 |
Group ID to run the server process as |
UPDATE_ON_START |
true |
Download and validate server files on every startup. Set to false to skip. |
USE_DIRECT_CONNECTION |
false |
Set to true to connect to your server via IP and port instead of invite code. |
SERVER_PORT |
7777 |
Only applies if USE_DIRECT_CONNECTION=true. Port for direct connection. Requires both TCP and UDP. |
DIRECT_CONNECTION_PROXY_ADDRESS |
0.0.0.0 |
Only applies if USE_DIRECT_CONNECTION=true. Address for the direct connection proxy. |
USER_SELECTED_REGION |
Region for the connection service. Leave empty to auto-select. Options: SEA, CIS, EU |
|
INVITE_CODE |
Invite code players use to connect if USE_DIRECT_CONNECTION=false (default). Min 6 characters, 0-9 a-z A-Z, case sensitive |
|
SERVER_NAME |
Display name for your server | |
SERVER_PASSWORD |
Leave empty for a public server | |
MAX_PLAYERS |
10 |
Maximum number of simultaneous players |
P2P_PROXY_ADDRESS |
127.0.0.1 |
IP address the P2P proxy binds to. Use 127.0.0.1 (default) in Docker — the proxy is an internal socket and does not need to be reachable from outside the container |
GENERATE_SETTINGS |
true |
Set to false to skip all config generation and patching. The server will start using whatever is already in ServerDescription.json on disk or create a new one. |
UE4SS is a Lua scripting and modding framework for Unreal Engine games.
Note
UE4SS_ENABLED is not needed if WINDROSE_PLUS_ENABLED=true — Windrose+ installs and manages its own compatible UE4SS version automatically.
| Variable | Default | Description |
|---|---|---|
UE4SS_ENABLED |
false |
Set to true to install UE4SS standalone. Automatically enabled by Windrose+. |
Windrose+ is a third-party, server-only enhancement for Windrose dedicated servers. It adds a live map, a web RCON dashboard, external server-browser query support, multipliers, 2,400+ INI overrides, and Lua mod support. No client mods are required. Enabling Windrose+ automatically installs UE4SS.
Enable by setting WINDROSE_PLUS_ENABLED=true in your .env, then start the container. The dashboard is exposed on port 8780.
The image ships with the latest Windrose+ version. To use a different version, set WINDROSE_PLUS_VERSION=vX.Y.Z (must match a GitHub release tag) and restart the container. Leave WINDROSE_PLUS_VERSION empty to use the latest release.
Edit server-files/windrose_plus.json (multipliers, feature flags) or any server-files/windrose_plus*.ini (advanced stat overrides), then restart the container — the config takes effect on the next boot. Restarts without config changes cost no extra startup time.
RCON password, admin Steam IDs, and feature flags are re-read live from windrose_plus.json while the server is running — no restart required for those.
| Variable | Default | Description |
|---|---|---|
WINDROSE_PLUS_ENABLED |
false |
Set to true to enable the addon. Automatically enables UE4SS. |
WINDROSE_PLUS_VERSION |
baked-in default | GitHub release tag of Windrose+ to install. Leave empty for the image default. |
WINDROSE_PLUS_DASHBOARD_PORT |
8780 |
Port the web dashboard listens on inside the container. |
WINDROSE_PLUS_RCON_PASSWORD |
(empty → random) | Dashboard login password. Only applied when windrose_plus.json does not exist yet. |
When WINDROSE_PLUS_ENABLED=true, expose the dashboard port (already in the provided docker-compose.yml):
ports:
- '7777:7777/tcp'
- '7777:7777/udp'
- '8780:8780/tcp'Windrose+ supports custom Lua mods that hot-reload on file change. Drop a mod folder (with mod.json and init.lua) into server-files/windrose_plus_mods/ on the host — it'll load on the next restart and hot-reload on subsequent file changes. See the upstream scripting guide for the API reference.
- The container needs outbound network access when installing or upgrading Windrose+.
- Changing
WINDROSE_PLUS_VERSIONtriggers a reinstall on the next container start; user-added Lua mods and existingwindrose_plus.json/windrose_plus*.iniedits are preserved.
On first start the server automatically generates two configuration files inside server-files/. The container handles this automatically — it starts the server once to generate the files, applies your settings, then starts normally.
Players connect either via invite code (default) or IP address & port. The values for both can be set in your .env and are also visible in server-files/R5/ServerDescription.json.
Invite codes use the ICE protocol to establish a P2P connection.
Using your server's IP address will establish a direct connection.
Important
You can use an invite code or a direct connection via IP address, but not both.
The code is set by INVITE_CODE in the .env file or InviteCode in ServerDescription.json. Share it with players who join via Play → Connect to Server in-game.
This is enabled by USE_DIRECT_CONNECTION=true in the .env file or UseDirectConnection in ServerDescription.json.
If any players are connecting from the same local network, the default P2P_PROXY_ADDRESS=127.0.0.1 will not work. You must:
- Set
P2P_PROXY_ADDRESSto the server machine's LAN IP address (e.g.192.168.1.100) - Add
network_mode: hostto yourdocker-compose.ymlservice so the container shares the host's network stack
services:
windrose:
image: indifferentbroccoli/windrose-server-docker
restart: unless-stopped
container_name: windrose
stop_grace_period: 30s
network_mode: host
env_file:
- .env
volumes:
- ./server-files:/home/steam/server-filesLocated at server-files/R5/ServerDescription.json. This file can only be edited while the server is stopped.
| Field | Description |
|---|---|
InviteCode |
Invite code for players to find your server. Min 6 chars, 0-9 a-z A-Z, case sensitive |
UseDirectConnection |
true if using direct connection via IP, or false (default) if using invite code |
DirectConnectionServerPort |
Port when direct connection is enabled. Default is 7777 |
DirectConnectionServerAddress |
Technical field — should not be changed |
DirectConnectionProxyAddress |
Address for the direct connection proxy. Default is 0.0.0.0 |
UserSelectedRegion |
Region for the connection service. Default is EU. Options: SEA, CIS, EU |
IsPasswordProtected |
true or false |
Password |
Server password |
ServerName |
Display name of the server |
WorldIslandId |
ID of the world to load — must match the folder name of a WorldDescription.json |
MaxPlayerCount |
Maximum simultaneous players |
P2pProxyAddress |
IP for listening sockets. Use 127.0.0.1 (default) — the proxy is an internal socket |
{
"Version": 1,
"ServerDescription_Persistent": {
"PersistentServerId": "...",
"InviteCode": "myfriends",
"IsPasswordProtected": false,
"Password": "",
"ServerName": "My Windrose Server",
"WorldIslandId": "...",
"MaxPlayerCount": 10,
"P2pProxyAddress": "127.0.0.1",
"DirectConnectionProxyAddress": "0.0.0.0",
"UseDirectConnection": false,
"DirectConnectionServerPort": 7777,
"UserSelectedRegion": "EU",
"DirectConnectionServerAddress": ""
}
}Located at server-files/R5/Saved/SaveProfiles/Default/RocksDB/<version>/Worlds/<world-id>/WorldDescription.json. One file per world. This file can only be edited while the server is stopped.
| Field | Description |
|---|---|
WorldPresetType |
Difficulty preset: "Easy", "Medium", "Hard", or "Custom". If any WorldSettings values are present the server forces this to "Custom" |
WorldName |
Name of the world |
WorldSettings |
Custom parameters — leave all sections empty to use a preset |
Only takes effect when
WorldPresetTypeis"Custom". LeaveWorldSettingsempty to use a preset.
Bool parameters
| Parameter key | Default | Description |
|---|---|---|
WDS.Parameter.Coop.SharedQuests |
true |
When a player completes a co-op quest it auto-completes for all players who have it active |
WDS.Parameter.EasyExplore |
false |
Hides map markers for points of interest, making exploration harder. Called "Immersive Exploration" in-game |
Float parameters
| Parameter key | Default | Range | Description |
|---|---|---|---|
WDS.Parameter.MobHealthMultiplier |
1.0 |
0.2 – 5.0 | Enemy health multiplier |
WDS.Parameter.MobDamageMultiplier |
1.0 |
0.2 – 5.0 | Enemy damage multiplier |
WDS.Parameter.ShipsHealthMultiplier |
1.0 |
0.4 – 5.0 | Enemy ship health multiplier |
WDS.Parameter.ShipsDamageMultiplier |
1.0 |
0.2 – 2.5 | Enemy ship damage multiplier |
WDS.Parameter.BoardingDifficultyMultiplier |
1.0 |
0.2 – 5.0 | How many enemy sailors must be defeated to win a boarding action |
WDS.Parameter.Coop.StatsCorrectionModifier |
1.0 |
0.0 – 2.0 | Adjusts enemy health and posture loss based on player count |
WDS.Parameter.Coop.ShipStatsCorrectionModifier |
0.0 |
0.0 – 2.0 | Adjusts enemy ship health based on player count |
Tag parameters
| Parameter key | Default | Options | Description |
|---|---|---|---|
WDS.Parameter.CombatDifficulty |
WDS.Parameter.CombatDifficulty.Normal |
Easy / Normal / Hard |
Boss encounter difficulty and general enemy aggression |
Example WorldDescription.json:
{
"Version": 1,
"WorldDescription": {
"IslandId": "...",
"WorldName": "My World",
"WorldPresetType": "Custom",
"WorldSettings": {
"BoolParameters": {
"{\"TagName\": \"WDS.Parameter.Coop.SharedQuests\"}": true,
"{\"TagName\": \"WDS.Parameter.EasyExplore\"}": false
},
"FloatParameters": {
"{\"TagName\": \"WDS.Parameter.MobHealthMultiplier\"}": 1,
"{\"TagName\": \"WDS.Parameter.MobDamageMultiplier\"}": 1,
"{\"TagName\": \"WDS.Parameter.ShipsHealthMultiplier\"}": 1,
"{\"TagName\": \"WDS.Parameter.ShipsDamageMultiplier\"}": 1,
"{\"TagName\": \"WDS.Parameter.BoardingDifficultyMultiplier\"}": 1,
"{\"TagName\": \"WDS.Parameter.Coop.StatsCorrectionModifier\"}": 1,
"{\"TagName\": \"WDS.Parameter.Coop.ShipStatsCorrectionModifier\"}": 0
},
"TagParameters": {
"{\"TagName\": \"WDS.Parameter.CombatDifficulty\"}": {
"TagName": "WDS.Parameter.CombatDifficulty.Normal"
}
}
}
}
}| Path | Description |
|---|---|
/home/steam/server-files |
Server installation files, world saves, and configuration |
If you are hosting this server inside a Proxmox VM or LXC container, set the CPU type to host.
Proxmox's default CPU types (e.g. kvm64) omit instruction sets that Wine and the server binary may depend on. This can cause the server to fail to start, crash at runtime, or fail silently with no useful output.
This is a Dockerized Windrose dedicated server maintained by indifferent broccoli. We offer managed Windrose server hosting if you'd rather not self-host.
