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. This README documents the exact setup currently running in production. Table of Contents 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: Windrose Dedicated Server (Windows build) Inside a TrueNAS SCALE App container 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: May 10, 2026 Directory Layout Persistent Storage Mounted into the container: Code /data/Saved Windrose stores all world data here: Code /data/Saved/SaveProfiles/Default/RocksDB/0.10.0/Worlds// Game Installation Directory Code /server /server/R5 This is where SteamCMD installs the Windrose server files. 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 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: Code windrose Your deployment requires: Code windrose.theminisip.ca Both must resolve to the LAN IP of the TrueNAS host: Code 192.168.3.41 The entrypoint injects this automatically: bash 192.168.3.41 windrose windrose.theminisip.ca This prevents ICE errors such as: Code Cannot resolve addresses for host windrose. Error on getting local ICE candidates P2pClient is broken DXVK Behavior DXVK is required even in headless mode. Your container includes: Code /opt/dxvk/x32/\*.dll /opt/dxvk/x64/\*.dll The entrypoint: Runs setup-dxvk.sh if present Falls back to manual DLL copy Logs exit codes Never crashes if DXVK is missing or incomplete This ensures Wine initializes correctly. Server Launch Command The server is launched with: bash wine WindroseServer-Win64-Shipping.exe \\ -log \\ -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: Initializes Wine prefix Installs DXVK (non‑fatal) Injects hostname resolution Validates WORLD\_ID Launches the server This is the exact working version currently deployed. Networking Requirements LAN Works out of the box. WAN Forward these ports: Port Protocol Purpose 7777 UDP Game traffic 15000 UDP ICE / P2P 27015 UDP Query port Ensure Cloudflare DNS for: Code windrose.theminisip.ca points to your public IP. Troubleshooting ICE Errors If you see: Code Cannot resolve addresses for host windrose Check: /etc/hosts mapping DNS for windrose.theminisip.ca Correct WORLD\_ID World Not Loading Ensure: Code /data/Saved/SaveProfiles/Default/RocksDB/0.10.0/Worlds// exists. DXVK Errors Non‑fatal — server will still run.