記事一覧に戻る

Docker使って超簡単にJava版、BE版クロスプレイ対応Minecraft Serverを建ててみた

2024-02-224 min read技術記事
#server#minecraft#初心者#Docker#オンプレミス

今回やったこと

  • Java版、BE版クロスプレイ対応のMinecraft ServerコンテナをDockerで0から建てる
  • セキュリティも少し考慮してホワリスを追加してみる

環境

  • オンプレサーバ(Ubuntu Server 22.04LTS)

全体の流れ

  1. Server, client側の前準備
  2. MinecraftServerのセットアップ
  3. コンテナ起動、ホワリスなどの編集

1. 前準備

Docker、Docker-composeのインストまで完了してる人は飛ばしてください

マイクラのclient側(ランチャー)をインストールしておく

rootに昇格(ここからはServer側の作業)

# sudo su -

タイムゾーン設定

// 設定
# timedatectl set-timezone Asia/Tokyo

// 確認
# timedatectl
               Local time: Sun 2023-07-16 21:02:11 JST   ### JSTとなっていることを確認 ###
           Universal time: Sun 2023-07-16 12:02:11 UTC
                 RTC time: Sun 2023-07-16 12:02:11
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

パッケージのアプデ

# apt -y update
# apt -y upgrade

ufw設定

  • 本当は必要だけど今回はルーター側でポート転送を設定してあるので不要
  • だけど後で設定します

dockerのインストール

// GPGキーを保存するディレクトリを作る
mkdir -p /etc/apt/keyrings

// GPGキーを取得する
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

// Dockerレポジトリを追加する
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

// パッケージリストの更新
apt-get update

// Dockerプラグインのインストール
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

dockerのテスト

docker -v

スクリーンショット 2024-02-02 18.57.47.png

上記のようにバージョンが表示される

docker run hello-world

スクリーンショット 2024-02-02 18.58.46.png

このコマンドに成功すると、上記の写真のようにHello from Docker!と表示されます。

docker-composeのテスト

docker-compose -v

スクリーンショット 2024-02-21 15.29.59.png

このコマンドに成功すると、写真のようにバージョンが表示される

参考

2. Minecraft Serverの設定

今回はすでに有志が用意してくれてあるDockerで構築可能なものを使用する

以下の記事を参考にしました

このDocker hubからimageを持ってきて使用するイメージです

バージョンはお好みで

Githubのクローン

git clone https://github.com/mabubu0203/minecraft_multi.git

Githubのクローンを自分のGithubにpushする

// リモートレポジトリを変更
git remote set-url origin [変更したいリポジトリのURL]

// 変更を確認
git remote -v

あとは普通にpushすればOKです

少し修正を加える

基本上記のままで大丈夫ですが、私の使いたい環境に合わせてymlを以下のように修正しました。

  • バックアップの無効化(私の環境では不要なため)
  • マイクラバージョンの最新化
  • docker imageの最新化
  • 不要な項目の無効化
version: "3.8"

services:
  mc-spigot:
    image: "itzg/minecraft-server:latest"
    container_name: "mc-spigot"
    tty: true
    stdin_open: true
    ports:
      - "19132:19132/udp"
      - "19133:19133/udp"
      - "25565:25565/tcp"
      - "25575:25575/tcp"
    environment:
      # server.properties
      ALLOW_FLIGHT: "false"
      ALLOW_NETHER: "true"
      ANNOUNCE_PLAYER_ACHIEVEMENTS: "true"
      BROADCAST_CONSOLE_TO_OPS: "true"
      BROADCAST_RCON_TO_OPS: "true"
      DEBUG: "false"
      DIFFICULTY: "easy" # 難易度
      ENABLE_COMMAND_BLOCK: "true"
      ENABLE_JMX: "false"
      ENABLE_RCON: "true"
      ENABLE_STATUS: "true"
      ENFORCE_SECURE_PROFILE: "false"
      ENFORCE_WHITELIST: "true" # ホワイトリストの有効化
      FORCE_GAMEMODE: "true"
      FUNCTION_PERMISSION_LEVEL: 2
      GENERATE_STRUCTURES: "true"
      HARDCORE: "false"
      LEVEL_NAME: "world"
      LEVEL_TYPE: "DEFAULT"
      MAX_PLAYERS: 15 # プレイヤー最大人数
      MODE: "survival" # ゲームモード
      ONLINE_MODE: "true"
      OP_PERMISSION_LEVEL: 4
      PREVIEWS_CHAT: "true"
      PVP: "true" # ユーザー同士のダメージを有効にするか
      RCON_PASSWORD: "${RCON_PASSWORD}"
      RCON_PORT: 25575
      SERVER_NAME: "SuwaGeeksMinecraft_Server"
      SERVER_PORT: 25565
      SIMULATION_DISTANCE: 12
      SNOOPER_ENABLED: "false"
      SPAWN_ANIMALS: "true"
      SPAWN_MONSTERS: "true"
      SPAWN_NPCS: "true"
      SPAWN_PROTECTION: 0
      USE_NATIVE_TRANSPORT: "true"
      VIEW_DISTANCE: 12
      WHITELIST: "${WHITELIST}"
      # other
      ENABLE_WHITELIST: "TRUE"
      EULA: "TRUE"
      MAX_MEMORY: "12G" # 最大メモリ
      MEMORY: "6G" # メモリ
      MODS_FILE: "/extras/mods.txt"
      OVERRIDE_SERVER_PROPERTIES: "true"
      REMOVE_OLD_MODS: "true"
      REMOVE_OLD_MODS_DEPTH: 1
      REMOVE_OLD_MODS_INCLUDE: "*.jar"
      TYPE: "SPIGOT"
      TZ: "Asia/Tokyo"
      VERSION: "1.20.4" # バージョン(2024/2/21最新)
    volumes:
      - "./data:/data"
      - "./mods.txt:/extras/mods.txt:ro"
    restart: unless-stopped

mods.txtの修正も必須です(リンク切れを起こしてる)

Geyser-Spigot.jarはここからダウンロード

floodgate-spigot.jarはここからダウンロード

最終的にmods.txtはこのようになりました

<div class="link-card-placeholder" data-url="https://ci.opencollab.dev//job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/build/libs/Geyser-Spigot.jar"></div>
<div class="link-card-placeholder" data-url="https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot"></div>

ufw設定

Server側でポートを開放します

フル開放してしまえば気にすることはないですが、怒られそうなので()

// 管理者権限でコンソールを弄っていることを前提にしてます(sudoつけてね)
// UFWが起動しているかチェック
ufw status

// 起動していなければ起動
ufw enable

// sshで使用するポート、サーバーの通信ポートを許可
ufw allow 22/tcp
ufw allow 25565/tcp
ufw allow 19132/udp

// 一応再起動
ufw reload

// 間違えたらこれで削除可能(何番目のルールか指定する)
ufw delete 1

スクリーンショット 2024-02-22 1.19.35.png

最終的にこんな感じになりました

起動

git clone https://github.com/[ユーザーID]/[作成したレポジトリ名]

まずサーバーでクローンします

以下起動手法(初回のみ)

// .env.sampleをコピーして編集
cp ./docker/.env.sample ./docker/.env
vi ./docker/.env

// ビルドと起動
docker-compose -f ./docker/docker-compose.yml up --build --remove-orphans

// 起動を確認したら一旦停止
docker-compose -f ./docker/docker-compose.yml stop

設定を更新1(Geyser-Spigot)

auth-type: onlineauth-type: floodgate に変更

vi ./docker/data/plugins/Geyser-Spigot/config.yml

設定を更新2(floodgate)

username-prefix: "."username-prefix: "【BE】" に変更

vi ./docker/data/plugins/floodgate/config.yml

通常起動方法

// start
docker-compose -f ./docker/docker-compose.yml start

//stop
docker-compose -f ./docker/docker-compose.yml stop

以上で完了です。

お疲れ様でした。

3. メモ

サーバーコマンドの実行方法

// ここでは"whitelist reload"コマンドを実行している
docker exec -i <コンテナ名またはID> rcon-cli whitelist reload

ホワイトリストの使用方法

whitelist.jsonを開いて

vi ./docker/data/whitelist.json

以下のようにuuidnameをjsonに登録することでワールドへ入ることが可能です

uuidは公式が提供するAPIで取得するか、サーバーログにて一度入ってみることで確認可能です

[
    {
      "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "name": "xxxxx"
    },
    {
      "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "name": "xxxxx"
    }
]

ops.json(op権限の付与)について

ops.jsonを開いて

vi ./docker/data/ops.json

以下のようにuuidnameに加えてlevelbypassesPlayerLimitをjsonに登録することで管理者権限を付与することが可能です

ここでのbypassesPlayerLimitとは、設定したサーバー人数の上限に達しているとき、そのサーバーに入ることが可能かを設定するものです

[
  {
    "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name": "xxxxx",
    "level": 4,
    "bypassesPlayerLimit": false
  },
  {
    "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name": "xxxxx",
    "level": 4,
    "bypassesPlayerLimit": false
  }
]

また何かあったら追記します。

それでは