[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1816":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":15,"starSnapshotCount":15,"syncStatus":17,"lastSyncTime":28,"discoverSource":29},1816,"windrose-server-docker","indifferentbroccoli\u002Fwindrose-server-docker","indifferentbroccoli","This is a Dockerized version of the Windrose dedicated server.",null,"Shell",188,34,7,29,0,1,2,24,3,4.63,"GNU General Public License v3.0",false,"main",[],"2026-06-12 02:00:33","![marketing_assets_banner](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fb8b4ae5c-06bb-46a7-8d94-903a04595036)\n[![GitHub License](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Findifferentbroccoli\u002Fwindrose-server-docker?style=for-the-badge&color=6aa84f)](https:\u002F\u002Fgithub.com\u002Findifferentbroccoli\u002Fwindrose-server-docker\u002Fblob\u002Fmain\u002FLICENSE)\n[![GitHub Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Findifferentbroccoli\u002Fwindrose-server-docker?style=for-the-badge&color=6aa84f)](https:\u002F\u002Fgithub.com\u002Findifferentbroccoli\u002Fwindrose-server-docker\u002Freleases)\n[![GitHub Repo stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Findifferentbroccoli\u002Fwindrose-server-docker?style=for-the-badge&color=6aa84f)](https:\u002F\u002Fgithub.com\u002Findifferentbroccoli\u002Fwindrose-server-docker)\n[![Discord](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F798321161082896395?style=for-the-badge&label=Discord&labelColor=5865F2&color=6aa84f)](https:\u002F\u002Fdiscord.gg\u002Findifferentbroccoli)\n[![Docker Pulls](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Findifferentbroccoli\u002Fwindrose-server-docker?style=for-the-badge&color=6aa84f)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Findifferentbroccoli\u002Fwindrose-server-docker)\n\nGame server hosting · Fast RAM · High-speed internet · Eat lag for breakfast\n\n[Try our Windrose server hosting free for 2 days!](https:\u002F\u002Findifferentbroccoli.com\u002Fwindrose-server-hosting)\n\n## Windrose Dedicated Server Docker\n\nA Docker container for running a Windrose dedicated server. The server binary is Windows-only and runs via Wine.\n\n## Server Requirements\n\n| | 2 Players | 4 Players | 10 Players |\n|--|-----------|-----------|------------|\n| CPU | 2 cores @ 3.2 GHz | 2 cores @ 3.2 GHz | 2 cores @ 3.2 GHz |\n| RAM | 8 GB | 12 GB | 16 GB |\n| Storage | 35 GB SSD | 35 GB SSD | 35 GB SSD |\n\n## How to use\n\nCopy the `.env.example` file to `.env`, fill in your values, then use either `docker compose` or `docker run`.\n\n### Docker Compose\n\n```yaml\nservices:\n  windrose:\n    image: indifferentbroccoli\u002Fwindrose-server-docker\n    restart: unless-stopped\n    container_name: windrose\n    stop_grace_period: 30s\n    env_file:\n      - .env\n    volumes:\n      - .\u002Fserver-files:\u002Fhome\u002Fsteam\u002Fserver-files\n```\n\n```shell\ndocker compose up -d\n```\n\n### Docker Run\n\n```shell\ndocker run -d \\\n    --restart unless-stopped \\\n    --name windrose \\\n    --stop-timeout 30 \\\n    --env-file .env \\\n    -v .\u002Fserver-files:\u002Fhome\u002Fsteam\u002Fserver-files \\\n    indifferentbroccoli\u002Fwindrose-server-docker\n```\n\n## Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `PUID` | `1000` | User ID to run the server process as |\n| `PGID` | `1000` | Group ID to run the server process as |\n| `UPDATE_ON_START` | `true` | Download and validate server files on every startup. Set to `false` to skip. |\n| `USE_DIRECT_CONNECTION` | `false` | Set to `true` to connect to your server via IP and port instead of invite code. |\n| `SERVER_PORT` | `7777` | Only applies if `USE_DIRECT_CONNECTION=true`. Port for direct connection. Requires both TCP and UDP. |\n| `DIRECT_CONNECTION_PROXY_ADDRESS` | `0.0.0.0` | Only applies if `USE_DIRECT_CONNECTION=true`. Address for the direct connection proxy. |\n| `USER_SELECTED_REGION` | | Region for the connection service. Leave empty to auto-select. Options: `SEA`, `CIS`, `EU` |\n| `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 |\n| `SERVER_NAME` | | Display name for your server |\n| `SERVER_PASSWORD` | | Leave empty for a public server |\n| `MAX_PLAYERS` | `10` | Maximum number of simultaneous players |\n| `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 |\n| `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. |\n| `WINE_VERBOSE` | `false` | Set to `true` to enable verbose Wine logging. Useful for diagnosing Wine crashes. Enables `WINEDEBUG=+all` and surfaces Wine output directly in the container logs. |\n\n## UE4SS (optional)\n\n[UE4SS](https:\u002F\u002Fgithub.com\u002FUE4SS-RE\u002FRE-UE4SS) is a Lua scripting and modding framework for Unreal Engine games.\n\n> [!NOTE]\n> `UE4SS_ENABLED` is not needed if `WINDROSE_PLUS_ENABLED=true` — Windrose+ installs and manages its own compatible UE4SS version automatically.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `UE4SS_ENABLED` | `false` | Set to `true` to install UE4SS standalone. Automatically enabled by Windrose+. |\n\n## Windrose+ (optional)\n\n[Windrose+](https:\u002F\u002Fgithub.com\u002Fhumangenome\u002FWindrosePlus) 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.\n\nEnable by setting `WINDROSE_PLUS_ENABLED=true` in your `.env`, then start the container. The dashboard is exposed on port `8780`.\n\n### Upgrading \u002F downgrading\n\nThe 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](https:\u002F\u002Fgithub.com\u002Fhumangenome\u002FWindrosePlus\u002Freleases)) and restart the container. Leave `WINDROSE_PLUS_VERSION` empty to use the latest release.\n\n### Config changes\n\nEdit `server-files\u002Fwindrose_plus.json` (multipliers, feature flags) or any `server-files\u002Fwindrose_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.\n\nRCON 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.\n\n### Windrose+ environment variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WINDROSE_PLUS_ENABLED` | `false` | Set to `true` to enable the addon. Automatically enables UE4SS. |\n| `WINDROSE_PLUS_VERSION` | baked-in default | GitHub release tag of Windrose+ to install. Leave empty for the image default. |\n| `WINDROSE_PLUS_DASHBOARD_PORT` | `8780` | Port the web dashboard listens on inside the container. |\n| `WINDROSE_PLUS_RCON_PASSWORD` | (empty → random) | Dashboard login password. Only applied when `windrose_plus.json` does not exist yet. |\n\n### Ports\n\nWhen `WINDROSE_PLUS_ENABLED=true`, expose the dashboard port (already in the provided `docker-compose.yml`):\n\n```yaml\nports:\n  - '7777:7777\u002Ftcp'\n  - '7777:7777\u002Fudp'\n  - '8780:8780\u002Ftcp'\n```\n\n### Lua mods\n\nWindrose+ supports custom Lua mods that hot-reload on file change. Drop a mod folder (with `mod.json` and `init.lua`) into `server-files\u002Fwindrose_plus_mods\u002F` on the host — it'll load on the next restart and hot-reload on subsequent file changes. See the [upstream scripting guide](https:\u002F\u002Fgithub.com\u002Fhumangenome\u002FWindrosePlus\u002Fblob\u002Fmain\u002Fdocs\u002Fscripting-guide.md) for the API reference.\n\n### Caveats\n\n- The container needs outbound network access when installing or upgrading Windrose+.\n- Changing `WINDROSE_PLUS_VERSION` triggers a reinstall on the next container start; user-added Lua mods and existing `windrose_plus.json` \u002F `windrose_plus*.ini` edits are preserved.\n\n## Server Configuration\n\nOn first start the server automatically generates two configuration files inside `server-files\u002F`. The container handles this automatically — it starts the server once to generate the files, applies your settings, then starts normally.\n\n### Connecting\n\nPlayers 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\u002FR5\u002FServerDescription.json`.\nInvite codes use the ICE protocol to establish a P2P connection.\nUsing your server's IP address will establish a direct connection.\n\n> [!IMPORTANT]\n> You can use an invite code or a direct connection via IP address, but not both.\n\n#### Invite code\n\nThe 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.\n\n#### IP Address\n\nThis is enabled by `USE_DIRECT_CONNECTION=true` in the `.env` file or `UseDirectConnection` in `ServerDescription.json`.\n\n#### LAN connections\n\nIf any players are connecting from the same local network, the default `P2P_PROXY_ADDRESS=127.0.0.1` will not work. You must:\n\n1. Set `P2P_PROXY_ADDRESS` to the server machine's LAN IP address (e.g. `192.168.1.100`)\n2. Add `network_mode: host` to your `docker-compose.yml` service so the container shares the host's network stack\n\n```yaml\nservices:\n  windrose:\n    image: indifferentbroccoli\u002Fwindrose-server-docker\n    restart: unless-stopped\n    container_name: windrose\n    stop_grace_period: 30s\n    network_mode: host\n    env_file:\n      - .env\n    volumes:\n      - .\u002Fserver-files:\u002Fhome\u002Fsteam\u002Fserver-files\n```\n\n### ServerDescription.json\n\nLocated at `server-files\u002FR5\u002FServerDescription.json`. This file can only be edited while the server is stopped.\n\n| Field | Description |\n|-------|-------------|\n| `InviteCode` | Invite code for players to find your server. Min 6 chars, `0-9 a-z A-Z`, case sensitive |\n| `UseDirectConnection` | `true` if using direct connection via IP, or `false` (default) if using invite code |\n| `DirectConnectionServerPort` | Port when direct connection is enabled. Default is `7777` |\n| `DirectConnectionServerAddress` | Technical field — should not be changed |\n| `DirectConnectionProxyAddress` | Address for the direct connection proxy. Default is `0.0.0.0` |\n| `UserSelectedRegion` | Region for the connection service. Default is `EU`. Options: `SEA`, `CIS`, `EU` |\n| `IsPasswordProtected` | `true` or `false` |\n| `Password` | Server password |\n| `ServerName` | Display name of the server |\n| `WorldIslandId` | ID of the world to load — must match the folder name of a `WorldDescription.json` |\n| `MaxPlayerCount` | Maximum simultaneous players |\n| `P2pProxyAddress` | IP for listening sockets. Use `127.0.0.1` (default) — the proxy is an internal socket |\n\n```json\n{\n    \"Version\": 1,\n    \"ServerDescription_Persistent\": {\n        \"PersistentServerId\": \"...\",\n        \"InviteCode\": \"myfriends\",\n        \"IsPasswordProtected\": false,\n        \"Password\": \"\",\n        \"ServerName\": \"My Windrose Server\",\n        \"WorldIslandId\": \"...\",\n        \"MaxPlayerCount\": 10,\n        \"P2pProxyAddress\": \"127.0.0.1\",\n        \"DirectConnectionProxyAddress\": \"0.0.0.0\",\n        \"UseDirectConnection\": false,\n        \"DirectConnectionServerPort\": 7777,\n        \"UserSelectedRegion\": \"EU\",\n        \"DirectConnectionServerAddress\": \"\"\n    }\n}\n```\n\n### WorldDescription.json\n\nLocated at `server-files\u002FR5\u002FSaved\u002FSaveProfiles\u002FDefault\u002FRocksDB\u002F\u003Cversion>\u002FWorlds\u002F\u003Cworld-id>\u002FWorldDescription.json`. One file per world. This file can only be edited while the server is stopped.\n\n| Field | Description |\n|-------|-------------|\n| `WorldPresetType` | Difficulty preset: `\"Easy\"`, `\"Medium\"`, `\"Hard\"`, or `\"Custom\"`. If any `WorldSettings` values are present the server forces this to `\"Custom\"` |\n| `WorldName` | Name of the world |\n| `WorldSettings` | Custom parameters — leave all sections empty to use a preset |\n\n#### WorldSettings parameters\n\n> Only takes effect when `WorldPresetType` is `\"Custom\"`. Leave `WorldSettings` empty to use a preset.\n\n**Bool parameters**\n\n| Parameter key | Default | Description |\n|---------------|---------|-------------|\n| `WDS.Parameter.Coop.SharedQuests` | `true` | When a player completes a co-op quest it auto-completes for all players who have it active |\n| `WDS.Parameter.EasyExplore` | `false` | Hides map markers for points of interest, making exploration harder. Called \"Immersive Exploration\" in-game |\n\n**Float parameters**\n\n| Parameter key | Default | Range | Description |\n|---------------|---------|-------|-------------|\n| `WDS.Parameter.MobHealthMultiplier` | `1.0` | 0.2 – 5.0 | Enemy health multiplier |\n| `WDS.Parameter.MobDamageMultiplier` | `1.0` | 0.2 – 5.0 | Enemy damage multiplier |\n| `WDS.Parameter.ShipsHealthMultiplier` | `1.0` | 0.4 – 5.0 | Enemy ship health multiplier |\n| `WDS.Parameter.ShipsDamageMultiplier` | `1.0` | 0.2 – 2.5 | Enemy ship damage multiplier |\n| `WDS.Parameter.BoardingDifficultyMultiplier` | `1.0` | 0.2 – 5.0 | How many enemy sailors must be defeated to win a boarding action |\n| `WDS.Parameter.Coop.StatsCorrectionModifier` | `1.0` | 0.0 – 2.0 | Adjusts enemy health and posture loss based on player count |\n| `WDS.Parameter.Coop.ShipStatsCorrectionModifier` | `0.0` | 0.0 – 2.0 | Adjusts enemy ship health based on player count |\n\n**Tag parameters**\n\n| Parameter key | Default | Options | Description |\n|---------------|---------|---------|-------------|\n| `WDS.Parameter.CombatDifficulty` | `WDS.Parameter.CombatDifficulty.Normal` | `Easy` \u002F `Normal` \u002F `Hard` | Boss encounter difficulty and general enemy aggression |\n\n**Example `WorldDescription.json`:**\n\n```json\n{\n    \"Version\": 1,\n    \"WorldDescription\": {\n        \"IslandId\": \"...\",\n        \"WorldName\": \"My World\",\n        \"WorldPresetType\": \"Custom\",\n        \"WorldSettings\": {\n            \"BoolParameters\": {\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.Coop.SharedQuests\\\"}\": true,\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.EasyExplore\\\"}\": false\n            },\n            \"FloatParameters\": {\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.MobHealthMultiplier\\\"}\": 1,\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.MobDamageMultiplier\\\"}\": 1,\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.ShipsHealthMultiplier\\\"}\": 1,\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.ShipsDamageMultiplier\\\"}\": 1,\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.BoardingDifficultyMultiplier\\\"}\": 1,\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.Coop.StatsCorrectionModifier\\\"}\": 1,\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.Coop.ShipStatsCorrectionModifier\\\"}\": 0\n            },\n            \"TagParameters\": {\n                \"{\\\"TagName\\\": \\\"WDS.Parameter.CombatDifficulty\\\"}\": {\n                    \"TagName\": \"WDS.Parameter.CombatDifficulty.Normal\"\n                }\n            }\n        }\n    }\n}\n```\n\n## Volumes\n\n| Path | Description |\n|------|-------------|\n| `\u002Fhome\u002Fsteam\u002Fserver-files` | Server installation files, world saves, and configuration |\n\n## Proxmox\n\nIf you are hosting this server inside a Proxmox VM or LXC container, set the CPU type to **host**.\n\nProxmox'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.\n\n## About\n\nThis is a Dockerized Windrose dedicated server maintained by [indifferent broccoli](https:\u002F\u002Findifferentbroccoli.com). We offer [managed Windrose server hosting](https:\u002F\u002Findifferentbroccoli.com\u002Fwindrose-server-hosting) if you'd rather not self-host.\n","这个项目提供了一个Windrose专用游戏服务器的Docker化版本。它利用Wine在容器中运行原本仅支持Windows的服务器二进制文件，使得部署更加便捷高效。用户可以通过简单的Docker Compose或Docker Run命令启动服务，并且能够通过环境变量自定义服务器配置，如用户ID、组ID以及是否在启动时更新服务器文件等。此外，该项目还支持直接连接模式，允许玩家通过IP和端口而非邀请码加入游戏。适合那些需要快速搭建稳定且高性能Windrose游戏服务器的个人开发者或小型团队使用。","2026-06-11 02:46:12","CREATED_QUERY"]