跳到主要内容

使用 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:以逗号分隔的游戏服务器主机名列表。它们必须与 docker-compose.yml 中为每个游戏服务器服务定义的 hostname(通常也是服务名)完全一致(例如 solo1,solo2,duo1)。
  • GAME_SERVER_PORTS:以逗号分隔的各游戏服务器监听端口列表(例如 7777,7778,7779)。它们必须与对应游戏服务器的 GAMEPORT 环境变量一致。
  • GAME_MANAGER_PORTS:以逗号分隔的各游戏服务器的游戏管理端口列表。它们必须与对应游戏服务器的 ELIXIRPORT 环境变量一致(例如 3387,3388,3389)。 重要GAME_SERVER_NAMESGAME_SERVER_HOSTSGAME_SERVER_PORTSGAME_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 注册:每台游戏服务器的 hostnameGAMEPORT 都必须正确列入 elixir_service 的环境变量(分别是 GAME_SERVER_HOSTSGAME_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:从 docker-compose.yml 文件中删除整个 elixir_service 定义。
  2. 移除 mariadb 服务:在这套组合中,mariadb 主要供 elixir_service 使用,所以省去 elixir_service 后也可以一并删除。
  3. 直接暴露端口:确保每个游戏服务器服务(例如 solo1,或你用上面模板定义的自建服务器)都在自己的 ports 部分直接暴露 GAMEPORT。例如:
# 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,或为 Elixir 注册的特定 SERVERNAME)可能不再有意义或不再被使用。 只有当你理解其中的取舍,并且只需要直接托管游戏服务器、不需要 Elixir 匹配和数据库带来的更多功能时,才推荐这种简化方案。