今回やったこと
- Java版、BE版クロスプレイ対応のMinecraft ServerコンテナをDockerで0から建てる
- セキュリティも少し考慮してホワリスを追加してみる
環境
- オンプレサーバ(Ubuntu Server 22.04LTS)
全体の流れ
- Server, client側の前準備
- MinecraftServerのセットアップ
- コンテナ起動、ホワリスなどの編集
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
上記のようにバージョンが表示される
docker run hello-world
このコマンドに成功すると、上記の写真のようにHello from Docker!
と表示されます。
docker-composeのテスト
docker-compose -v
このコマンドに成功すると、写真のようにバージョンが表示される
参考
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はこのようになりました
https://ci.opencollab.dev//job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/build/libs/Geyser-Spigot.jar
https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot
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
最終的にこんな感じになりました
起動
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: online
を auth-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
以下のようにuuid
とname
を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
以下のようにuuid
とname
に加えてlevel
、bypassesPlayerLimit
を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
}
]
また何かあったら追記します。
それでは