PterodactylというMinecraftサーバーを始めとしたゲームサーバーを便利なWeb上のUIで管理できるソフトウェアがあります。 Pterodactylは各ゲームサーバーをDockerコンテナ上で動作させるアーキテクチャになっており、ローカルの環境に依存せずに運用できるので大変便利なのですが、公式ドキュメントを見るとPterodactyl本体のセットアップが少々大変そうです。 そこで、Pterodactyl自体もDocker Composeを用いてDockerコンテナとして簡単にセットアップできるようにしていきます。

環境

  • Debian GNU/Linux 11
  • Docker 20.10.18
  • Docker Compose v2.10.2

Pterodactylのアーキテクチャについて

Pterodactylはゲームサーバーの管理用UIを提供するPanelと、ゲームサーバーのコンテナを管理するWingsから構成されています。 PanelとWingsは別ホストで動かすこともできるのですが、私の用途では同じマシンですべて稼働させたかったので、同一ホストでのセットアップを紹介していきます。

Docker Composeでデプロイ

実はPterodactyl公式もDockerでのセットアップも想定しているようで、GitHubのリポジトリを見ると docker-compose.yml がしれっと置いてあったりします。 これを拝借して、単一の docker-compose.yml でPanelとWings、その他データベース類もデプロイできるようにしたものが下になります。

version: "3.8"

x-common:
  database:
    &db-environment
    MYSQL_PASSWORD: &db-password "CHANGE_ME"
    MYSQL_ROOT_PASSWORD: "CHANGE_ME_TOO"
  panel:
    &panel-environment
    APP_URL: "http://ホストのローカルIPアドレス:8888"
    APP_TIMEZONE: "Asia/Tokyo"
    APP_SERVICE_AUTHOR: "noreply@example.com"
  mail:
    &mail-environment
    MAIL_FROM: "noreply@example.com"
    MAIL_DRIVER: "smtp"
    MAIL_HOST: "mail"
    MAIL_PORT: "1025"
    MAIL_USERNAME: ""
    MAIL_PASSWORD: ""
    MAIL_ENCRYPTION: "true"

services:
  database:
    image: mariadb:10.5
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - "./srv-pterodactyl/database:/var/lib/mysql"
    environment:
      <<: *db-environment
      MYSQL_DATABASE: "panel"
      MYSQL_USER: "pterodactyl"
  cache:
    image: redis:alpine
    restart: always
  panel:
    image: ghcr.io/pterodactyl/panel:latest
    restart: always
    ports:
      - "8888:80"
    links:
      - database
      - cache
    volumes:
      - "./srv-pterodactyl/var/:/app/var/"
      - "./srv-pterodactyl/nginx/:/etc/nginx/http.d/"
      - "./srv-pterodactyl/certs/:/etc/letsencrypt/"
      - "./srv-pterodactyl/logs/:/app/storage/logs"
    environment:
      <<: [*panel-environment, *mail-environment]
      DB_PASSWORD: *db-password
      APP_ENV: "production"
      APP_ENVIRONMENT_ONLY: "false"
      CACHE_DRIVER: "redis"
      SESSION_DRIVER: "redis"
      QUEUE_DRIVER: "redis"
      REDIS_HOST: "cache"
      DB_HOST: "database"
      DB_PORT: "3306"
  wings:
    image: ghcr.io/pterodactyl/wings:latest
    restart: always
    ports:
      - "8080:8080"
      - "2022:2022"
    tty: true
    environment:
      TZ: "Asia/Tokyo"
      WINGS_UID: 988
      WINGS_GID: 988
      WINGS_USERNAME: pterodactyl
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/var/lib/docker/containers/:/var/lib/docker/containers/"
      - "./etc-pterodactyl/:/etc/pterodactyl/"
      - "/var/lib/pterodactyl/:/var/lib/pterodactyl/"
      - "./var-log-pterodactyl/:/var/log/pterodactyl/"
      - "/tmp/pterodactyl/:/tmp/pterodactyl/"
      - "./etc-ssl-certs:/etc/ssl/certs:ro"

networks:
  default:
    ipam:
      config:
        - subnet: 172.20.0.0/16

ボリュームのマウントに関する注意点

Wingsがゲームサーバーのコンテナを作成する際、/var/lib/pterodactyl/volumes 配下のディレクトリを絶対パスで指定してボリュームとしてマウントします。 ここで絶対パスを解釈するのはホスト側で動いているDockerデーモンなので、ホスト側でもゲームサーバーのボリュームを /var/lib/pterodactyl/volumes 配下に配置する必要があります。 /var/lib/pterodactyl のマウントでホストとコンテナでパスを一致させているのはこのためです。

ネットワークに関する注意点

Wingsはデフォルトの設定で、ゲームサーバーのコンテナを所属させるネットワークとして 172.0.18.0/16 を作成しようとするので、このネットワークが既に存在していると起動に失敗します。

デプロイとWingsの設定

下記のコマンドで docker-compose.yml の内容をデプロイします。

cd pterodactyl/ # docker-compose.ymlがあるディレクトリ
docker compose up -d

しばらく待つとデータベース等のセットアップが終わり、 http://ホストのローカルIPアドレス:8888 でWebの管理画面にアクセスできるはずです。

次に、公式ドキュメントを参考にして、Panelコンテナ内のコマンドを実行してユーザーのセットアップを行います。

docker compose exec panel php artisan p:user:make

作成したユーザーでログインができたら、管理者用画面 (歯車マーク) で Location を作成した後に Node を作成します。 ここで作成した NodeConfiguration タブにある内容を、 config.yml としてWingsコンテナ内の /etc/pterodactyl 配下にマウントされるように配置します (上記の例ではホストの ./etc-pterodactyl 配下) 。

最後にWingsコンテナを再起動すると設定が反映され、管理画面からWingsと通信できているのが確認できるはずです。

docker compose restart wings

まとめ

Dockerコンテナを制御するプロセスをDockerコンテナ内で動かす、ということをしたので注意点はいくつかありましたが、やはりDocker Composeだけでセットアップが完了するのは便利ですね。

今回はローカル環境向けのPterodactylセットアップの紹介でしたが、気が向いたら本番環境向けにSSL化などの手順も含めたセットアップについての記事も書こうと思います。