マインクラフトをみんなで遊ぶ CentOS8.1 + systemdで自動起動

# 背景
普段FPSで遊んでるメンバーでなんか違うゲームしたいねってなりました。
殺伐とした世界で生きているのでたまにはのんびりしようとやったことがない人が多いマインクラフトに決めました。

当初は、個人のPCにサーバーを立てていたのですが、人数が増えるにつれて(4,5人)動作が重くなったため
レン鯖にすっかと軽い気持ちではじめました(大変でした)

遊ぶ目的ではじめましたが、非常に勉強になったのでその時の手順を残そうと思います。
仲間が増えれば嬉しいです。

## 環境&採用理由

追記
**今回の趣旨とは異なるのでConoHaはやめたほうがいいです**
停止中も課金されるので、SAKURA等をおすすめします

- ConoHaのレンタルサーバー
ちょっとやってみたいと構築をはじめたメンバーから引き継いだだけ

- CentOS8.1
参考にしたサイトがCentOSだったため

## 手順

基本的にはこちらの手順に沿って進めましたが、内容が古いため新しい情報に更新しながら行います
https://support.conoha.jp/v/minecraft/

サーバーを立ち上げて黒画面に入るところまではすっ飛ばします
ディストリビューションをCentOS8.1を選択してください。
プランは4Gのものを選びました。

また、ConoHaのコンソールは非常に使いにくいので、sshキーを発行して、ターミナル等からsshすることをおすすめします。

以下サーバーの設定を行います

まず、OpenJDKをダウンロードします

```
# curl -O https://download.java.net/java/GA/jdk14/076bab302c7b4508975440c56f6cc26a/36/GPL/openjdk-14_linux-x64_bin.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  189M  100  189M    0     0  6515k      0  0:00:29  0:00:29 --:--:-- 6091k
```

ダウンロードしたファイルを解凍します

```
tar xvf openjdk-14_linux-x64_bin.tar.gz
```

javaのファイルを移動し、パスの設定を行います

```
# sudo mv jdk-14 /opt/
# sudo tee /etc/profile.d/jdk14.sh <<EOF
> export JAVA_HOME=/opt/jdk-14
> export PATH=\$PATH:\$JAVA_HOME/bin
> EOF
export JAVA_HOME=/opt/jdk-14
export PATH=$PATH:$JAVA_HOME/bin
```

バージョンが確認できたらインストール完了です

```
# java --version
openjdk 14 2020-03-17
OpenJDK Runtime Environment (build 14+36-1461)
OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
```

-bash: java: command not found
と表示される場合は、sourceするなり、sshで再接続するなりしてください


Minecraft用のユーザーを作成します。

```
# adduser minecraft
```

Minecraft用のユーザのパスワードを設定します。

```
# passwd minecraft
```

Minecraft用ユーザ“minecraft”へスイッチします。

```
# su - minecraft
```

ホームディレクトリに移動しているか確認します。

```
# pwd

/home/minecraft
```

Minecraftマルチプレイ用のサーバファイルを、ダウンロードします。

※サーバファイルとクライアントのバージョンが違うと接続できないので気をつけてください。
現在(2020/05/30 時点)の最新版は、サーバファイル、クライアント共に、バージョン1.15.2です。

最新バージョンは以下サイトで確認してください
https://www.minecraft.net/ja-jp/download/server/

1.15.2の場合リンクはChromeで言う所のデベロッパーモードで取得します
手順に記載があるファイル名を1.15.2に変えればいいんじゃないのと思ってやってもs3にファイルが無いようで403が返ってきます...

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

ダウンロードが成功しているか確認します。

```
# ls -la
total 35348
drwx------  2 minecraft minecraft     4096 May 30 00:08 .
drwxr-xr-x. 3 root      root          4096 May 29 23:59 ..
-rw-r--r--  1 minecraft minecraft       18 Nov  9  2019 .bash_logout
-rw-r--r--  1 minecraft minecraft      141 Nov  9  2019 .bash_profile
-rw-r--r--  1 minecraft minecraft      312 Nov  9  2019 .bashrc
-rw-rw-r--  1 minecraft minecraft 36175593 Jan 17 19:06 server.jar
```

ダウンロードできてますね。苦肉の策だった...


次に、Javaコマンドを使い、Minecraftマルチプレイ用のサーバファイルを一度実行して、設定ファイル(eula.txt)等を作成します。

```
java -Xmx1024M -Xms1024M -jar server.jar nogui

[00:26:12] [main/ERROR]: Failed to load properties from file: server.properties
[00:26:12] [main/WARN]: Failed to load eula.txt
[00:26:12] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
```

ファイルが生成されているか確認します

```
ls -la
total 35360
drwx------  3 minecraft minecraft     4096 May 30 00:26 .
drwxr-xr-x. 3 root      root          4096 May 29 23:59 ..
-rw-r--r--  1 minecraft minecraft       18 Nov  9  2019 .bash_logout
-rw-r--r--  1 minecraft minecraft      141 Nov  9  2019 .bash_profile
-rw-r--r--  1 minecraft minecraft      312 Nov  9  2019 .bashrc
-rw-rw-r--  1 minecraft minecraft      181 May 30 00:26 eula.txt
drwxrwxr-x  2 minecraft minecraft     4096 May 30 00:26 logs
-rw-rw-r--  1 minecraft minecraft 36175593 Jan 17 19:06 server.jar
-rw-rw-r--  1 minecraft minecraft      940 May 30 00:26 server.properties
```

MOJANG社の「MINECRAFT END USER LICENCE AGREEMENT」に、同意できる場合は、ホームディレクトリに作成されている「eula.txt」をvimで編集します。

最後の行(３行目)を「eula=false」から「eula=true」に変更してください。

```
# vim eula.txt
```

もう一度、Javaコマンドを使い、server.jarを実行します

```
java -Xmx1024M -Xms1024M -jar server.jar nogui
```

実行後、「Done !」というメッセージが出力されたら「stop」を入力してください。

```
# java -Xmx1024M -Xms1024M -jar server.jar nogui
～
[xx:xx:xx] [Server thread/INFO]: Done (x.xxx s)! For help, type "help" or "?"
```

設定ファイル等の作成が正常終了している場合、ディレクトリに以下の10ファイル(ディレクトリ含む)が作成されます。

もし、10ファイルが作成されなかった場合は、もう一度手順を見直してください。

```
# ls -la

banned-ips.json
minecraft_server.1.8.jar
whitelist.json
banned-players.json
ops.json
world
eula.txt
server.properties
logs
usercache.json
```


Minecraftマルチプレイ用のサーバ起動スクリプトを作成します。

vimを起動したら、#!/bin/sh以下の内容をコピー＆ペーストしてください。

```
# vim server.sh

#!/bin/sh
java -Xmx1024M -Xms1024M -jar server.jar nogui &
exit 0
```

保存されているか確認します

```
# cat server.sh 

#!/bin/sh
java -Xmx1024M -Xms1024M -jar server.jar nogui &
exit 0
```

実行権をつけます。

```
# chmod 700 server.sh
```

起動スクリプトを実行します。その後、スクリプトが起動しているかを確認します。この時にスクリプトのメッセージが表示されますので、“Done”のメッセージがでるまで少し待ってください。

```
# sh server.sh
～
Done (x.xxx s)!
```

Doneが表示されていれば、プロセスが起動されているか確認します
Doneの状態からEnterを押すとコマンドを入力できるようになります

```
# ps -ef | grep java | grep -v grep
minecra+  5813     1 70 00:39 pts/0    00:01:29 java -Xmx1024M -Xms1024M -jar server.jar nogui
```

スクリプトを停止したい場合は、killコマンドを使用します。

```
# kill 5813
```

Minecraftマルチプレイ用のポート開放の設定を、rootユーザで行います。

```
# su - root
Password : "VPS追加画面で入力した、rootパスワード"
```

rootユーザになれたらnftablesを使用して、ポートの管理を行います。
iptablesもfirewalldも使えますが、勉強のためnftablesを使います
nftablesについては詳しく触れません
いろいろ記事が転がっているので自分で調べてみてください。

まずテーブルを作ります

```
nft create table ip minecraft
```

テーブルができているかは以下コマンドで確認してください

```
nft list tables
```

チェーンを作成します

```
nft add chain ip minecraft minecraft_chain { type filter hook input priority 0 \; }
```

チェーンが作成されたか確認します
作成したテーブルの内部に追記されていればOKです

```
# nft list chains

table ip minecraft {
	chain minecraft_chain {
		type filter hook input priority 0; policy accept;
	}
}
```

ルールを作成します
マインクラフトのマルチプレイ用ポートは25565です

```
nft add rule ip minecraft minecraft_chain tcp dport 25565 accept
```

チェーンの内部に追記されていればOKです

```
# nft list ruleset ip

table ip minecraft {
	chain minecraft_chain {
		type filter hook input priority 0; policy accept;
		tcp dport 25565 accept
	}
}
```

ここまで完了したら、マインクラフトのクライアントからアクセスしてみましょう
Connection timed out
のエラーがでたら、大変ですがもう一度手順を読み返してください。
ポートが開いていないか、プロセスが立ち上がっていない可能性が高いと思います。
デフォルトでfirewalldが有効になっている場合は、同じように25565を開けるか、停止してください。

**無事アクセスできれば完了です！思う存分遊んでください！**


といいたいところですが、まだ作業は残っています。

サーバーを起動しっぱなしだと、サイズによってはそこまで高くなりませんが満額払う必要があります。
できれば安く遊びたいため、仕事中など、遊ばないときはサーバーを落とします

ですが、一度サーバーを落としてしまうと、マインクラフトのプロセスも死ぬのでサーバーに入って、
コマンドを打って、マインクラフトを起動する必要があります。

それでは、サーバー管理者がいない時に自由に遊べないので、サーバー起動時に合わせてマインクラフトも立ち上がるようにします。
起動だけならコンソールから行えるので、知識がなくても行えます。

以下、自動起動の設定です。

マインクラフトを起動するスクリプトを作成します
※minecraftユーザーとはいえ、パスワードを記載するのはイケてないので修正考えます

```
# vim /root/exec_minecraft.sh

#!/bin/sh
sudo su - minecraft << EOF
"minecraftユーザーのパスワード"
sh server.sh
```

サービスファイルを作成します
unit以下をコピペしてください

```
# vim /etc/systemd/system/minecraft.service

[Unit]
Description = exec minecraft service

[Service]
User=root
ExecStart=/root/exec_minecraft.sh
Restart=always
Type=simple

[Install]
WantedBy = multi-user.target
```

サービスを有効にします

```
systemctl enable minecraft
```

サーバーを再起動してもマインクラフトが立ち上がることを確認できれば今回の目標は達成です！

**今度こそマインクラフトを思う存分遊びましょう！！**


## 感想
公式の情報が古いのと、間違っていたりするので軽い気持ちではじめた分大変でした。
すんなり進んで1時間くらいでしょうか
初回に試行錯誤で構築したときは3~4時間ほどかかりました

一番時間がかかったのはポートを開けるところで、iptablesは古いんか... nftablesってなに...
となったことです。
いままでiptablesは使っていたのですが、恥ずかしながらnftablesの存在すら知りませんでした。
どうせならnftablesを使ってやろうと深夜のテンションで進めたのが時間がかかった要因です。

とはいえ、使ったことがない機能を使ったので非常に勉強になりました。
やらないと遊べないというモチベーションもあり頑張れました。
今ではみんなで楽しく遊んでいます(1ヶ月で飽きました)

今回はConoHaのレンタルサーバーで構築しましたが、CentOS8であれば手順は変わらないと思いますので、ぜひやってみてください。
また、次回のバージョン1.16のGAは時期未定のようですが、リリースされれば、EC2で動かすのに挑戦したいと思います。

ConoHaの料金体系がわかりにくく痛い目に会いました。
停止中も課金って勘弁してくれよ...

## 参考サイト
https://support.conoha.jp/v/minecraft/
https://computingforgeeks.com/install-oracle-java-openjdk-14-on-centosfedora-linux/
https://knowledge.sakura.ad.jp/22636/