Install a Windrose Dedicated Server on Ubuntu Using Wine + SteamCMD

🐧 Ubuntu 26.04 🍷 Wine 🎮 SteamCMD Updated 19 May 2026

This guide shows how to install and run a Windrose dedicated server on Ubuntu using SteamCMD, Wine, and Xvfb (virtual display).

SteamCMD is a command-line version of the Steam client. It lets you download and update game server files directly on a Linux machine without needing a full Steam installation or a desktop environment.

Wine is a compatibility layer that lets Linux run Windows applications by translating Windows system calls into their Linux equivalents — no virtual machine required. Because Windrose's dedicated server is a Windows executable, we use Wine to run it on Ubuntu.

A few key principles this guide follows:

  • Wine is used to run the Windows server executable on Linux — no virtual machine required
  • A dedicated system user is created to run the server, keeping it isolated from root
  • systemd is used to manage the server process, ensuring it starts on boot and restarts if it crashes

Server Requirements

Official requirements are for Windows. Running via Wine on Ubuntu uses slightly more RAM, so err on the side of the next tier up.

Parameter 4 players 8 players
OS Ubuntu 26.04 64-bit Ubuntu 26.04 64-bit
CPU 2 cores 4 cores
RAM 2 GB 4 GB
Storage 35 – 50 GB SSD 50 GB NVMe recommended

1 Update Ubuntu

Start with a clean, fully updated Ubuntu 26.04 system.

apt update && apt upgrade -y
apt install wget curl unzip tmux xvfb software-properties-common -y

2 Set Timezone

Set the server timezone so scheduled tasks like the daily restart fire at the right local time. List available timezones to find yours:

timedatectl list-timezones

Then set it:

timedatectl set-timezone Australia/Sydney

Confirm it applied:

timedatectl

3 Install Wine & SteamCMD

Enable the multiverse repository and i386 architecture, then install Wine and SteamCMD together. The server executable is 64-bit so only wine64 is needed. lib32gcc-s1 is required by SteamCMD on 64-bit Ubuntu.

add-apt-repository multiverse
dpkg --add-architecture i386
apt update
apt install -y \
  steamcmd \
  wine \
  wine64 \
  lib32gcc-s1

Run SteamCMD once to let it update itself before use:

/usr/games/steamcmd +quit

4 Create a Dedicated User

Running the server as root is a security risk. Create a dedicated windrose user with no login shell and no sudo access.

useradd -r -m -s /usr/sbin/nologin windrose

All server files and scripts will be owned by this user. The systemd service will also run as this user.

5 Download the Windrose Dedicated Server

Use SteamCMD to download the Windows server files as the windrose user. The install directory must be set before logging in. The +@sSteamCmdForcePlatformType windows flag tells SteamCMD to fetch the Windows build even though you're on Linux.

sudo -u windrose /usr/games/steamcmd \
  +@sSteamCmdForcePlatformType windows \
  +force_install_dir /home/windrose/windrose \
  +login anonymous \
  +app_update 4129620 validate \
  +quit

6 Create a Startup Script

Create a script that handles the virtual display and logging. It will be owned and run by the windrose user.

cat > /home/windrose/start-windrose.sh << 'EOF'
#!/bin/bash

cd /home/windrose/windrose/R5/Binaries/Win64

xvfb-run -a wine WindroseServer-Win64-Shipping.exe \
    -log \
    >> /home/windrose/windrose.log 2>&1
EOF

chmod +x /home/windrose/start-windrose.sh
chown windrose:windrose /home/windrose/start-windrose.sh

7 Set Up the systemd Service

Create a systemd service so the server starts automatically on boot and restarts if it crashes.

cat > /etc/systemd/system/windrose.service << 'EOF'
[Unit]
Description=Windrose Dedicated Server
After=network.target

[Service]
Type=simple
User=windrose
Group=windrose
WorkingDirectory=/home/windrose/windrose/R5/Binaries/Win64
ExecStart=/home/windrose/start-windrose.sh
Restart=on-failure
RestartSec=10
KillMode=control-group
TimeoutStopSec=15

[Install]
WantedBy=multi-user.target
EOF

Enable and start the service:

systemctl daemon-reload
systemctl enable windrose
systemctl start windrose

Check it is running:

systemctl status windrose

To stop or restart the server:

systemctl stop windrose
systemctl restart windrose

8 Check the Log

Tail the log file to monitor server output in real time.

tail -f /home/windrose/windrose.log
Tip: Press Ctrl+C to stop tailing. The server will keep running as a systemd service.

Configuration

⚠ Stop the server before making any config changes. Changes to config files will not be picked up while the server is running, and may be overwritten on shutdown.
systemctl stop windrose

Daily Restart

A daily restart keeps the server healthy and picks up any file changes. Set this up using a systemd timer — no cron required.

Create the timer file:

cat > /etc/systemd/system/windrose-restart.timer << 'EOF'
[Unit]
Description=Restart Windrose server daily

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

Create the matching service that triggers the restart:

cat > /etc/systemd/system/windrose-restart.service << 'EOF'
[Unit]
Description=Restart Windrose server

[Service]
Type=oneshot
ExecStart=/bin/systemctl restart windrose
EOF

Enable and start the timer:

systemctl daemon-reload
systemctl enable --now windrose-restart.timer

Verify it is scheduled:

systemctl list-timers windrose-restart.timer
Note: The restart is scheduled for 4:00 AM daily in the system timezone you set in step 2. Change 04:00:00 in the timer file to any time you prefer, then run systemctl daemon-reload.

Upgrading the Server

When a new version of Windrose is released, stop the server, update the files with SteamCMD, then restart. The stop may take up to 15 seconds while Wine processes are cleaned up.

systemctl stop windrose
sudo -u windrose /usr/games/steamcmd \
  +@sSteamCmdForcePlatformType windows \
  +force_install_dir /home/windrose/windrose \
  +login anonymous \
  +app_update 4129620 validate \
  +quit
systemctl start windrose
Note: The validate flag checks all existing files against Steam's manifest and replaces anything corrupted or outdated. It's safe to run on an existing installation.

Change the Server Name

The server name is set in /home/windrose/windrose/R5/ServerDescription.json.

nano /home/windrose/windrose/R5/ServerDescription.json

Update the name field:

{
  "Name": "My Windrose Server"
}

Save the file and restart the server for the change to take effect.

Set a Server Password

The password is set in /home/windrose/windrose/R5/ServerDescription.json.

nano /home/windrose/windrose/R5/ServerDescription.json

Find the password field and set your desired value:

{
  "Password": "yourpasswordhere"
}

Save the file and restart the server for the change to take effect.

Joining the Server

How to Join

Players need the server's invite code to connect. The invite code is found in /home/windrose/windrose/R5/ServerDescription.json.

grep -o '"InviteCode": "[^"]*"' /home/windrose/windrose/R5/ServerDescription.json

Share the invite code with players. In Windrose, select Join Server and enter the invite code to connect.

Windrose join server screen showing the invite code field

Troubleshooting

Check Service Status

The first step for any issue — shows whether the server is running, when it last started or stopped, and the most recent log output.

systemctl status windrose

View Full Logs

For more detail, check the systemd journal or the server log file directly.

journalctl -u windrose -n 100 --no-pager
tail -f /home/windrose/windrose.log

Service Won't Start

Check that the startup script exists and is executable:

ls -la /home/windrose/start-windrose.sh

Check that the server files are present:

ls /home/windrose/windrose/R5/Binaries/Win64/WindroseServer-Win64-Shipping.exe

Confirm Wine and xvfb-run are installed:

which wine && which xvfb-run