Minecraft  Java Edition 1.18 サーバ側のバージョンアップの備忘録

# はじめに
こんにちは withでエンジニアをしているhayatonです。（最近入社したのでピチピチの若手です。）
withでは サーバ周りのお仕事をさせてもらっています。

今回、アドベントカレンダーで記事を書かせていただくこととなり、何を書こうかと悩んでいたところに、
Minecraftの大型アップデートがきた。ということもあり、その内容を記事にさせていただきました。

:::note info
このドキュメントはマイクラサーバの構築手順ではありません。バージョンアップ作業にフォーカスをおいたものです。
:::

https://www.minecraft.net/ja-jp/article/the-caves---cliffs-part-ii-update-here-jp


私は、マイクラ（Minecraft JavaEdition 1.11ぐらいから）にハマっています。（公共事業大好き勢）
一人だけでは飽き足らず、自前でサーバを構築し友人同士と同じ世界で楽しんでおります。（鯖管兼任）
そのサーバのアップデートについて

- 自分の作業備忘録
- 気づいたポイント(3つ)

の2点についてこの記事に記載します。


割と定期的にあるバージョンアップ作業なのですが、忘れがちなので、次のバージョンアップ向け自分用メモだったりしますが、
もしこの記事を読んで、何かしらで詰まっている方の解決への気づきなどが提供できたら嬉しいなと思い、書いてます。

:::note info
2021/12/13 追記
先日のlog4j脆弱性問題を受けて、サーバのバージョンが1.18.1に変更となっています。
1.18の方は、バージョンアップをおすすめします。
https://www.minecraft.net/ja-jp/article/minecraft-java-edition-1-18-1
JDKバージョンはそのままでOKです。
:::

## 私のサーバ環境情報
:::note info
AWS Lightsail

Memory/CPU/Disk: 4GM RAM / 2 vCPU / 80GB SSD
OS: Debian
Mod: none(vanilla)
Backup: Daily(to GoogleCloud CloudStorage)
java path: /usr/local/java
minecraft path: /home/minecraft
作業ユーザー: minecraft
:::

# 作業備忘録(バージョンアップ作業)

## 1. 稼働させるJavaのバージョンの変更
:::note alert
以前のminecraft 1.17.1 は、稼働条件のJavaバージョンは16でした。
今回のminecraft 1.18は、Javaバージョンが17になっています。(今回一緒にバージョンアップしています。)
:::
:::note info
ちなみに、この環境はopenjdkで稼働させていますが、JavaSEでもちゃんと動くと思います。 
:::
### [0] 作業ユーザーになる

```
$ su minecraft
```

### [1] java17のダウンロード
https://jdk.java.net/17/

```
$ wget "https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/1
2/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz"
```
### [2] 展開し、Javaをインストール
:::note info
私の環境では、/usr/local/java で使いたいJavaをシンボリックリンク張っている。
※ alternatives使うのがベストだろうけど許してください。
:::
```
lrwxrwxrwx  1 root      root        10 Dec  1 02:07 java -> jdk-16.0.1
drwxr-xr-x  8 minecraft minecraft 4096 Jun 25 22:57 jdk-16.0.1
```

なので、

```
$ tar zxvf openjdk-17.0.1_linux-x64_bin.tar.gz 
$ sudo mv jdk-17.0.1 /usr/local/.
$ cd /usr/local
$ sudo rm java
$ sudo ln -s /usr/local/jdk-17.0.1 java
$ ls -la /usr/local
...
lrwxrwxrwx  1 root      root        10 Dec  1 02:07 java -> jdk-17.0.1
drwxr-xr-x  8 minecraft minecraft 4096 Jun 25 22:57 jdk-16.0.1
drwxr-xr-x  8 minecraft minecraft 4096 Dec  1 02:07 jdk-17.0.1
...
```
として、インストール完了後、確認。

```
$ /usr/local/java/bin/java --version
openjdk 17.0.1 2021-10-19
OpenJDK Runtime Environment (build 17.0.1+12-39)
OpenJDK 64-Bit Server VM (build 17.0.1+12-39, mixed mode, sharing)
```
となればOK。

## 2. minecraftサーバ用jarファイルのダウンロード及び設置(インストール)

### [1] minecraftサーバ用jarファイルをダウンロード 
https://www.minecraft.net/ja-jp/download/server

```
$ wget "https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar"
$ mv server.jar minecraft_server.1.18.1.jar
```

### [2] jarファイルをセット
:::note info
私の環境では/home/minecraft に設置してある。
現在は以下のように、バージョンアップごとにシンボリックリンクを張り直しをしている
:::
```
-rw-r--r--  1 minecraft minecraft 43626592 Jul  6 21:05 minecraft_server.1.17.1.jar
-rw-r--r--  1 minecraft minecraft 43621201 Jun  8 20:03 minecraft_server.1.17.jar
lrwxrwxrwx  1 minecraft minecraft       25 Dec  1 01:54 minecraft_server.jar -> minecraft_s
erver.1.17.1.jar
```
なので

```
$ mv minecraft_server.1.18.1.jar /home/minecraft/.
$ cd /home/minecraft
$ rm minecraft_server.jar
$ ln -s minecraft_server.1.18.1.jar minecraft_server.jar
$ ls -la 
...
-rw-r--r--  1 minecraft minecraft 43626592 Jul  6 21:05 minecraft_server.1.17.1.jar
-rw-r--r--  1 minecraft minecraft 43621201 Jun  8 20:03 minecraft_server.1.17.jar
-rw-r--r--  1 minecraft minecraft 46323386 Nov 30 18:20 minecraft_server.1.18.1.jar
lrwxrwxrwx  1 minecraft minecraft       25 Dec  1 01:54 minecraft_server.jar -> minecraft_s
erver.1.18.jar
...
```
とする。

## 3. 起動前にワールドデータをバックアップとっておく

### バックアップとっておく
:::note info
壊れたことはないが、癖でやっています。（癖をつけておくの大事）
バックアップ取る際、どのバージョンだったかを一緒につけると便利かも
:::
```
$ cd /home/minecraft
$ cp -rp world world_1.17.1
```

## 4. 起動
### 起動
:::note info
私の環境では、systemctl組み込み済み
:::
```
$ sudo systemctl status minecraft 
$ sudo systemctl start minecraft
$ tail -F logs/latest.log
[02:08:39] [Worker-Main-2/INFO]: Loaded 7 recipes
[02:08:40] [Worker-Main-2/INFO]: Loaded 1141 advancements
[02:08:43] [Server thread/INFO]: Starting minecraft server version 1.18
[02:08:43] [Server thread/INFO]: Loading properties
[02:08:43] [Server thread/INFO]: Default game type: SURVIVAL
[02:08:43] [Server thread/INFO]: Generating keypair
[02:08:44] [Server thread/INFO]: Starting Minecraft server on *:25565
[02:08:44] [Server thread/INFO]: Using epoll channel type
[02:08:44] [Server thread/INFO]: Preparing level "world"
[02:08:44] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
```
とか出てきたらOK。
しっかりと、1.18で稼働したよというログも出てますね。

# 気づいたポイント
## [1] バージョンアップ後の初期起動に時間がかかる。
今回のアップデート直後のサーバ起動にかなり時間がかかった印象。（クラッシュしたかと一瞬思った。）
時間がかかっていても、強制終了しないでね。

```
[02:10:32] [Server thread/INFO]: Done (108.070s)! For help, type "help"
```
約2分弱ですね。
## [2] リリース直後はサーバサイドのJarファイルが1つ前になっていることがある。
(地味にハマった)
https://www.minecraft.net/ja-jp/download/server
このページが1.18対応したという表記になった直後にjarファイルをダウンロードしたが、
jarファイルを入れ替えして、さぁ起動だ！といったタイミングでずっとログに1.17.1がスタートしたよと出ていた。

```
[01:49:31] [Server thread/INFO]: Starting minecraft server version 1.17.1
```
いやいや、新しいの持ってきたんだけどなぁとドハマリしていたが、
以前のjarファイルとハッシュ値を比較した際に、同じ値となっており、古いものをダウンロードしていたことが発覚。
再度上記のサイトにアクセスし、新しいものに変わっていることを確認し、入れ替え作業を行った。
リリース直後はWeb表記は変わっているが、ダウンロードしてきたjarファイルは古いこともある。
以前のjarファイルとダウンロードしてきたjarファイルのmd5値をチェックして、変わっているかどうかを確認するとスマートかもしれない。


## [3] 遠くに離れなくても、新要素が反映されている。
（これが今回一番すごいことだと思う。）
これは、技術的な話じゃなく、ゲーム上の話なのですが、、、
いままでは、ワールド情報をバージョンアップ前のものから引き継ぐと遠い場所まで移動しないとアップデート内容が確認できないのが普通でした。
（いままでに読んでいないチャンクまで行かないと新要素が発生しなかった。）

が、今回のアップデートはいままでに読まれていたチャンクでも、地下に行くことで新要素の確認が出来ました。これが一番の驚きでした。
マイクラ開発スタッフの方々ありがとう・・・・そしてお疲れさまです。。。。。（脱帽）

# 最後に
この記事を最後まで読んでいただいてありがとうございます。
一応バージョンアップしてから今のところは問題が起きていませんが、なにか起きているようであればまた記事書こうと思います。

この記事は、自分の作業の備忘録が主目的ではありますが、
もしなにか躓いている方が、この記事を読んで、お役に立てる何かが見つかったら嬉しいです。

師走で忙しくなってくる時期に、マイクラのこんな大型アップデートをかけてくるなんて、
マイクラ開発スタッフの方々も鬼(warden)ですね！！笑