Alle Steam Game Server in Docker -- einfach und schnell
Ich hab mir ein Framework gebaut, mit dem ich jeden Steam Dedicated Server in Docker zum Laufen bringen kann. Egal ob der Server nativ unter Linux läuft oder ob es nur eine Windows-Binary gibt -- beides funktioniert. Einmal aufgesetzt, und danach reicht ein einziger Befehl zum Starten, Updaten und Konfigurieren.
Das Ganze ist Open Source und auf GitHub verfügbar. Wenn dich das interessiert, kannst du es dir einfach holen und ausprobieren.
Worum geht's?
Ich wollte eine saubere Lösung haben, um Game Server zu deployen. Ohne jedes Mal von vorne anzufangen. Ohne manuell SteamCMD zu installieren, Wine einzurichten oder Config-Dateien zusammenzubasteln.
Das Ergebnis ist ein Docker-Framework das aus zwei Teilen besteht:
Ein Base Image -- da steckt alles drin was man braucht: Debian, SteamCMD, Wine 11.0, ein virtuelles Display (Xvfb) für Windows-Server, und ein Healthcheck-System das weiß ob der Server gerade updatet oder schon läuft.
Pro Spiel ein eigenes Repo -- mit Dockerfile, Docker Compose und ein paar kleinen Hook-Scripts. Jedes Repo funktioniert für sich allein. Du klonst es, passt die Settings an und startest. Fertig.
Aktuell gibt es zwei Server die damit laufen:
| Spiel | Plattform |
|---|---|
| Palworld | Linux (nativ) |
| Windrose | Windows (über Wine) |
Die Images gibt es auf Docker Hub und GitHub Packages -- du kannst von beiden Quellen pullen:
# Docker Hub
docker pull rndmjoker/gameserver-steam-palworld:latest
# GitHub Container Registry
docker pull ghcr.io/rndmjoker/gameserver-steam-palworld:latest
Palworld ist ein nativer Linux-Server, Windrose läuft als Windows-Server headless über Wine. Beides produktiv getestet.
Was macht das Framework für dich?
- Automatische Updates -- SteamCMD prüft bei jedem Start ob es was Neues gibt. Du musst dich um nichts kümmern.
- Linux und Windows -- du setzt einfach
STEAM_PLATFORM=linuxoderSTEAM_PLATFORM=windowsund der Rest passiert automatisch. Wine, Xvfb, Mono, Gecko -- alles schon drin. - Konfiguration über Environment Variables -- keine Config-Dateien editieren. Alles was du einstellen willst setzt du als Docker Variable.
- Retry bei Fehlern -- SteamCMD schlägt beim ersten Mal gerne mal fehl. Das Framework versucht es automatisch bis zu 3 Mal.
- Healthcheck -- Docker weiß ob dein Server läuft oder ob noch ein Update durchgeführt wird.
- Sauberes Shutdown -- bei SIGTERM fährt alles ordentlich runter, auch bei Windows-Servern über Wine.
- Kein Root -- der Container läuft als normaler User.
Wie funktioniert das technisch?
Es gibt drei Schichten:
| Schicht | Was steckt drin | Wie oft ändert sich das |
|---|---|---|
| Base Image | Debian + Wine + Xvfb + SteamCMD | Fast nie |
| Game Image | App-ID, Binary, Ports, Hooks | Einmal pro Spiel |
| Runtime | Spieldaten, Configs, Savegames | Bei jedem Start |
Das Base Image kontrolliert den kompletten Ablauf über einen Entrypoint. Für spielspezifische Sachen gibt es Hook-Scripts die du einfach in dein Game-Repo legst:
| Hook | Wann | Wofür |
|---|---|---|
pre-setup.sh |
Am Anfang | Defaults laden |
post-config.sh |
Nach der Config-Generierung | Configs dahin kopieren wo das Spiel sie braucht |
post-update.sh |
Nach SteamCMD | Mods installieren |
pre-start.sh |
Vor dem Start | Letzte Vorbereitungen |
Was beim Start passiert:
1. Defaults laden
2. Bei Windows: Xvfb + Wine Prefix aufsetzen
3. Config aus deinen Environment Variables generieren
4. SteamCMD: Game herunterladen oder updaten
5. Server starten
Was brauchst du?
- Einen Linux-Server (oder lokale Linux-Maschine) mit Docker
- Mindestens 8 GB RAM (besser 16 GB)
- Docker und Docker Compose v2
Falls du Docker noch nicht hast:
curl -fsSL https://get.docker.com | sh
So richtest du es ein
Base Image bauen
Das Base Image musst du einmal bauen. Danach nutzen es alle deine Game Server.
git clone https://github.com/RndmJoker/gameserver-steam-basic.git steam-basic
cd steam-basic/base
docker build -t steam-server-base:wine-11.0 -t steam-server-base:latest .
Dauert ca. 5-10 Minuten. Danach hast du ein Image das alles enthält.
Einen fertigen Game Server starten
Wenn ein Server schon existiert, brauchst du nichts zu bauen. Erstell einfach eine docker-compose.yml:
mkdir palworld-server && cd palworld-server
services:
palworld:
# Docker Hub:
image: rndmjoker/gameserver-steam-palworld:latest
# Alternativ von GitHub Container Registry:
# image: ghcr.io/rndmjoker/gameserver-steam-palworld:latest
container_name: palworld-server
restart: unless-stopped
network_mode: host
mem_limit: 12g
volumes:
- serverdata:/home/steam/serverdata
- serverconfig:/home/steam/serverconfig
environment:
- ServerName=Mein Server
- AdminPassword=sicheres-passwort
volumes:
serverdata:
serverconfig:
docker compose up -d
docker compose logs -f
Das Image wird gezogen, der Game Server runtergeladen, die Config generiert und der Server gestartet. Beim nächsten Neustart wird nur geprüft ob ein Update da ist.
Einen eigenen Game Server bauen
Wenn du selbst am Code arbeiten willst, klonst du das Repo und baust lokal:
git clone https://github.com/RndmJoker/gameserver-steam-palworld.git steam-palworld
cd steam-palworld
cp .env.example .env
nano .env
docker compose up -d --build
Einen komplett neuen Server anlegen
Für ein Spiel das es noch nicht gibt, habe ich ein CLI-Tool:
cd steam-basic
./tools/create-server.sh vrising 1829350 windows VRisingServer.exe 9876 udp 4g
Das generiert dir ein fertiges Verzeichnis mit Dockerfile, Docker Compose, Hooks und Config-Templates. Du musst dann nur noch die spielspezifischen Settings eintragen und die Hooks anpassen.
Netzwerk und Firewall
Alle Server laufen im Host Network Mode -- Docker nutzt direkt das Netzwerk deines Servers. Kein Port-Mapping, keine NAT-Probleme.
Wenn du eine externe Firewall hast (bei den meisten Hostern), musst du die Game-Ports dort selber freischalten. Docker macht das bei Host Mode nicht automatisch.
Daten und Backups
Alles liegt auf Docker Volumes und bleibt erhalten -- auch wenn du den Container neu baust oder updatest.
| Volume | Pfad | Inhalt |
|---|---|---|
serverdata |
/home/steam/serverdata |
Spieldateien und Savegames |
serverconfig |
/home/steam/serverconfig |
Configs |
SteamCMD arbeitet inkrementell. Ein Neustart ohne Game-Patch dauert nur ein paar Sekunden.
Links
- GitHub: github.com/RndmJoker/gameserver-steam-basic
- Docker Hub: hub.docker.com/u/rndmjoker
- Lizenz: MIT
Jeder neue Game Server der dazukommt bekommt hier einen eigenen Artikel, in dem alles nochmal im Detail erklärt wird -- Einrichtung, Settings, Troubleshooting.
Wenn du Fragen hast, einen bestimmten Server brauchst oder einfach Feedback dalassen willst, schreib mir gerne über das Kontaktformular.