Update README.md
Updating markdown
This commit is contained in:
@@ -1,400 +1,248 @@
|
|||||||
Windrose Dedicated Server — TrueNAS SCALE Deployment Guide
|
# Windrose Dedicated Server — TrueNAS SCALE Deployment Guide
|
||||||
|
|
||||||
A fully working configuration for running the Windrose Dedicated Server (Windows build) inside a TrueNAS SCALE container using Wine + DXVK, with persistent saves, explicit world selection, and fixed hostname resolution for ICE/P2P networking.
|
A fully working configuration for running the Windrose Dedicated Server (Windows build) inside a TrueNAS SCALE container using Wine + DXVK, with persistent saves, explicit world selection, and fixed hostname resolution for ICE/P2P networking.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This README documents the exact setup currently running in production.
|
This README documents the exact setup currently running in production.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
Table of Contents
|
- [Overview](#overview)
|
||||||
|
- [Directory Layout](#directory-layout)
|
||||||
|
- [Environment Variables](#environment-variables)
|
||||||
|
- [Hostname Resolution (ICE/P2P Fix)](#hostname-resolution-icep2p-fix)
|
||||||
|
- [DXVK Behavior](#dxvk-behavior)
|
||||||
|
- [Server Launch Command](#server-launch-command)
|
||||||
|
- [Entrypoint Behavior Summary](#entrypoint-behavior-summary)
|
||||||
|
- [Networking Requirements](#networking-requirements)
|
||||||
|
- [Troubleshooting](#troubleshooting)
|
||||||
|
- [Future Enhancements](#future-enhancements)
|
||||||
|
|
||||||
Overview
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
Directory Layout
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Environment Variables
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Hostname Resolution (ICE/P2P Fix)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DXVK Behavior
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Server Launch Command
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Entrypoint Behavior Summary
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Networking Requirements
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Troubleshooting
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Future Enhancements
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Overview
|
|
||||||
|
|
||||||
This deployment runs:
|
This deployment runs:
|
||||||
|
|
||||||
|
- Windrose Dedicated Server (Windows build)
|
||||||
|
- Inside a TrueNAS SCALE App container
|
||||||
Windrose Dedicated Server (Windows build)
|
- Using Wine + DXVK
|
||||||
|
- With persistent world saves
|
||||||
|
- With explicit WORLD_ID selection
|
||||||
|
- With hostname resolution fixes for ICE/P2P
|
||||||
Inside a TrueNAS SCALE App container
|
- With non‑fatal DXVK installation fallback
|
||||||
|
- With stable LAN/WAN connectivity
|
||||||
|
|
||||||
|
|
||||||
Using Wine + DXVK
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
With persistent world saves
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
With explicit WORLD\_ID selection
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
With hostname resolution fixes for ICE/P2P
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
With non‑fatal DXVK installation fallback
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
With stable LAN/WAN connectivity
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This configuration is confirmed working as of:
|
This configuration is confirmed working as of:
|
||||||
|
|
||||||
|
**May 10, 2026**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
May 10, 2026
|
## Directory Layout
|
||||||
|
|
||||||
|
### Persistent Storage
|
||||||
|
|
||||||
Directory Layout
|
|
||||||
|
|
||||||
Persistent Storage
|
|
||||||
|
|
||||||
Mounted into the container:
|
Mounted into the container:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
/data/Saved
|
/data/Saved
|
||||||
|
```
|
||||||
|
|
||||||
Windrose stores all world data here:
|
Windrose stores all world data here:
|
||||||
|
|
||||||
|
```
|
||||||
|
/data/Saved/SaveProfiles/Default/RocksDB/0.10.0/Worlds/<WORLD_ID>/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Game Installation Directory
|
||||||
|
|
||||||
Code
|
```
|
||||||
|
|
||||||
/data/Saved/SaveProfiles/Default/RocksDB/0.10.0/Worlds/<WORLD\_ID>/
|
|
||||||
|
|
||||||
Game Installation Directory
|
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
/server
|
/server
|
||||||
|
|
||||||
/server/R5
|
/server/R5
|
||||||
|
```
|
||||||
|
|
||||||
This is where SteamCMD installs the Windrose server files.
|
This is where SteamCMD installs the Windrose server files.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
Environment Variables
|
|
||||||
|
|
||||||
Set these in the TrueNAS SCALE App → Environment Variables.
|
Set these in the TrueNAS SCALE App → Environment Variables.
|
||||||
|
|
||||||
|
### Required
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
|----------|-------------|
|
||||||
|
| WORLD_ID | Folder name of the world to load. Example: `352359B474804C2A4D83D84AADC7579D` |
|
||||||
|
|
||||||
Required
|
### Optional
|
||||||
|
|
||||||
Variable Description
|
| Variable | Default | Description |
|
||||||
|
|--------------|---------------------------|-------------|
|
||||||
|
| WINEPREFIX | /data/wine/wineprefix | Wine prefix location |
|
||||||
|
| SAVED_DIR | /data/Saved | Persistent save directory |
|
||||||
|
|
||||||
WORLD\_ID Folder name of the world to load. Example: 352359B474804C2A4D83D84AADC7579D
|
---
|
||||||
|
|
||||||
|
## Hostname Resolution (ICE/P2P Fix)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Optional
|
|
||||||
|
|
||||||
Variable Default Description
|
|
||||||
|
|
||||||
WINEPREFIX /data/wine/wineprefix Wine prefix location
|
|
||||||
|
|
||||||
SAVED\_DIR /data/Saved Persistent save directory
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Hostname Resolution (ICE/P2P Fix)
|
|
||||||
|
|
||||||
Windrose internally tries to resolve the hostname:
|
Windrose internally tries to resolve the hostname:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
windrose
|
windrose
|
||||||
|
```
|
||||||
|
|
||||||
Your deployment requires:
|
Your deployment requires:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
windrose.theminisip.ca
|
windrose.theminisip.ca
|
||||||
|
```
|
||||||
|
|
||||||
Both must resolve to the LAN IP of the TrueNAS host:
|
Both must resolve to the LAN IP of the TrueNAS host:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
192.168.3.41
|
192.168.3.41
|
||||||
|
```
|
||||||
|
|
||||||
The entrypoint injects this automatically:
|
The entrypoint injects this automatically:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
bash
|
|
||||||
|
|
||||||
192.168.3.41 windrose windrose.theminisip.ca
|
192.168.3.41 windrose windrose.theminisip.ca
|
||||||
|
```
|
||||||
|
|
||||||
This prevents ICE errors such as:
|
This prevents ICE errors such as:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
Cannot resolve addresses for host windrose.
|
Cannot resolve addresses for host windrose.
|
||||||
|
|
||||||
Error on getting local ICE candidates
|
Error on getting local ICE candidates
|
||||||
|
|
||||||
P2pClient is broken
|
P2pClient is broken
|
||||||
|
```
|
||||||
|
|
||||||
DXVK Behavior
|
---
|
||||||
|
|
||||||
|
## DXVK Behavior
|
||||||
|
|
||||||
DXVK is required even in headless mode.
|
DXVK is required even in headless mode.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Your container includes:
|
Your container includes:
|
||||||
|
|
||||||
|
```
|
||||||
|
/opt/dxvk/x32/*.dll
|
||||||
Code
|
/opt/dxvk/x64/*.dll
|
||||||
|
```
|
||||||
/opt/dxvk/x32/\*.dll
|
|
||||||
|
|
||||||
/opt/dxvk/x64/\*.dll
|
|
||||||
|
|
||||||
The entrypoint:
|
The entrypoint:
|
||||||
|
|
||||||
|
- Runs setup-dxvk.sh if present
|
||||||
|
- Falls back to manual DLL copy
|
||||||
Runs setup-dxvk.sh if present
|
- Logs exit codes
|
||||||
|
- Never crashes if DXVK is missing or incomplete
|
||||||
|
|
||||||
|
|
||||||
Falls back to manual DLL copy
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Logs exit codes
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Never crashes if DXVK is missing or incomplete
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This ensures Wine initializes correctly.
|
This ensures Wine initializes correctly.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Server Launch Command
|
||||||
Server Launch Command
|
|
||||||
|
|
||||||
The server is launched with:
|
The server is launched with:
|
||||||
|
|
||||||
|
```
|
||||||
|
wine WindroseServer-Win64-Shipping.exe \
|
||||||
|
-log \
|
||||||
|
-unattended \
|
||||||
|
-nosteam \
|
||||||
|
-savedir "Saved" \
|
||||||
|
-saveprofile Default \
|
||||||
|
-world "$WORLD_ID"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
bash
|
- `"Saved"` resolves to `/server/R5/Saved`
|
||||||
|
- World data still loads from `/data/Saved` via RocksDB
|
||||||
|
- `-nosteam` avoids Steam API issues
|
||||||
|
- `-unattended` prevents UI prompts
|
||||||
|
|
||||||
wine WindroseServer-Win64-Shipping.exe \\
|
---
|
||||||
|
|
||||||
  -log \\
|
## Entrypoint Behavior Summary
|
||||||
|
|
||||||
  -unattended \\
|
|
||||||
|
|
||||||
  -nosteam \\
|
|
||||||
|
|
||||||
  -savedir "Saved" \\
|
|
||||||
|
|
||||||
  -saveprofile Default \\
|
|
||||||
|
|
||||||
  -world "$WORLD\_ID"
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"Saved" resolves to /server/R5/Saved
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
World data still loads from /data/Saved via RocksDB
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\-nosteam avoids Steam API issues
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\-unattended prevents UI prompts
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Entrypoint Behavior Summary
|
|
||||||
|
|
||||||
The entrypoint:
|
The entrypoint:
|
||||||
|
|
||||||
|
1. Initializes Wine prefix
|
||||||
|
2. Installs DXVK (non‑fatal)
|
||||||
Initializes Wine prefix
|
3. Injects hostname resolution
|
||||||
|
4. Validates WORLD_ID
|
||||||
|
5. Launches the server
|
||||||
|
|
||||||
Installs DXVK (non‑fatal)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Injects hostname resolution
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Validates WORLD\_ID
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Launches the server
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This is the exact working version currently deployed.
|
This is the exact working version currently deployed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Networking Requirements
|
||||||
|
|
||||||
Networking Requirements
|
### LAN
|
||||||
|
|
||||||
LAN
|
|
||||||
|
|
||||||
Works out of the box.
|
Works out of the box.
|
||||||
|
|
||||||
|
### WAN
|
||||||
|
|
||||||
WAN
|
|
||||||
|
|
||||||
Forward these ports:
|
Forward these ports:
|
||||||
|
|
||||||
|
| Port | Protocol | Purpose |
|
||||||
|
|------|----------|----------|
|
||||||
Port Protocol Purpose
|
| 7777 | UDP | Game traffic |
|
||||||
|
| 15000 | UDP | ICE / P2P |
|
||||||
7777 UDP Game traffic
|
| 27015 | UDP | Query port |
|
||||||
|
|
||||||
15000 UDP ICE / P2P
|
|
||||||
|
|
||||||
27015 UDP Query port
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Ensure Cloudflare DNS for:
|
Ensure Cloudflare DNS for:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
windrose.theminisip.ca
|
windrose.theminisip.ca
|
||||||
|
```
|
||||||
|
|
||||||
points to your public IP.
|
points to your public IP.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
Troubleshooting
|
### ICE Errors
|
||||||
|
|
||||||
ICE Errors
|
|
||||||
|
|
||||||
If you see:
|
If you see:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Code
|
|
||||||
|
|
||||||
Cannot resolve addresses for host windrose
|
Cannot resolve addresses for host windrose
|
||||||
|
```
|
||||||
|
|
||||||
Check:
|
Check:
|
||||||
|
|
||||||
|
- /etc/hosts mapping
|
||||||
|
- DNS for windrose.theminisip.ca
|
||||||
|
- Correct WORLD_ID
|
||||||
|
|
||||||
|
### World Not Loading
|
||||||
/etc/hosts mapping
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DNS for windrose.theminisip.ca
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Correct WORLD\_ID
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
World Not Loading
|
|
||||||
|
|
||||||
Ensure:
|
Ensure:
|
||||||
|
|
||||||
|
```
|
||||||
|
/data/Saved/SaveProfiles/Default/RocksDB/0.10.0/Worlds/<WORLD_ID>/
|
||||||
Code
|
```
|
||||||
|
|
||||||
/data/Saved/SaveProfiles/Default/RocksDB/0.10.0/Worlds/<WORLD\_ID>/
|
|
||||||
|
|
||||||
exists.
|
exists.
|
||||||
|
|
||||||
|
### DXVK Errors
|
||||||
|
|
||||||
DXVK Errors
|
|
||||||
|
|
||||||
Non‑fatal — server will still run.
|
Non‑fatal — server will still run.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
- Node.js web manager (deployment, config editing, restarts)
|
||||||
|
- Multi‑instance orchestration
|
||||||
|
- World backups & restores
|
||||||
|
- Metrics dashboard
|
||||||
|
- Log streaming
|
||||||
|
|||||||
Reference in New Issue
Block a user