メインコンテンツまでスキップ

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 の主に 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_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 への登録: マッチメイカーがサーバーを認識して利用できるように、ゲームサーバーの hostnameGAMEPORTelixir_service の環境変数(それぞれ GAME_SERVER_HOSTSGAME_SERVER_PORTS)に正しく列挙する必要があります。同様に、ELIXIRPORTGAME_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 のマッチメイキングやデータベースが提供する機能を必要とせず、ゲームサーバーのホスティングだけを求める場合にのみおすすめします。