Aller au contenu principal

Héberger avec Docker

Ce guide détaille une configuration de serveur avancée utilisant Docker. Il s'adresse strictement aux utilisateurs expérimentés avec les environnements Linux, les interfaces en ligne de commande et l'écosystème Docker (avec une bonne compréhension des images, conteneurs, volumes, réseaux et de docker-compose).

  • À l'aise pour naviguer et travailler dans un terminal Linux.
  • Familier des concepts Docker : construction et exécution des images, gestion des conteneurs, orchestration d'applications multiconteneurs avec docker-compose.
danger

Poursuivre cette installation suppose que vous possédez les connaissances techniques requises. Compte tenu de la complexité et du caractère très personnel d'une telle configuration, le support direct pour cette installation Docker sera nécessairement très limité, et vous assumez l'entière responsabilité en cas de problème.


Pour qui cherche une solution évolutive et facile à gérer pour créer et administrer des serveurs Spellbreak, Docker offre une approche solide. Cette méthode utilise docker-compose pour définir et lancer votre application serveur Spellbreak multiconteneur.

Prérequis

  1. Installation de Docker : vous devez disposer de Docker Engine et de Docker Compose sur votre serveur Linux. Si ce n'est pas encore fait, reportez-vous à la documentation officielle de Docker pour les instructions propres à votre distribution Linux.
  2. Préparation du répertoire : créez sur votre serveur un répertoire dédié où vous stockerez le fichier docker-compose.yml ainsi que toute configuration ou tout mappage de persistance associé.

Utiliser la configuration :

La configuration fournie ci-dessous doit être enregistrée dans un fichier nommé docker-compose.yml à l'intérieur du répertoire que vous venez de créer. Avant de tenter de lancer les services, il est absolument crucial de modifier le fichier docker-compose.yml et de remplacer tous les mots de passe d'exemple (par exemple YOUR_MYSQL_PASSWORD, YOUR_DB_ROOT_PASSWORD) par vos propres mots de passe forts et uniques. Sans cela, votre installation sera non fonctionnelle et non sécurisée.

Ajouter et configurer des serveurs de jeu

Pour faire tourner plusieurs serveurs de jeu ou personnaliser ceux qui existent, vous devrez modifier deux parties principales de votre fichier docker-compose.yml : la configuration d'elixir_service et les définitions individuelles des services de serveur de jeu.

Configurer elixir_service (le matchmaker)

elixir_service doit connaître tous les serveurs de jeu que vous comptez faire tourner. Mettez à jour sa section environment comme suit :

  • GAME_SERVER_NAMES : liste, séparée par des virgules, de noms lisibles pour vos serveurs (par exemple Solos-Alpha,Duos-Beta).
  • GAME_SERVER_HOSTS : liste, séparée par des virgules, des noms d'hôte de vos serveurs de jeu. Ils doivent correspondre exactement au hostname (et généralement au nom de service) défini pour chaque service de serveur de jeu dans le docker-compose.yml (par exemple solo1,solo2,duo1).
  • GAME_SERVER_PORTS : liste, séparée par des virgules, des ports de jeu sur lesquels chaque serveur correspondant écoute (par exemple 7777,7778,7779). Ils doivent correspondre à la variable d'environnement GAMEPORT du serveur de jeu concerné.
  • GAME_MANAGER_PORTS : liste, séparée par des virgules, des ports du gestionnaire de jeu pour chaque serveur correspondant. Ils doivent correspondre à la variable d'environnement ELIXIRPORT du serveur de jeu concerné (par exemple 3387,3388,3389). Important : l'ordre des entrées de GAME_SERVER_NAMES, GAME_SERVER_HOSTS, GAME_SERVER_PORTS et GAME_MANAGER_PORTS doit correspondre. Par exemple, le premier nom, le premier hôte, le premier port et le premier port de gestion renvoient tous à la même instance de serveur de jeu.

Voici un exemple de ce que vous devrez modifier :

# 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"

Définir chaque service de serveur de jeu

Pour chaque nouveau serveur de jeu, vous devez ajouter une nouvelle définition de service à votre fichier docker-compose.yml. Vous pouvez copier et adapter l'exemple du serveur solo1 (s'il figure dans votre fichier de base) ou utiliser le modèle ci-dessous.

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

Quelques points de vigilance dans la configuration :

  • Convention de nommage : il est d'usage que le nom du service Docker (par exemple your_service_name), le hostname de ce service et la variable d'environnement SERVERNAME soient identiques (par exemple tous égaux à solo2).
  • Enregistrement auprès d'Elixir : le hostname et le GAMEPORT de chaque serveur de jeu doivent figurer correctement dans les variables d'environnement d'elixir_service (GAME_SERVER_HOSTS et GAME_SERVER_PORTS respectivement) pour que le matchmaker reconnaisse et utilise le serveur. De même, ELIXIRPORT doit correspondre à une entrée de GAME_MANAGER_PORTS.
  • Exposition des ports : chaque serveur de jeu a besoin que son GAMEPORT soit accessible depuis l'extérieur pour que les joueurs puissent se connecter. Si vous ajoutez un nouveau serveur de jeu, vous devez ajouter une section ports à sa définition (comme dans le modèle). Cela mappe son GAMEPORT de l'hôte vers le conteneur (par exemple "7778:7778/udp"). Vérifiez également que ce port est ouvert dans le pare-feu de votre serveur. La valeur GAMEPORT des variables d'environnement doit correspondre au numéro de port utilisé dans le mappage ports.

Exemple de fichier 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

Installation simplifiée sans Elixir ni MariaDB, pour des fonctionnalités limitées

Pour de petites installations où le matchmaking ou la journalisation des adresses IP (généralement gérés par elixir_service) ne sont pas nécessaires, vous pouvez envisager une configuration plus légère, qui ne fait tourner que le ou les serveurs de jeu.

  1. Supprimer elixir_service : effacez toute la définition d'elixir_service de votre fichier docker-compose.yml.
  2. Supprimer le service mariadb : comme le service mariadb sert principalement à elixir_service dans cette pile, il peut également être supprimé si elixir_service est retiré.
  3. Exposition directe des ports : assurez-vous que chaque service de serveur de jeu (par exemple solo1, ou tout serveur personnalisé défini à partir du modèle ci-dessus) expose directement son GAMEPORT dans sa section ports. Par exemple :
# In your game server service definition (e.g., solo1):
# environment:
# - GAMEPORT=7777
# # ... other env vars
ports:
- "7777:7777/udp" # Exposes the game port directly

Conséquences et limites de l'hébergement direct :

  • Aucune fonctionnalité de base de données : les fonctions qui dépendent de la base de données (via elixir_service), comme les données de joueur persistantes, les statistiques ou la journalisation avancée gérée par elixir_service, ne seront pas disponibles.
  • Hébergement simplifié : cette configuration se limite à l'hébergement d'instances de jeu de base.
  • Changements de configuration : les variables d'environnement des services de serveur de jeu liées à elixir_service (comme ELIXIRPORT ou certains enregistrements SERVERNAME destinés à Elixir) peuvent devenir inutiles. Cette approche simplifiée n'est recommandée que si vous comprenez les compromis et que vous avez uniquement besoin d'héberger des serveurs de jeu, sans les fonctionnalités plus larges apportées par le matchmaking Elixir et la base de données.