Размещение в Docker
В этом руководстве описана продвинутая настройка сервера с использованием Docker. Оно предназначено строго для тех, у кого есть опыт работы с Linux, командной строкой и экосистемой Docker (включая уверенное понимание образов, контейнеров, томов, сетей и docker-compose).
- Вы свободно ориентируетесь и работаете в терминале Linux.
- Вы знакомы с концепциями Docker: как собираются и запускаются образы, как управляют контейнерами и как docker-compose оркестрирует многоконтейнерные приложения.
Продолжая эту настройку, вы подтверждаете, что обладаете необходимыми техническими знаниями. Из-за сложности и сугубо индивидуального характера такой конфигурации прямая поддержка этой связки с Docker будет крайне ограниченной, и всю ответственность за возможные проблемы вы берёте на себя.
Тем, кому нужно масштабируемое и удобное в управлении решение для создания и обслуживания серверов Spellbreak, Docker предлагает надёжный подход. В этом способе docker-compose используется для описания и запуска многоконтейнерного серверного приложения Spellbreak.
Необходимые условия
- Установка Docker: на вашем сервере Linux должны быть установлены Docker Engine и Docker Compose. Если их ещё нет, обратитесь к официальной документации Docker за инструкциями для вашего дистрибутива Linux.
- Подготовка каталога: создайте на сервере отдельный каталог, где будет храниться файл
docker-compose.yml, а также связанные конфигурации и сопоставления для хранения данных.
Как использовать конфигурацию:
Приведённую ниже конфигурацию нужно сохранить в файл docker-compose.yml в только что созданном каталоге. Прежде чем запускать сервисы, обязательно отредактируйте docker-compose.yml и замените все пароли-заглушки (например, YOUR_MYSQL_PASSWORD, YOUR_DB_ROOT_PASSWORD) на собственные надёжные и уникальные. Иначе конфигурация окажется нерабочей и небезопасной.
Добавление и настройка игровых серверов
Чтобы запустить несколько игровых серверов или изменить существующие, нужно отредактировать две основные части файла docker-compose.yml: конфигурацию elixir_service и определения отдельных сервисов игровых серверов.
Настройка elixir_service (подбор игроков)
elixir_service должен знать обо всех игровых серверах, которые вы собираетесь запускать. Обновите его секцию environment так:
- GAME_SERVER_NAMES: список понятных имён ваших серверов через запятую (например,
Solos-Alpha,Duos-Beta). - GAME_SERVER_HOSTS: список имён хостов игровых серверов через запятую. Они должны в точности совпадать с hostname (и обычно с именем сервиса), заданным для каждого игрового сервера в
docker-compose.yml(например,solo1,solo2,duo1). - GAME_SERVER_PORTS: список игровых портов, которые слушает каждый соответствующий сервер, через запятую (например,
7777,7778,7779). Они должны совпадать с переменной окруженияGAMEPORTсоответствующего игрового сервера. - GAME_MANAGER_PORTS: список портов менеджера игры для каждого соответствующего сервера через запятую. Они должны совпадать с переменной окружения
ELIXIRPORTсоответствующего игрового сервера (например,3387,3388,3389). Важно: порядок записей вGAME_SERVER_NAMES,GAME_SERVER_HOSTS,GAME_SERVER_PORTSиGAME_MANAGER_PORTSдолжен совпадать. Например, первое имя, первый хост, первый порт и первый порт менеджера относятся к одному и тому же экземпляру игрового сервера.
Вот пример того, что придётся изменить:
# 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"
Описание каждого сервиса игрового сервера
Для каждого нового игрового сервера нужно добавить в файл docker-compose.yml новое определение сервиса. Можно скопировать и адаптировать пример сервера solo1 (если он есть в вашем базовом файле) либо взять шаблон ниже.
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
На что обратить внимание в конфигурации:
- Соглашение об именовании: принято, чтобы
имя сервиса Docker(например,your_service_name),hostnameвнутри этого сервиса и переменная окруженияSERVERNAMEсовпадали (например, вездеsolo2). - Регистрация в Elixir:
hostnameиGAMEPORTкаждого игрового сервера должны быть правильно перечислены в переменных окруженияelixir_service(GAME_SERVER_HOSTSиGAME_SERVER_PORTSсоответственно), иначе подбор игроков не увидит и не задействует сервер. Точно так жеELIXIRPORTдолжен соответствовать записи вGAME_MANAGER_PORTS. - Открытие портов:
GAMEPORTкаждого игрового сервера должен быть доступен извне, иначе игроки не подключатся. Добавляя новый игровой сервер, обязательно добавьте в его определение секцию ports (как в шаблоне). Это отображаетGAMEPORTс хоста в контейнер (например,"7778:7778/udp"). Убедитесь также, что этот порт открыт в брандмауэре сервера. ЗначениеGAMEPORTв переменных окружения должно совпадать с номером порта в сопоставлении ports.
Пример файла 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
Упрощённая установка без Elixir и MariaDB с ограниченными возможностями
Для небольших конфигураций, где подбор игроков или запись IP-адресов (обычно этим занимается elixir_service) не нужны, можно выбрать более лёгкий вариант, в котором запускаются только игровые серверы.
- Удалите elixir_service: полностью уберите определение elixir_service из файла docker-compose.yml.
- Удалите сервис mariadb: поскольку в этой сборке mariadb используется в основном сервисом elixir_service, без него его тоже можно убрать.
- Прямое открытие портов: убедитесь, что каждый сервис игрового сервера (например, solo1 или любые собственные серверы, описанные по шаблону выше) напрямую открывает свой GAMEPORT в секции ports. Например:
# In your game server service definition (e.g., solo1):
# environment:
# - GAMEPORT=7777
# # ... other env vars
ports:
- "7777:7777/udp" # Exposes the game port directly
Последствия и ограничения прямого размещения:
- Нет функций базы данных: возможности, зависящие от базы данных (через elixir_service), такие как сохранение данных игроков, статистика или расширенное логирование на стороне elixir_service, будут недоступны.
- Упрощённое размещение: такая схема сводится к базовому запуску игровых экземпляров.
- Изменения в настройках: переменные окружения игровых серверов, связанные с elixir_service (например, ELIXIRPORT или отдельные регистрации SERVERNAME для Elixir), могут перестать быть нужными или использоваться. Такой упрощённый подход рекомендуется только если вы понимаете компромиссы и вам нужен исключительно запуск игровых серверов без более широких возможностей, которые дают подбор игроков Elixir и база данных.