Hosting con Docker
Questa guida descrive una configurazione di server avanzata con Docker. È rivolta esclusivamente a chi ha esperienza con ambienti Linux, interfacce a riga di comando e l'ecosistema Docker (inclusa una solida comprensione di immagini, container, volumi, reti e docker-compose).
- A proprio agio nel muoversi e lavorare in un terminale Linux.
- Pratico dei concetti Docker, cioè di come si costruiscono ed eseguono le immagini, di come si gestiscono i container e di come docker-compose orchestra applicazioni multi container.
Proseguire con questa configurazione implica che tu abbia le conoscenze tecniche necessarie. Data la complessità e la natura molto personale di un setup del genere, il supporto diretto per questa configurazione Docker sarà inevitabilmente molto limitato e ti assumi ogni responsabilità in caso di problemi.
Per chi cerca una soluzione scalabile e gestibile per creare e amministrare server di Spellbreak, Docker offre un approccio solido. Questo metodo usa docker-compose per definire ed eseguire la tua applicazione multi container di server Spellbreak.
Prerequisiti
- Installazione di Docker: sul tuo server Linux devono essere installati Docker Engine e Docker Compose. Se non lo hai ancora fatto, consulta la documentazione ufficiale di Docker per le istruzioni relative alla tua distribuzione Linux.
- Preparazione della cartella: crea sul server una cartella dedicata in cui conserverai il file
docker-compose.ymle le eventuali configurazioni o mappature per la persistenza dei dati.
Utilizzare la configurazione:
La configurazione fornita qui sotto va salvata in un file chiamato docker-compose.yml all'interno della cartella appena creata. Prima di provare ad avviare i servizi, è assolutamente cruciale modificare il file docker-compose.yml e sostituire tutte le password segnaposto (per esempio YOUR_MYSQL_PASSWORD, YOUR_DB_ROOT_PASSWORD) con password tue, robuste e uniche. Se non lo fai, otterrai un setup non funzionante e insicuro.
Aggiungere e configurare i server di gioco
Per eseguire più server di gioco o personalizzare quelli esistenti dovrai modificare due parti principali del tuo file docker-compose.yml: la configurazione di elixir_service e le singole definizioni dei servizi dei server di gioco.
Configurare elixir_service (matchmaker)
elixir_service deve conoscere tutti i server di gioco che intendi eseguire. Aggiorna la sua sezione environment così:
- GAME_SERVER_NAMES: elenco separato da virgole di nomi leggibili per i tuoi server (per esempio
Solos-Alpha,Duos-Beta). - GAME_SERVER_HOSTS: elenco separato da virgole degli hostname dei tuoi server di gioco. Devono coincidere esattamente con l'hostname (e di solito con il nome del servizio) definito per ogni servizio di server di gioco nel
docker-compose.yml(per esempiosolo1,solo2,duo1). - GAME_SERVER_PORTS: elenco separato da virgole delle porte di gioco su cui è in ascolto ciascun server corrispondente (per esempio
7777,7778,7779). Devono corrispondere alla variabile d'ambienteGAMEPORTdel rispettivo server di gioco. - GAME_MANAGER_PORTS: elenco separato da virgole delle porte del game manager per ciascun server corrispondente. Devono corrispondere alla variabile d'ambiente
ELIXIRPORTdel rispettivo server di gioco (per esempio3387,3388,3389). Importante: l'ordine delle voci inGAME_SERVER_NAMES,GAME_SERVER_HOSTS,GAME_SERVER_PORTSeGAME_MANAGER_PORTSdeve corrispondere. Per esempio, il primo nome, il primo host, la prima porta e la prima porta di gestione si riferiscono tutti alla stessa istanza di server di gioco.
Ecco un esempio di ciò che dovrai modificare:
# 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"
Definire ogni servizio di server di gioco
Per ogni nuovo server di gioco devi aggiungere una nuova definizione di servizio al file docker-compose.yml. Puoi copiare e adattare il server di esempio solo1 (se presente nel tuo file base) oppure usare il modello qui sotto.
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
Alcuni aspetti a cui fare attenzione nella configurazione:
- Convenzione sui nomi: è prassi che il
nome del servizio Docker(per esempioyour_service_name), l'hostnameall'interno di quel servizio e la variabile d'ambienteSERVERNAMEcoincidano (per esempio tutti uguali asolo2). - Registrazione su Elixir: l'
hostnamee ilGAMEPORTdi ogni server di gioco devono essere elencati correttamente nelle variabili d'ambiente dielixir_service(GAME_SERVER_HOSTSeGAME_SERVER_PORTSrispettivamente) affinché il matchmaker riconosca e usi il server. Allo stesso modo,ELIXIRPORTdeve corrispondere a una voce diGAME_MANAGER_PORTS. - Esposizione delle porte: ogni server di gioco ha bisogno che il suo
GAMEPORTsia raggiungibile dall'esterno perché i giocatori possano collegarsi. Se aggiungi un nuovo server di gioco devi aggiungere una sezione ports alla sua definizione (come nel modello). In questo modo ilGAMEPORTviene mappato dall'host al container (per esempio"7778:7778/udp"). Assicurati inoltre che la porta sia aperta nel firewall del tuo server. Il valore diGAMEPORTnelle variabili d'ambiente deve coincidere con il numero di porta usato nella mappatura ports.
Esempio di file 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
Configurazione semplificata senza Elixir né MariaDB, con funzionalità limitate
Per installazioni più piccole in cui funzioni come il matchmaking o la registrazione degli indirizzi IP (di solito gestiti da elixir_service) non servono, puoi valutare una configurazione più snella. In pratica si eseguono solo i server di gioco.
- Rimuovere elixir_service: cancella l'intera definizione di elixir_service dal file docker-compose.yml.
- Rimuovere il servizio mariadb: dato che in questo stack il servizio mariadb è usato soprattutto da elixir_service, può essere rimosso anch'esso se elixir_service viene omesso.
- Esposizione diretta delle porte: assicurati che ogni servizio di server di gioco (per esempio solo1, o qualsiasi server personalizzato definito con il modello sopra) esponga direttamente il proprio GAMEPORT nella sezione ports. Per esempio:
# In your game server service definition (e.g., solo1):
# environment:
# - GAMEPORT=7777
# # ... other env vars
ports:
- "7777:7777/udp" # Exposes the game port directly
Conseguenze e limiti dell'hosting diretto:
- Nessuna funzionalità di database: le funzioni che dipendono dal database (tramite elixir_service), come dati persistenti dei giocatori, statistiche o log avanzati gestiti da elixir_service, non saranno disponibili.
- Hosting semplificato: questa configurazione si riduce all'hosting di base delle istanze di gioco.
- Modifiche di configurazione: le variabili d'ambiente dei servizi di server di gioco legate a elixir_service (come ELIXIRPORT o determinate registrazioni di SERVERNAME per Elixir) possono non essere più rilevanti o utilizzate. Questo approccio semplificato è consigliato solo se comprendi i compromessi e ti serve unicamente l'hosting diretto dei server di gioco, senza le funzioni più ampie offerte dal matchmaking Elixir e dal database.