Перейти к основному содержимому

Размещение в Docker

В этом руководстве описана продвинутая настройка сервера с использованием Docker. Оно предназначено строго для тех, у кого есть опыт работы с Linux, командной строкой и экосистемой Docker (включая уверенное понимание образов, контейнеров, томов, сетей и docker-compose).

  • Вы свободно ориентируетесь и работаете в терминале Linux.
  • Вы знакомы с концепциями Docker: как собираются и запускаются образы, как управляют контейнерами и как docker-compose оркестрирует многоконтейнерные приложения.
осторожно

Продолжая эту настройку, вы подтверждаете, что обладаете необходимыми техническими знаниями. Из-за сложности и сугубо индивидуального характера такой конфигурации прямая поддержка этой связки с Docker будет крайне ограниченной, и всю ответственность за возможные проблемы вы берёте на себя.


Тем, кому нужно масштабируемое и удобное в управлении решение для создания и обслуживания серверов Spellbreak, Docker предлагает надёжный подход. В этом способе docker-compose используется для описания и запуска многоконтейнерного серверного приложения Spellbreak.

Необходимые условия

  1. Установка Docker: на вашем сервере Linux должны быть установлены Docker Engine и Docker Compose. Если их ещё нет, обратитесь к официальной документации Docker за инструкциями для вашего дистрибутива Linux.
  2. Подготовка каталога: создайте на сервере отдельный каталог, где будет храниться файл 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) не нужны, можно выбрать более лёгкий вариант, в котором запускаются только игровые серверы.

  1. Удалите elixir_service: полностью уберите определение elixir_service из файла docker-compose.yml.
  2. Удалите сервис mariadb: поскольку в этой сборке mariadb используется в основном сервисом elixir_service, без него его тоже можно убрать.
  3. Прямое открытие портов: убедитесь, что каждый сервис игрового сервера (например, 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 и база данных.