Zum Hauptinhalt springen

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.
gefahr

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

  1. 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.
  2. Verzeichnis vorbereiten: Lege auf deinem Server ein eigenes Verzeichnis an, in dem du die Datei docker-compose.yml sowie 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.yml definiert ist (zum Beispiel solo1,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 Umgebungsvariablen GAMEPORT des 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 ELIXIRPORT des jeweiligen Spielservers übereinstimmen (zum Beispiel 3387,3388,3389). Wichtig: Die Reihenfolge der Einträge in GAME_SERVER_NAMES, GAME_SERVER_HOSTS, GAME_SERVER_PORTS und GAME_MANAGER_PORTS muss ü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 Beispiel your_service_name), der hostname innerhalb dieses Service und die Umgebungsvariable SERVERNAME überein (also zum Beispiel alle solo2).
  • Registrierung bei Elixir: hostname und GAMEPORT jedes Spielservers müssen korrekt in den Umgebungsvariablen von elixir_service eingetragen sein (GAME_SERVER_HOSTS beziehungsweise GAME_SERVER_PORTS), damit der Matchmaker den Server erkennt und nutzt. Ebenso muss ELIXIRPORT einem Eintrag in GAME_MANAGER_PORTS entsprechen.
  • Portfreigabe: Bei jedem Spielserver muss der GAMEPORT von 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 der GAMEPORT vom 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 von GAMEPORT in 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.

  1. elixir_service entfernen: Lösche die gesamte Definition von elixir_service aus deiner docker-compose.yml.
  2. 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.
  3. 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.