Migrating a Vintage Story Dedicated Server from Windows to Linux
A recurring question on r/VintageStory: "I've been running my server on Windows for a year. I want to move to Linux for stability/cost/cron-jobs/etc. How do I migrate without losing my world?" The good news: Vintage Story uses cross-platform save files (.vcdbs is a SQLite-backed binary), so the world data transfers cleanly. The not-so-good news: file path conventions, .NET runtime setup, and some mod compatibility quirks need handling. This page walks through the full migration.
Why migrate to Linux
Common reasons admins cite:
- Cost: Linux VPS plans are typically 30-50% cheaper than equivalent Windows plans (no OS licensing).
- Memory efficiency: Linux runs more lean for the same hardware. A Vintage Story server typically uses 200-500 MB less RAM on Linux than Windows for the same workload.
- Cron jobs: Scheduling backups, restarts, and announcements is much easier with bash + cron than Task Scheduler.
- Uptime stability: Linux can run for months between reboots; Windows benefits from monthly restarts for updates.
- SSH automation: Easier remote management, log tailing, and scripted maintenance.
Pre-migration audit (do this BEFORE you start)
- Note your current Vintage Story version. The target Linux server must run the same version (Windows save loaded by a different version Linux server may convert/upgrade the save format).
- List your installed mods. Get each mod's exact filename and version.
- Identify your
serverconfig.jsonfile and any customplayermods.jsonor other settings. - Take a fresh backup of
VintagestoryData/Saves/โ both the .vcdbs files and any associated playerdata. - Note your port forwarding rules (42420 TCP+UDP is the default).
Step 1 โ Provision a Linux box with .NET 7
Most modern Ubuntu 22.04 LTS or Debian 12 installations support .NET 7 directly from the official repository:
# Ubuntu 22.04 / Debian 12
sudo apt update
sudo apt install -y aspnetcore-runtime-7.0
dotnet --version # Verify: should show 7.0.x
For older distros (Ubuntu 20.04, etc.) you'll need to add Microsoft's package repository first. See Microsoft's .NET on Linux docs for the per-distro setup.
Step 2 โ Download the Linux Vintage Story server
From your Vintage Story account downloads page, get the Linux server binary (vs_server_linux-x64_X.X.X.tar.gz). It must be the same version as your Windows install.
mkdir -p ~/vintage-story-server
cd ~/vintage-story-server
wget https://cdn.vintagestory.at/gamefiles/vs_server_linux-x64_1.22.2.tar.gz
tar -xzf vs_server_linux-x64_*.tar.gz
ls VintagestoryServer.dll # Verify extraction
Step 3 โ Transfer save and mods from Windows
The Vintage Story data directory location differs by platform:
| Platform | Default data directory |
|---|---|
| Windows | %APPDATA%/VintagestoryData/ (typically C:/Users/<you>/AppData/Roaming/VintagestoryData/) |
| Linux (default) | ~/.config/VintagestoryData/ |
On Windows, locate your VintagestoryData folder. Copy these subdirectories to the Linux box:
Saves/โ contains your world's .vcdbs fileMods/โ your installed modsserverconfig.jsonโ server settings (note: contains your admin password in plain text)ModConfig/โ mod-specific settings (only if you have customized any)playerdata/โ player progress, inventories, claims (if you have any non-default playerdata structure)
On the Linux box, create ~/.config/VintagestoryData/ and copy in:
mkdir -p ~/.config/VintagestoryData/{Saves,Mods,ModConfig,playerdata}
# Transfer files from Windows via SCP, SFTP, or a USB drive
# Example with SCP from Windows (using Cygwin or WSL):
scp -r /c/Users/you/AppData/Roaming/VintagestoryData/* user@linux-server:~/.config/VintagestoryData/
Step 4 โ Verify file ownership and permissions
On Linux, file ownership matters. Make sure the user who will run the server owns the files:
chown -R $USER:$USER ~/.config/VintagestoryData/
chmod -R u+rwX ~/.config/VintagestoryData/
For systemd-managed servers, the systemd unit's User= directive determines ownership requirements. Match that.
Step 5 โ First launch
cd ~/vintage-story-server
dotnet VintagestoryServer.dll --dataPath ~/.config/VintagestoryData/
Watch the console output for:
- "Server started" message โ good
- Mod load errors โ check that the mod files transferred correctly
- "Save format upgraded" โ expected if minor version changed; safe
- Crash on world load โ see our crash log location guide
Step 6 โ Port forwarding on the new Linux host
If your Linux box is behind NAT (home server, residential connection), update your router's port forwarding to point to the new server's LAN IP:
- Port: 42420
- Protocol: TCP and UDP (both are required since v1.18+)
If you're on a VPS with a public IP, just configure the host firewall:
sudo ufw allow 42420/tcp
sudo ufw allow 42420/udp
Step 7 โ Set up systemd auto-start (recommended)
Create /etc/systemd/system/vintagestory-server.service:
[Unit]
Description=Vintage Story Dedicated Server
After=network.target
[Service]
Type=simple
User=vintagestory
WorkingDirectory=/home/vintagestory/vintage-story-server
ExecStart=/usr/bin/dotnet VintagestoryServer.dll --dataPath /home/vintagestory/.config/VintagestoryData/
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable vintagestory-server
sudo systemctl start vintagestory-server
sudo systemctl status vintagestory-server # Verify running
journalctl -u vintagestory-server -f # Live log tail
Common migration issues
| Symptom | Cause | Fix |
|---|---|---|
| Server crashes immediately | .NET 7 not installed or wrong version | dotnet --version should show 7.0.x; install if missing |
| "Save file not found" | Wrong --dataPath argument | Verify the path; absolute paths work most reliably |
| "Permission denied" on save load | File ownership mismatch from Windows-style ACLs | chown -R user:user ~/.config/VintagestoryData/ |
| Players can connect but world is wrong / empty | Save file didn't transfer correctly | Verify .vcdbs file size matches the Windows source |
| Mods fail to load | Mod author Windows-specific dependency | Rare; check the mod's page for Linux compatibility |
| Server runs but no one can connect | Linux firewall or VPS firewall blocking port 42420 | sudo ufw allow 42420/tcp and /udp |
| Existing player names not recognized | playerdata directory didn't transfer | Re-transfer the playerdata/ folder; verify file timestamps |
Post-migration checklist
- [ ] Linux server starts cleanly on first launch
- [ ] Save file loads with correct world data (matching size and seed)
- [ ] All mods load without errors in
server-main.txt - [ ] At least one trusted player can connect from outside the LAN
- [ ] Existing player progress (inventory, position, claims) is intact
- [ ] Backups are scheduled (cron job, host backup, or manual)
- [ ] Systemd auto-restart is enabled and tested
- [ ] Original Windows server is stopped (don't run both)
- [ ] DNS / connect URL communicated to all players
- [ ] Backup of Windows save kept offline for 30 days in case rollback needed
What you DON'T need to migrate
- Windows-specific scheduled tasks โ replace with cron
- Windows Defender exclusions โ Linux doesn't need them
- Steam files โ Vintage Story doesn't use Steam
- Anti-cheat configs โ Vintage Story doesn't have one
- Sound/graphics drivers โ dedicated server doesn't render
Performance expectations after migration
Expect:
- ~200-500 MB lower idle RAM use
- ~5-10% faster chunk generation (better .NET 7 Linux JIT)
- Same tick rate (single-thread bottleneck applies on both)
- Better long-term uptime (no monthly forced reboots)
- Lower hosting cost if you're paying for the OS license
Related guides
- Dedicated server installation
- Save management
- Installing mods
- Long-term modded server setup
- Server configuration
Don't want to manage Linux yourself? Supercraft Vintage Story hosting runs on managed Linux with .NET 7 auto-updated, systemd auto-restart configured, hourly backups, and 5 regions worldwide. Migrate from your home Windows setup in 15 minutes by uploading your save via FTP. Plans from $5.99/mo.