Alojamiento en Docker
Esta guía detalla una configuración de servidor avanzada usando Docker. Está pensada estrictamente para usuarios con experiencia en entornos Linux, interfaces de línea de comandos y el ecosistema de Docker (incluida una buena comprensión de imágenes, contenedores, volúmenes, redes y docker-compose).
- Con soltura para moverse y trabajar en una terminal de Linux.
- Familiarizado con los conceptos de Docker: cómo se construyen y ejecutan las imágenes, cómo se gestionan los contenedores y cómo docker-compose orquesta aplicaciones multicontenedor.
Continuar con esta instalación implica que posees los conocimientos técnicos necesarios. Dada la complejidad y el carácter tan particular de este tipo de configuración, el soporte directo para esta instalación con Docker será necesariamente muy limitado, y asumes toda la responsabilidad si algo sale mal.
Para quien busque una solución escalable y manejable para crear y administrar servidores de Spellbreak, Docker ofrece un enfoque sólido. Este método utiliza docker-compose para definir y ejecutar tu aplicación multicontenedor de servidor de Spellbreak.
Requisitos previos
- Instalación de Docker: necesitas tener Docker Engine y Docker Compose instalados en tu servidor Linux. Si aún no los has instalado, consulta la documentación oficial de Docker para las instrucciones específicas de tu distribución de Linux.
- Preparación del directorio: crea en tu servidor un directorio dedicado donde guardarás el archivo
docker-compose.ymly cualquier configuración o mapeo de persistencia de datos relacionado.
Uso de la configuración:
La configuración que aparece más abajo debe guardarse en un archivo llamado docker-compose.yml dentro del directorio que acabas de crear. Antes de intentar lanzar los servicios, es absolutamente crucial que edites el archivo docker-compose.yml y sustituyas todas las contraseñas de ejemplo (por ejemplo, YOUR_MYSQL_PASSWORD, YOUR_DB_ROOT_PASSWORD) por contraseñas propias, fuertes y únicas. Si no lo haces, la instalación no funcionará y no será segura.
Añadir y configurar servidores de juego
Para ejecutar varios servidores de juego o personalizar los existentes, tendrás que editar dos partes principales de tu archivo docker-compose.yml: la configuración de elixir_service y las definiciones individuales de los servicios de servidor de juego.
Configurar elixir_service (el emparejador)
elixir_service debe conocer todos los servidores de juego que pretendes ejecutar. Actualiza su sección environment de la siguiente manera:
- GAME_SERVER_NAMES: lista separada por comas de nombres legibles para tus servidores (por ejemplo,
Solos-Alpha,Duos-Beta). - GAME_SERVER_HOSTS: lista separada por comas de los nombres de host de tus servidores de juego. Deben coincidir exactamente con el hostname (y normalmente con el nombre de servicio) definido para cada servicio de servidor de juego en el
docker-compose.yml(por ejemplo,solo1,solo2,duo1). - GAME_SERVER_PORTS: lista separada por comas de los puertos de juego en los que escucha cada servidor correspondiente (por ejemplo,
7777,7778,7779). Deben coincidir con la variable de entornoGAMEPORTdel servidor de juego correspondiente. - GAME_MANAGER_PORTS: lista separada por comas de los puertos del gestor de juego de cada servidor correspondiente. Deben coincidir con la variable de entorno
ELIXIRPORTdel servidor de juego correspondiente (por ejemplo,3387,3388,3389). Importante: el orden de las entradas enGAME_SERVER_NAMES,GAME_SERVER_HOSTS,GAME_SERVER_PORTSyGAME_MANAGER_PORTSdebe corresponderse. Por ejemplo, el primer nombre, el primer host, el primer puerto y el primer puerto de gestión se refieren todos a la misma instancia de servidor de juego.
Este es un ejemplo de lo que tendrás que cambiar:
# 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"
Definir cada servicio de servidor de juego
Por cada nuevo servidor de juego debes añadir una nueva definición de servicio a tu archivo docker-compose.yml. Puedes copiar y adaptar el servidor de ejemplo solo1 (si está en tu archivo base) o usar la plantilla siguiente.
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
Algunos aspectos a vigilar en la configuración:
- Convención de nombres: es práctica habitual que el
nombre del servicio Docker(por ejemplo,your_service_name), elhostnamedentro de ese servicio y la variable de entornoSERVERNAMEcoincidan (por ejemplo, que todos seansolo2). - Registro en Elixir: el
hostnamey elGAMEPORTde cada servidor de juego deben figurar correctamente en las variables de entorno deelixir_service(GAME_SERVER_HOSTSyGAME_SERVER_PORTSrespectivamente) para que el emparejador reconozca y use el servidor. Del mismo modo,ELIXIRPORTdebe corresponder a una entrada deGAME_MANAGER_PORTS. - Exposición de puertos: cada servidor de juego necesita que su
GAMEPORTsea accesible desde fuera para que los jugadores puedan conectarse. Si añades un nuevo servidor de juego, debes añadir una sección ports a esa definición (como se ve en la plantilla). Esto mapea suGAMEPORTdel host al contenedor (por ejemplo,"7778:7778/udp"). Comprueba también que ese puerto esté abierto en el cortafuegos de tu servidor. El valor deGAMEPORTen las variables de entorno debe coincidir con el número de puerto usado en el mapeo de ports.
Ejemplo de archivo 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
Instalación simplificada sin Elixir ni MariaDB, con funcionalidad limitada
Para instalaciones más pequeñas donde no se necesitan funciones como el emparejamiento o el registro de direcciones IP (que suele gestionar elixir_service), puedes plantearte una configuración más ligera. Consiste en ejecutar únicamente el servidor o los servidores de juego.
- Eliminar elixir_service: borra toda la definición de elixir_service de tu archivo docker-compose.yml.
- Eliminar el servicio mariadb: como el servicio mariadb lo usa sobre todo elixir_service en esta pila, también puede eliminarse si prescindes de elixir_service.
- Exposición directa de puertos: asegúrate de que cada servicio de servidor de juego (por ejemplo, solo1, o cualquier servidor personalizado que hayas definido con la plantilla anterior) expone directamente su GAMEPORT en su sección ports. Por ejemplo:
# In your game server service definition (e.g., solo1):
# environment:
# - GAMEPORT=7777
# # ... other env vars
ports:
- "7777:7777/udp" # Exposes the game port directly
Consecuencias y limitaciones del alojamiento directo:
- Sin funcionalidad de base de datos: las funciones que dependen de la base de datos (a través de elixir_service), como los datos persistentes de jugador, las estadísticas o el registro avanzado que gestiona elixir_service, no estarán disponibles.
- Alojamiento simplificado: esta configuración se reduce al alojamiento básico de instancias de juego.
- Cambios de configuración: las variables de entorno de los servicios de servidor de juego relacionadas con elixir_service (como ELIXIRPORT o determinados registros de SERVERNAME para Elixir) pueden dejar de ser relevantes o de usarse. Este enfoque simplificado solo se recomienda si entiendes las concesiones que implica y únicamente necesitas alojar servidores de juego, sin las funciones más amplias que aportan el emparejamiento de Elixir y la base de datos.