GCPでJava版Minecraftサーバを建てた話（ついでにホワイトリストも設定）

# はじめに
前回建てた ubuntu のサーバにそのまま Java 版 Minecraft サーバを建てたときのメモです。
Java のチューニングについては書かないので別途調べてください┏(<：)

AlwaysFree（一生無料）の「f1-micro」だとメモリサイズが小さすぎるので、事前に「n1-standard-1」に拡張しておきました。

# 1. Java 版 Minecraft サーバの構築
## 1.1. Java のインストール
サーバに SSH で接続して、root ユーザにスイッチしておきます。

```shell
su
```

root ユーザでログインしたら mkdir コマンドでサーバをインストールするディレクトリを作ります。
作ったら cd コマンドで移動します。

```shell
mkdir /mcjava
cd /mcjava
```

Minecraft サーバをインストールしようと思いましたが、Java が入ってなさそうなので先に Java を入れましょう。ここでは default-jre をインストールしていますが、Java のバージョンは Mincraft サーバのバージョンが指定している適切なバージョンを入れましょう。バージョンの確認が面倒な場合は概ね最新の JRE でもよいです。

```shell
apt install default-jre
```

ディスク容量がどうのこうのと聞かれたら y （yes）と打っといてください。
以上で Java のインストールは完了です。

## 1.2. Minecraft サーバのインストール
続いて Minecraft サーバのインストールです。ダウンロード用 URL は事前に調べておきましょう。
[MINECRAFT]https://www.minecraft.net/ja-jp/download/server/

![javadl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/5bc1c059-b512-db4a-b68b-c2df3deae75c.png)

リンクをコピーしたらダウンロードしましょう。

```shell
wget https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar
```

ダウンロードしたらサーバを１回起動します。エラーで終了するはずです。
![root@mcapsv01_ _mcjava - Google Chrome 2020_03_24 1_06_51_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/e1931108-6e20-5293-3159-9c3bff1460dc.png)
サーバをダウンロードしたディレクトリに eula.txt というテキストファイルができているはずなので、開いて中身を編集します。
EULA(エンドユーザーライセンス条項)に同意するか否かというファイルなので、同意する場合は eula=false の箇所を eula=true に書き換えましょう。
![root@mcapsv01_ _mcjava - Google Chrome 2020_03_24 1_06_27_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/52b2ba19-7670-ceea-e220-8d1d6dce2152.png)

```shell
eula=true
```

これでインストール完了です。
忘れてました。Java 版の Minecraft サーバはデフォルトで tcp/25565 ポートを使っているので GCP のファイアウォールルール設定でポートを開けておきましょう。
![port2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/13d5a3ab-927f-4de7-442a-2309adffcdc6.png)

## 1.3. Minecraft サーバの起動
作ったディレクトリに移動してサーバ起動のコマンドを入力します。サーバを起動するための専用ユーザを作っておいても良いですが、今回はそのまま root ユーザで起動します。
ダウンロードしてきたファイルの名前が「server.jar」だった場合は以下のコマンドで起動します。本来は起動コマンドを start.sh などのシェルとして用意し、root 以外の専用ユーザを使ってバックグラウンドで実行するのが望ましいですがここでは解説しません。

```shell
cd /mcjava
java -Xmx1024M -Xms1024M -jar server.jar nogui
```

以上で起動します。

余談ですが、Java 版 Minecraft サーバは Java の仮想マシンJVM 上で、事前に設定したメモリを上限として起動します。そのため、ubuntu サーバの負荷だけを見ていても Minecraft が余裕で動いてるのかどうかは分かりません。
人が増えてきてメモリが足りてないなと思ったらサーバ起動コマンドの -Xmx や -Xms の数字を増やしてみましょう。チューニングについてはここでは説明しません。

## 1.4. Minecraftサーバへの接続
統合版と一緒なので説明は省略。

## 1.5. Minecraftサーバの停止
統合版と一緒なので説明は省略。
シェルを用意していないのでサーバを起動したコマンドを終了すれば勝手にサーバも停止します。

## 1.6. ホワイトリストの設定
ホワイトリストも一緒に設定しておこうと思ってやってみたんだけども、統合版と少し仕様が違っていたのでメモっておきます。
Java版は統合版と違って、ログインしていないユーザをホワイトリストに登録できません。なので whitelist.json を直接編集します。
![root@mcapsv01_ _mcjava - Google Chrome 2020_03_24 2_02_04_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/54346fea-5479-212d-02d8-cf441e92dda1.png)
統合版のホワイトリストはユーザの名前だけ分かれば whitelist.json の登録はできますが、Java 版では uuid が必須項目です。uuid はサーバ側のログイン履歴を見れば調べることもできますが、これからログインしてくる新規ユーザのログは無いです。
そこで Mojang が提供している uuid を調べる Mojang API を使います。

[Mojang API] https://api.mojang.com/users/profiles/minecraft/JohnikiJoestar


```shell
{"id":"1f843a4609ae4715a3b062a522193fa0","name":"JohnikiJoestar"}
```

これでジョニキ・ジョースターの uuid も分かったのでホワイトリストに登録しましょう。
whitelist.json の形式は xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx なので、id を少し手直ししてファイルを編集します。

```shell
[
  {
    "uuid": "1f843a46-09ae-4715-a3b0-62a522193fa0",
    "name": "JohnikiJoestar"
  }
]
```

ファイルを直接編集した場合は、whitelist をリロードしておきましょう。

```shell
whitelist reload
```

以上です。ね？簡単だったでしょ？
![start2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/66173957-c8ca-6afb-b466-f51ccf80db86.png)