Hosting mit Docker
Diese Anleitung beschreibt eine fortgeschrittene Servereinrichtung mit Docker. Sie richtet sich ausschließlich an Personen mit Erfahrung in Linux-Umgebungen, auf der Kommandozeile und im Docker-Ökosystem (einschließlich eines soliden Verständnisses von Images, Containern, Volumes, Netzwerken und docker-compose).
- Sicher im Umgang mit einem Linux-Terminal.
- Vertraut mit Docker-Konzepten, also damit, wie Images gebaut und ausgeführt werden, wie Container verwaltet werden und wie docker-compose Anwendungen mit mehreren Containern orchestriert.
Wer mit dieser Einrichtung fortfährt, bringt die nötigen technischen Kenntnisse mit. Aufgrund der Komplexität und der stark individuellen Natur eines solchen Setups ist direkter Support für diese Docker-Konfiguration zwangsläufig sehr begrenzt, und du trägst die volle Verantwortung, falls etwas schiefgeht.
Für alle, die eine skalierbare und gut verwaltbare Lösung zum Erstellen und Betreiben von Spellbreak-Servern suchen, bietet Docker einen robusten Ansatz. Diese Methode nutzt docker-compose , um deine Spellbreak-Serveranwendung mit mehreren Containern zu definieren und auszuführen.
Voraussetzungen
- Docker-Installation: Auf deinem Linux-Server müssen Docker Engine und Docker Compose installiert sein. Falls noch nicht geschehen, findest du in der offiziellen Docker-Dokumentation Anleitungen für deine Linux-Distribution.
- Verzeichnis vorbereiten: Lege auf deinem Server ein eigenes Verzeichnis an, in dem du die Datei
docker-compose.ymlsowie zugehörige Konfigurationen oder Zuordnungen zur Datenpersistenz ablegst.
Konfiguration verwenden:
Die unten stehende Konfiguration solltest du in einer Datei namens docker-compose.yml innerhalb des soeben erstellten Verzeichnisses speichern. Bevor du versuchst, die Dienste zu starten, ist es absolut entscheidend, die Datei docker-compose.yml zu bearbeiten und alle Platzhalter-Passwörter (etwa YOUR_MYSQL_PASSWORD, YOUR_DB_ROOT_PASSWORD) durch eigene, starke und einzigartige Passwörter zu ersetzen. Andernfalls ist das Setup nicht funktionsfähig und unsicher.
Spielserver hinzufügen und konfigurieren
Um mehrere Spielserver zu betreiben oder vorhandene anzupassen, musst du zwei Hauptteile deiner docker-compose.yml bearbeiten: die Konfiguration von elixir_service und die einzelnen Servicedefinitionen der Spielserver.
elixir_service konfigurieren (Matchmaker)
elixir_service muss alle Spielserver kennen, die du betreiben willst. Aktualisiere den Abschnitt environment wie folgt:
- GAME_SERVER_NAMES: eine kommagetrennte Liste sprechender Namen für deine Server (zum Beispiel
Solos-Alpha,Duos-Beta). - GAME_SERVER_HOSTS: eine kommagetrennte Liste der Hostnamen deiner Spielserver. Sie müssen exakt dem hostname (und üblicherweise dem Servicenamen) entsprechen, der für jeden Spielserver-Service in der
docker-compose.ymldefiniert ist (zum Beispielsolo1,solo2,duo1). - GAME_SERVER_PORTS: eine kommagetrennte Liste der Spielports, auf denen der jeweilige Spielserver lauscht (zum Beispiel
7777,7778,7779). Sie müssen mit der UmgebungsvariablenGAMEPORTdes jeweiligen Spielservers übereinstimmen. - GAME_MANAGER_PORTS: eine kommagetrennte Liste der Game-Manager-Ports für jeden zugehörigen Spielserver. Sie müssen mit der Umgebungsvariablen
ELIXIRPORTdes jeweiligen Spielservers übereinstimmen (zum Beispiel3387,3388,3389). Wichtig: Die Reihenfolge der Einträge inGAME_SERVER_NAMES,GAME_SERVER_HOSTS,GAME_SERVER_PORTSundGAME_MANAGER_PORTSmuss übereinstimmen. Der erste Name, der erste Host, der erste Port und der erste Manager-Port beziehen sich also alle auf dieselbe Spielserver-Instanz.
Hier ein Beispiel dafür, was du ändern musst:
# Inside elixir_service:
# environment:
# # ... other environment variables ...
# GAME_SERVER_NAMES: Solos-US-East,Solos-US-West
# GAME_SERVER_HOSTS: solo_use,solo_usw
# GAME_SERVER_PORTS: 7777,7778
# GAME_MANAGER_PORTS: 3387,3388
# # ... other environment variables ...
# ports: # UDP is required!
# - "7777:7777/udp"
# - "7778:7778/udp"
Jeden Spielserver-Service definieren
Für jeden neuen Spielserver musst du deiner Datei docker-compose.yml eine neue Servicedefinition hinzufügen. Du kannst den Beispielserver solo1 kopieren und anpassen (falls er in deiner Basisdatei vorhanden ist) oder die untenstehende Vorlage verwenden.
your_service_name: # e.g., solo2, duo1. Conventionally matches hostname and SERVERNAME.
container_name: YOUR_CONTAINER_NAME # e.g., spellbreak_solo2
hostname: YOUR_SERVER_HOSTNAME # e.g., solo2. Must be registered in elixir_service's GAME_SERVER_HOSTS!
environment:
- GAMEMODE=GAME_MODE # Suitable options are Solo, Duo, Squad, and Capture
- GAMEPORT=7777 # e.g., 7778. Must be unique on the host if exposed & registered in elixir_service's GAME_SERVER_PORTS.
- SERVERNAME=YOUR_SERVER_NAME # e.g., solo2. Conventionally matches hostname.
- ELIXIRPORT=3387 # e.g., 3388. Game Manager Port, must be registered in elixir_service's GAME_MANAGER_PORTS.
- PATCH_ENV=prod # Or vanilla
- IDLETIMER=60
# =-=-=!!! No touchy anything below this line! >:o !!!=-=-= #
image: brendoncintas/spellbreak_game_server:stable
restart: always
volumes:
- game_logs:/spellbreak-server/BaseServer/g3/Saved/Logs/ # Shared volume for logs
networks:
- spellbreak
Worauf du in der Konfiguration achten solltest:
- Namenskonvention: Üblicherweise stimmen der
Docker-Servicename(zum Beispielyour_service_name), derhostnameinnerhalb dieses Service und die UmgebungsvariableSERVERNAMEüberein (also zum Beispiel allesolo2). - Registrierung bei Elixir:
hostnameundGAMEPORTjedes Spielservers müssen korrekt in den Umgebungsvariablen vonelixir_serviceeingetragen sein (GAME_SERVER_HOSTSbeziehungsweiseGAME_SERVER_PORTS), damit der Matchmaker den Server erkennt und nutzt. Ebenso mussELIXIRPORTeinem Eintrag inGAME_MANAGER_PORTSentsprechen. - Portfreigabe: Bei jedem Spielserver muss der
GAMEPORTvon außen erreichbar sein, damit Spielende sich verbinden können. Wenn du einen neuen Spielserver hinzufügst, musst du dessen Definition einen ports-Abschnitt hinzufügen (wie in der Vorlage gezeigt). Damit wird derGAMEPORTvom Host auf den Container abgebildet (zum Beispiel"7778:7778/udp"). Achte außerdem darauf, dass dieser Port in der Firewall deines Servers geöffnet ist. Der Wert vonGAMEPORTin den Umgebungsvariablen muss der Portnummer in der ports-Zuordnung entsprechen.
Beispiel für eine docker-compose.yml
# Made with <3 by Doobs. 3/6/2025
services:
# ==================== SPELLBREAK MATCHMAKING SERVER ====================
elixir_service:
image: brendoncintas/spellbreak_matchmaking:stable
container_name: spellbreak_matchmaking
environment:
# Database connection settings (match mariadb service)
DB_HOST: spellbreak_db # This must match the hostname in the mariadb service.
DB_USER: blackmarla # This must match the MYSQL_USER in the mariadb service.
DB_PASSWORD: YOUR_MYSQL_PASSWORD # This must match the MYSQL_PASSWORD in the mariadb service.
DB_NAME: spellbreak_server
DB_PORT: "3306"
# Game server port allocation for outbound connections
OUTBOUND_PORT_START: "8000"
OUTBOUND_PORT_END: "9000"
RECYCLE_PORT_MINUTES: "240"
# Debug settings
RECORDING_ENABLED: "false"
LOG_LEVEL: "debug"
GAME_SERVER_NAMES: Solos
GAME_SERVER_HOSTS: solo1
GAME_SERVER_PORTS: 7777
GAME_MANAGER_PORTS: 3387 # Used for issuing custom commands to the game (e.g. server restarts)
volumes:
- game_logs:/app/log # Shared log directory across all game servers
restart: always
networks:
- spellbreak
# Expose game ports for external players to connect. Left side is the host (same ports in GAME_SERVER_PORTS), right side is the forward port for your game server.
# UDP is a requirement!
ports:
- "7777:7777/udp"
# ==================== DATABASE ====================
mariadb:
image: brendoncintas/spellbreak_db:stable
container_name: spellbreak_db
hostname: spellbreak_db # This must match the entry within DB_HOST for the elixir_service.
restart: always
environment:
MYSQL_ROOT_PASSWORD: YOUR_DB_ROOT_PASSWORD # Superadmin password (should not be shared).
MYSQL_DATABASE: spellbreak_server
MYSQL_USER: blackmarla
MYSQL_PASSWORD: YOUR_MYSQL_PASSWORD # Matches DB_PASSWORD in elixir_service.
volumes:
- db_data:/var/lib/mysql
networks:
- spellbreak
# ==================== GAME SERVER ====================
solo1:
container_name: solo1
hostname: solo1
environment:
- GAMEMODE=Solo
- GAMEPORT=7777
- SERVERNAME=solo1
- ELIXIRPORT=3387
- PATCH_ENV=prod
- IDLETIMER=60
# =-=-=!!! No touchy anything below this line! >:o !!!=-=-= #
image: brendoncintas/spellbreak_game_server:stable
restart: always
volumes:
- game_logs:/spellbreak-server/BaseServer/g3/Saved/Logs/
networks:
- spellbreak
# ==================== SHARED VOLUMES & NETWORKS ====================
volumes:
db_data: # Stores MySQL database files
game_logs: # Shared log directory between game servers and matchmaking
networks:
spellbreak:
driver: bridge
Vereinfachtes Setup ohne Elixir und MariaDB, mit eingeschränktem Funktionsumfang
Für kleinere Serversetups, in denen Funktionen wie Matchmaking oder das Protokollieren von IP-Adressen (üblicherweise durch elixir_service) nicht gebraucht werden, kommt eine schlankere Konfiguration infrage. Dabei laufen nur die Spielserver.
- elixir_service entfernen: Lösche die gesamte Definition von elixir_service aus deiner docker-compose.yml.
- mariadb-Service entfernen: Da der mariadb-Service in diesem Stack vor allem von elixir_service genutzt wird, kann er ebenfalls entfallen, wenn elixir_service wegfällt.
- Ports direkt freigeben: Stelle sicher, dass jeder Spielserver-Service (zum Beispiel solo1 oder eigene Spielserver aus der obigen Vorlage) seinen GAMEPORT direkt im ports-Abschnitt freigibt. Zum Beispiel:
# In your game server service definition (e.g., solo1):
# environment:
# - GAMEPORT=7777
# # ... other env vars
ports:
- "7777:7777/udp" # Exposes the game port directly
Folgen und Grenzen des direkten Hostings:
- Keine Datenbankfunktionen: Funktionen, die auf der Datenbank aufbauen (über elixir_service), etwa dauerhafte Spielerdaten, Statistiken oder erweitertes Logging durch elixir_service, stehen nicht zur Verfügung.
- Vereinfachtes Hosting: Dieses Setup beschränkt sich auf das reine Bereitstellen von Spielinstanzen.
- Konfigurationsänderungen: Umgebungsvariablen der Spielserver-Services, die zu elixir_service gehörten (etwa ELIXIRPORT oder bestimmte SERVERNAME-Registrierungen für Elixir), sind unter Umständen nicht mehr relevant oder werden nicht mehr genutzt. Dieser vereinfachte Ansatz empfiehlt sich nur, wenn du die Abstriche verstehst und ausschließlich reines Spielserver-Hosting brauchst, ohne die umfangreicheren Funktionen von Elixir-Matchmaking und Datenbank.