Hospedagem no Docker
Este guia detalha uma configuração de servidor avançada usando Docker. É estritamente destinado a usuários com experiência em ambientes Linux, interfaces de linha de comando e no ecossistema do Docker (incluindo um bom entendimento de imagens, contêineres, volumes, redes e docker-compose).
- À vontade para navegar e trabalhar em um terminal Linux.
- Familiarizado com os conceitos do Docker, incluindo como as imagens são construídas e executadas, como os contêineres são gerenciados e como o docker-compose orquestra aplicações com vários contêineres.
Seguir com esta configuração implica que você possui o conhecimento técnico necessário. Devido à complexidade e ao caráter muito particular desse tipo de instalação, o suporte direto para esta configuração com Docker será inevitavelmente muito limitado, e você assume toda a responsabilidade caso algo dê errado.
Para quem busca uma solução escalável e gerenciável para criar e administrar servidores de Spellbreak, o Docker oferece uma abordagem robusta. Este método usa docker-compose para definir e executar sua aplicação de servidor de Spellbreak com vários contêineres.
Pré-requisitos
- Instalação do Docker: você precisa ter o Docker Engine e o Docker Compose instalados no seu servidor Linux. Se ainda não instalou, consulte a documentação oficial do Docker para instruções específicas da sua distribuição Linux.
- Preparação do diretório: crie no seu servidor um diretório dedicado onde você vai guardar o arquivo
docker-compose.ymle qualquer configuração ou mapeamento de persistência de dados relacionado.
Usando a configuração:
A configuração fornecida abaixo deve ser salva em um arquivo chamado docker-compose.yml dentro do diretório que você acabou de criar. Antes de tentar iniciar os serviços, é absolutamente crucial editar o arquivo docker-compose.yml e substituir todas as senhas de exemplo (por exemplo, YOUR_MYSQL_PASSWORD, YOUR_DB_ROOT_PASSWORD) por senhas próprias, fortes e únicas. Se não fizer isso, sua instalação ficará não funcional e insegura.
Adicionar e configurar servidores de jogo
Para rodar vários servidores de jogo ou personalizar os existentes, você vai precisar editar duas partes principais do seu arquivo docker-compose.yml: a configuração do elixir_service e as definições individuais dos serviços de servidor de jogo.
Configurar o elixir_service (matchmaker)
O elixir_service precisa conhecer todos os servidores de jogo que você pretende rodar. Atualize a seção environment dele assim:
- GAME_SERVER_NAMES: lista separada por vírgulas com nomes legíveis para seus servidores (por exemplo,
Solos-Alpha,Duos-Beta). - GAME_SERVER_HOSTS: lista separada por vírgulas com os hostnames dos seus servidores de jogo. Eles precisam ser exatamente iguais ao hostname (e normalmente ao nome do serviço) definido para cada serviço de servidor de jogo no
docker-compose.yml(por exemplo,solo1,solo2,duo1). - GAME_SERVER_PORTS: lista separada por vírgulas com as portas de jogo em que cada servidor correspondente escuta (por exemplo,
7777,7778,7779). Elas precisam bater com a variável de ambienteGAMEPORTdo respectivo servidor de jogo. - GAME_MANAGER_PORTS: lista separada por vírgulas com as portas do gerenciador de jogo de cada servidor correspondente. Elas precisam bater com a variável de ambiente
ELIXIRPORTdo respectivo servidor de jogo (por exemplo,3387,3388,3389). Importante: a ordem das entradas emGAME_SERVER_NAMES,GAME_SERVER_HOSTS,GAME_SERVER_PORTSeGAME_MANAGER_PORTSprecisa corresponder. Por exemplo, o primeiro nome, o primeiro host, a primeira porta e a primeira porta de gerenciamento se referem todos à mesma instância de servidor de jogo.
Veja um exemplo do que você vai precisar mudar:
# 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"
Definindo cada serviço de servidor de jogo
Para cada novo servidor de jogo, você precisa adicionar uma nova definição de serviço ao seu arquivo docker-compose.yml. Você pode copiar e adaptar o servidor de exemplo solo1 (se ele existir no seu arquivo base) ou usar o modelo abaixo.
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
Alguns pontos de atenção na configuração:
- Convenção de nomes: é prática padrão que o
nome do serviço Docker(por exemplo,your_service_name), ohostnamedentro desse serviço e a variável de ambienteSERVERNAMEsejam iguais (por exemplo, todos podem sersolo2). - Registro no Elixir: o
hostnamee oGAMEPORTde cada servidor de jogo precisam estar corretamente listados nas variáveis de ambiente doelixir_service(GAME_SERVER_HOSTSeGAME_SERVER_PORTS, respectivamente) para que o matchmaker reconheça e use o servidor. Da mesma forma, oELIXIRPORTprecisa corresponder a uma entrada emGAME_MANAGER_PORTS. - Exposição de portas: cada servidor de jogo precisa que seu
GAMEPORTesteja acessível externamente para que os jogadores consigam se conectar. Se você adicionar um novo servidor de jogo, precisa incluir uma seção ports na definição dele (como mostrado no modelo). Isso mapeia oGAMEPORTdo host para o contêiner (por exemplo,"7778:7778/udp"). Garanta também que essa porta esteja aberta no firewall do seu servidor. O valor deGAMEPORTnas variáveis de ambiente deve ser igual ao número de porta usado no mapeamento de ports.
Exemplo de arquivo 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
Instalação simplificada sem Elixir nem MariaDB, com funcionalidade limitada
Para instalações menores em que recursos como matchmaking ou registro de endereços IP (normalmente cuidados pelo elixir_service) não são necessários, você pode optar por uma configuração mais enxuta. Ela consiste em rodar apenas o servidor ou os servidores de jogo.
- Remover o elixir_service: apague toda a definição do elixir_service do seu arquivo docker-compose.yml.
- Remover o serviço mariadb: como o serviço mariadb é usado principalmente pelo elixir_service nessa pilha, ele também pode ser removido se o elixir_service for retirado.
- Exposição direta de portas: garanta que cada serviço de servidor de jogo (por exemplo, solo1, ou qualquer servidor personalizado definido a partir do modelo acima) exponha diretamente seu GAMEPORT na seção ports. Por exemplo:
# In your game server service definition (e.g., solo1):
# environment:
# - GAMEPORT=7777
# # ... other env vars
ports:
- "7777:7777/udp" # Exposes the game port directly
Consequências e limitações da hospedagem direta:
- Sem funcionalidade de banco de dados: recursos que dependem do banco de dados (via elixir_service), como dados persistentes de jogador, estatísticas ou registros avançados tratados pelo elixir_service, não estarão disponíveis.
- Hospedagem simplificada: essa configuração se reduz à hospedagem básica de instâncias de jogo.
- Mudanças de configuração: variáveis de ambiente dos serviços de servidor de jogo relacionadas ao elixir_service (como ELIXIRPORT ou registros específicos de SERVERNAME para o Elixir) podem deixar de ser relevantes ou usadas. Essa abordagem simplificada só é recomendada se você entende as concessões envolvidas e precisa apenas hospedar servidores de jogo, sem os recursos mais amplos oferecidos pelo matchmaking do Elixir e pelo banco de dados.