Running Vintage Story in Docker, the lazy way

Powered by the joys of the .NET Runtime

posted 2025-10-16

This post is a short one, I just thought it was fun and/or useful to write about. My friend group is starting their seasonal Vintage Story addiction, which means I’m in charge of setting up a dedicated server.

The Vintage Story dedicated server comes with its own server.sh shell script (which seems to be the official setup method). It runs the game under a screen session, which I’m not a fan of, as I’d prefer to use my existing Docker setup. It also requires you to install the .NET Runtime, which I didn’t want to do (and couldn’t do back when Vintage Story still used .NET 7).

However, because Vintage Story is written in C# and uses the modern .NET Runtime, you can just skip server.sh entirely and execute VintagestoryServer.dll using the dotnet CLI. This also makes my life easier, since I don’t need a custom Dockerfile and I can just use the official .NET images. I’m used to updating games with SteamCMD, so I prefer mounting the game install as a volume instead of baking it into the image.

The dedicated server can be easily downloaded without authentication, so I just unzip it into a folder:

wget https://cdn.vintagestory.at/gamefiles/stable/vs_server_linux-x64_1.21.5.tar.gz
mkdir ./server
tar -xf ./vs_server_linux-x64_1.21.5.tar.gz -C ./server
rm ./vs_server_linux-x64_1.21.5.tar.gz

Finally, I just created a compose.yaml with the official .NET Runtime image:

services:
  vintagestory:
    image: mcr.microsoft.com/dotnet/runtime:8.0
    restart: unless-stopped
    ports:
      - "42420:42420/tcp"
    volumes:
      - ./server:/var/vintagestory/server:ro
      - ./data:/var/vintagestory/data
    command: ["dotnet", "/var/vintagestory/server/VintagestoryServer.dll", "--dataPath", "/var/vintagestory/data"]

After starting the server, it’s easy to edit things in the data directory (e.g. put mods into the Mods folder or edit serverconfig.json). Problem solved!