Minecraftサーバーをクロスプレイで運用するまでにやったこと

# はじめに

`Minecraft` をクロスプレイできるまでに調べたこと/やったことをまとめています。
身内でクロスプレイで遊ぶためにMinecraftサーバーを立ち上げて運用しています。
知りたい情報は見出しからジャンプしてください。

# クロスプレイできるまでに調べたこと

## Minecraftの種別

Minecraftは

- Java版
- 統合版（Bedrock Edition）

の2種類が存在する。

PS4/5 , Switch , スマホなどは統合版となる。
PCはJava版、統合版の選択購入となる。
※ MacOSの場合はJava版のみ

## クロスプレイとは

異なるハード、種別を跨いでオンライン上で遊ぶこと。 
```bash:例
- windows同士だが、それぞれJava版と統合版で種別が異なる
- 統合版だが、PS4とSwitchでハードが異なる
- MacOS(Java版)とSwitch(統合版)
```

通常では、統合版間でのクロスプレイに対応しており、Java版と統合版のクロスプレイはサポートされていない。

## クロスプレイを実現するには？

Java版 と 統合版 が参加できるサーバーを用意（借りる）する。  
ローカルで立てて公開するか、課金してクラウドを借りるかの二択になるようだ。
また公開したサーバーはHackしておく必要がある。（後述

## クロスプレイに最低限必要なもの

- Microsoftアカウント もしくは Xbox Liveアカウント

# クロスプレイ構築の見積もり

## ローカルで立てて公開する

私の採用した手段としては、

1. Mac Mini上でMinecraftサーバーを起動
2. Minecraftサーバーにクロスプレイ用の設定を施す
3. グローバルで公開する

を目指し構築しました。
参考にしている記事は [こちら](https://soundorbis.com/minecraft-multi-mac/)

## MinecraftサーバーはDockerで構築できる

Google検索で `Minecraft docker-compose` で検索し、
実際に運用されている方の記事を参考にしました。

## 作業見積もり

1. Mac MiniのOSを最新化する
1. Docker Desktop for Mac をインストールする
1. docker-compose.yml 作成
1. docker-compose up 起動
1. ダイナミックDNSを取得
1. ダイナミックDNSの設定を追加
1. MODを追加
  `Minecraftサーバーにクロスプレイ用の設定を施す` についてはこちらで実現

# クロスプレイ構築の作業

## 作業一覧

1. Mac Mini の準備
   1. Mac OSを最新化
   1. Docker Desktop for Mac をインストール
1. Github にリポジトリ作成
   1. docker-compose.yml作成
1. 初期セットアップ
   1. リポジトリをクローン
   1. docker-compose up 起動
   1. vi config.yml
   1. localhost で確認
1. LAN(Local Area Network) で確認
   1. Mac Mini の設定を変更
   1. ルーター/モデムの設定変更
1. WAN(Wide Area Network) で確認  
   1. ダイナミックDNSの取得&設定
   1. ルーター/モデムの設定変更

## 作業詳細

### Mac Mini の準備

Mac Mini(2016) に 
- `macOS Monterey 12.4` をクリーンインストール  
- Docker Desktop for Mac を[公式](https://docs.docker.com/desktop/mac/install/)よりインストール  

### Githubにリポジトリ作成

URL: https://github.com/mabubu0203/minecraft_multi

#### クロスプレイを実現するためには

Minecraft を `JavaEdition` ✖️ `SPIGOT` サーバーで起動し、以下のプラグインを導入する  
- Geyser-Spigot
- floodgate-spigot

`BedrockEdition` からは `Geyser` を介して遊ぶこととなる  

#### docker-compose.yml/ports

| 記載内容 | 説明 |
| - | - |
| 19132:19132/udp | BedrockEditionからはGeyserを介する |
| 19133:19133/udp | BedrockEdition(IPv6)からはGeyserを介する |
| 25565:25565/tcp | JavaEdition用の標準ポート |
| 25575:25575/tcp | Rcon用のポート |

#### docker-compose.yml/enviroment

細かい設定等は下記に説明あり  
URL: https://github.com/itzg/docker-minecraft-server/blob/master/README.md

特に大事だと思ったものは下記に抜粋  

| property | value | 説明 |
| - | - | - |
| DIFFICULTY | easy |  |
| HARDCORE | false | [ハードコア](https://minecraft.fandom.com/ja/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%B3%E3%82%A2)を許可するかどうか |
| MAX_PLAYERS | 15 | 最大接続人数 |
| MODE | survival |  |
| PVP | false | ユーザー同士で対戦するを許可するかどうか |

| property | value | 説明 |
| - | - | - |
| ENABLE_WHITELIST | TRUE | 許可されたユーザーのみアクセスできるようにする |
| EULA | TRUE |  |
| MODS_FILE | /extras/mods.txt |  |
| TYPE | SPIGOT |  |
| TZ | Asia/Tokyo |  |
| VERSION | 1.19 | 2022/07時点で最新のものを指定 |

#### 初期セットアップ

1. リポジトリをクローン  
  `$ git clone https://github.com/mabubu0203/minecraft_multi.git`
1. 初回起動  
  `$ docker-compose -f ./docker/docker-compose.yml up --build --remove-orphans`  
  エラーがでていないことを確認  
  `$ docker-compose -f ./docker/docker-compose.yml stop`  
1. pluginの設定修正  
  `vi ./docker/data/plugins/Geyser-Spigot/config.yml`  
    remote.auth-type: online -> floodgate
1. 再度起動後、Mac Miniの minecraft(JavaEdition) から接続を確認  
  接続先: `localhost:25565`

#### LAN(ローカルエリアネットワーク) で確認

1. Mac Mini のセキリティを変更  
  システム環境設定 -> セキリティとプライバシー -> ファイアーウォール
1. ルーターのポートフォワードの設定を変更  
  25565（TCP）  
  19132（UDP）  
1. Mac Book Pro(Mac Miniとは別の端末)から繋いで確認
  観点:Java版同士の疎通確認
1. Switchから繋いで確認 
  観点:統合版からの疎通確認 
  参考: [【プラグイン紹介】統合版とJava版でクロスプレイが出来るプラグイン【GeyserMC】](https://mcpoteton.com/mcplugin/geysermc#index_id12)

#### WAN(Wide Area Network) で確認

1. ダイナミックDNSを取得
1. Mac Mini にダイナミックDNSの設定を施す
1. 友人に繋いで確認してもらう
  観点:WANの疎通確認

# 作業していてハマったこと/苦労したこと

## docker-compose.yml/enviroment

value値に `ture/false` を `クォートコート(') or ダブルクォート(")` で括らない場合怒られる  
-> value値は文字列か数値しかだめboolはないんですね、なるほど

`TYPE: "PAPER"` だとswitchからアクセスできない  
-> 原因がわからない。`TYPE: "SPIGOT"` で動作しているので諦めた

起動ログの時間がおかしい  
-> タイムゾーンの設定(`TZ: "Asia/Tokyo"`)で回避した

## Geyser-Spigot

`./docker/data/plugins/Geyser-Spigot/config.yml` を
`remote.auth-type: online -> floodgate` に修正

## LANから接続できない  

- MacOSのファイアウォールに妨げられていた
- ルーターのポートフォワードの設定が足りていなかった

### WANから接続できない

- 2重ルーターとなっていた
  - auひかりから貸与されているホームゲートウェイにブリッヂモードで接続していなかったことが発覚
    - 参考:[auひかりに市販のWi-Fi機器を接続する方法【ブリッジモードを使おう】](https://xn--auso-net-h53gmnzi.com/article/bridge-mode/)
- LAN内からだとダイナミックDNSで接続できない

# 運用やってみての気づき

## WHITELIST

deploy時は whitelist.json の中身は空なので誰もサーバーに入れない。
whitelist.json にユーザーを手作業で追加した。
ついでに ops.json にも管理者権限をもっていいユーザーを手作業で追加した。
参考: [【Minecraft】ホワイトリストの導入方法](https://minecraft.server-memo.net/whitelist/)

以降はops権限をもったユーザーがコマンドで `/whitelist add` でユーザーを追加している。
ただし、追加される側は自分のユーザー名を知る必要がある。

裏技で、ホワイトリストに弾かれたログからユーザー名を逆引きすることもできる。

## 統合版はハードにより強制アップデートされる可能性がある

PS4/5 , Switch , スマホなどはハードの状況により、強制アップデートされることがある。
サーバー側はdocker-composeの記述でバージョンを固定しているので、差異が発生する可能性がある。
Java版は、ユーザー自身で起動するバージョンを複数選択可能である。

## Minecraftを遊びたい時間は十人十色

Mac Miniの電源を落とすと公開されているMinecraftは閉じるわけだが、
複数人で遊ばなければいけないというわけでもないので、常時プレイできるように提供したほうが親切設計ではある。

## 影Mod

M1Macで影Modを導入した事例が少ない。

## mods.txtで指定するプラグインについて

jenkinsの `lastSuccessfulBuild` によって最新のjarをとってくる仕組みになっている。
なので、dockerの起動ログを見に行かないとどのバージョンのプラグインを利用されているかよくわからない。
※ プラグインのバージョンを意識する必要は正直ないので、問題はない