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 の主に 2 か所、つまり 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_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 を削除する: docker-compose.yml から elixir_service の定義をすべて削除します。
- mariadb サービスを削除する: このスタックでは mariadb は主に elixir_service が使うため、elixir_service を外すなら一緒に削除できます。
- ポートを直接公開する: 各ゲームサーバーサービス(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 のマッチメイキングやデータベースが提供する機能を必要とせず、ゲームサーバーのホスティングだけを求める場合にのみおすすめします。