minecraftのプラグインサーバーをConoHaVPSで作る。Dynmapも使う。

# はじめに

2023年5月にマイクラサーバーを立ててみたので、その覚え書きです。手順内のプラグインはDynmapをチョイスしました。「みんな入れたい」「でも手順が少し複雑」というので題材として丁度良いのではないかと思いました。

本記事はプラグインサーバーを作成する手順なのでJava版からアクセスされるサーバーを想定していますが、GeyserMCとFloodgateを利用することで、後から統合版とのクロスプレイに対応したサーバーにすることもできます。ただし、この記事ではその手順は記載していません。

# 読者の想定レベル

- ssh でサーバーに入ったことがある
- vi でファイルが編集できる

# 手順

## ConoHaVPSを借りてサーバーを立てる

ConoHa for GAMEというサービスを利用します。借りるのは結局VPSです。
minecraft Java版を選択し、自分の用途に合ったプランを選択します。

![conoha1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/4c97c2a3-4e70-b3d0-b82d-5bb82c179a05.png)

rootパスワードを入力して忘れずにおき、ネームタグ（サーバー名のようなもの）を入力します。
「オプションを見る」を開き、SSH Keyを設定します。

![conoha2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/16b0b2b4-2061-e899-c28c-ceff542b1e48.png)

キーを新規作成から自動作成、`minecraft-key`という名前の秘密鍵を生成します。「＋追加」のボタンを押したタイミングでファイルが生成されるため、ダウンロードのモーダルが出てくるまで少し待つ必要があります。ダウンロードボタンが出てきたら、クリックして「minecraft-key.pem」という秘密鍵のファイルをダウンロードします。後で何度も使う大事なファイルなので無くさないようにしてください。

![conoha3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/26b48b28-e1f6-216f-259f-b64568bd9fe8.png)

ダウンロードができたら、「次へ」をクリックし、支払い方法などを入力して決済を行います。

サーバーリストの画面に飛んだら、先程作ったサーバーがあるのでネームタグをクリックして詳細画面に飛びます。

![conoha4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/46959584-a194-c075-4c56-89df8ebc24c6.png)

サーバーが起動してたら一度停止し、サーバー再構築をクリックします。

![conoha5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/22da075c-932c-99a4-132e-7acbd81cb82f.png)

プラグインを入れたいサーバーのバージョンを選択して、rootパスワードを再設定し、SSH Keyには先程登録したキーを割り当てます。そしてサーバー再構築を行います。再構築には時間がかかるので、しばらく待ちます。

![conoha6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/5bf90357-e03c-9d22-0ff3-38c24e80d123.png)

サーバーが出来上がったら、サーバーのIPアドレスをメモしておきます。

## sshでサーバー内に入る

sshやsftpでサーバー内にアクセスしたいのですが、その前にやらなければいけないことがあります。
22番ポートをセキュリティグループで追加しなくてはいけません。最初から選択可能なセキュリティグループにIPv4v6-SSHがあるのでこれを追加します。

![conoha7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/1a66b511-1f36-2c33-c2f5-285e434ee6af.png)

追加できたらあとは`~/.ssh/config`を書き、コンソールからsshでアクセスできるようにします。
筆者はWSLのUbuntuからsshを使ってアクセスしていますが、TeraTermでもMacのターミナルからでも何でも構いません。

`~/.ssh`の直下に、ダウンロードしてきた秘密鍵のminecraft-key.pemを配置して、chmodします。

```
chmod 400 ~/.ssh/minecraft-key.pem
```

~/.ssh/configに追記します。ファイルが無ければファイルを作成します。

```:~/.ssh/config
Host minecraft
        Hostname [IPアドレスをここに書く]
        User root
        IdentityFile ~/.ssh/minecraft-key.pem
        ServerAliveInterval 30
        ServerAliveCountMax 20
```

そうすれば以下のようなコマンドでVPSのサーバーに入ることができるようになります。

```
ssh minecraft
```

無事にサーバーに入れたらOKです。2023年05月時点だとOSは`Ubuntu 20.04`のようでした。
`/opt/minecraft_server/`にマイクラサーバーの中身があります。

## 既存のサーバープロセスの確認と停止

`ps aux | grep minecraft`でマイクラのプロセスが起動していることを確認しましょう。

```
ps aux | grep minecraft
minecra+     804  0.0  0.0   2608   536 ?        Ss   18:38   0:00 /bin/sh -c /usr/bin/screen -DmS minecraft /usr/bin/java -server -Xms512M -Xmx2048M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Dlog4j2.formatMsgNoLookups=true -jar /opt/minecraft_server/minecraft_server.1.19.4.jar nogui
minecra+     861  0.0  0.0   6952  3380 ?        Ss   18:38   0:00 /usr/bin/SCREEN -DmS minecraft /usr/bin/java -server -Xms512M -Xmx2048M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Dlog4j2.formatMsgNoLookups=true -jar /opt/minecraft_server/minecraft_server.1.19.4.jar nogui
minecra+     890 28.3 30.1 9243564 2454268 pts/0 Ssl+ 18:38   9:39 /usr/bin/java -server -Xms512M -Xmx2048M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Dlog4j2.formatMsgNoLookups=true -jar /opt/minecraft_server/minecraft_server.1.19.4.jar nogui
```

マイクラサーバーっぽいものが起動しているのがわかります。`/usr/bin/java -server -Xms512M -Xmx2048M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Dlog4j2.formatMsgNoLookups=true -jar /opt/minecraft_server/minecraft_server.1.19.4.jar nogui`の部分がサーバーを動かすメインのコマンドで、それをscreenコマンドを使用してバックグラウンドで実行している構造になっています。

このプロセスはsystemdで適切に管理されているので、`minecraft-server.service`ファイルに書かれた通りに起動しています。

```
# 中身を確認する
vi /etc/systemd/system/minecraft-server.service
```

今回立てたいのはプラグインサーバーなので、このプロセスを停止させて、起動に使っているファイル`minecraft_server.1.19.4.jar`を別のものに差し替えたいです。なのでプロセスを停止します。

```
systemctl stop minecraft-server
```

これでマイクラサーバーが止まりました。

## プラグインサーバーのインストールと起動

`/opt/minecraft_server/minecraft_server.1.19.4.jar`をプラグインサーバーのものに差し替えましょう。

今回の例では[PaperMC](https://papermc.io/downloads/paper)から`paper-1.19.4-524.jar`をダウンロードして使用します。

PCからサーバーにファイルを転送するのには、WindowsからだとSFTPが使えるソフトが便利なので[Cyberduck](https://cyberduck.io/)というソフトウェアを使用します。もちろん代替のものでも良いです。

以下はCyberduckの画面です。新規接続からSFTPを設定し、サーバーのIPアドレスとユーザー名rootと、`minecraft-key.pem`のファイルへのパスを入力します。

![cyber1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/b952899d-a9ed-35be-6688-f4086d9c7284.png)

上部の`/root`となっているところを`/`に変更して、`/opt/minecraft_server`を開けば、マイクラサーバーを構成するファイルたちを見ることができます。
ここにあるもともとの起動ファイル`minecraft_server.1.19.4.jar`を`minecraft_server.1.19.4.jar.org`にrenameして使えなくしてしまい、代わりにダウンロードした`paper-1.19.4-524.jar`を突っ込みます。

![cyber2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/da3055b7-4550-e3c5-af8f-27410b11d374.png)

さて、それではこのファイルを使ってマイクラサーバーを起動しましょう。

ssh でさっき見たファイルの、サービスの起動情報を編集します。

```
# 中身を編集する
vi /etc/systemd/system/minecraft-server.service
```

このファイル内で`/opt/minecraft_server/minecraft_server.1.19.4.jar`となっている箇所を`/opt/minecraft_server/paper-1.19.4-524.jar`に変更してやれば良いです。また、メモリをもっと使いたいという場合は使用メモリの情報も書き換えて良いです。例えば以下のような感じです。

```:/etc/systemd/system/minecraft-server.service の例
[Unit]
Description=Minecraft Server
After=network.target

[Service]
WorkingDirectory=/opt/minecraft_server/
User=minecraft
Group=minecraft
ProtectSystem=full
ProtectHome=true

ExecStart=/bin/sh -c '/usr/bin/screen -DmS minecraft /usr/bin/java -server -Xms1024M -Xmx4096M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Dlog4j2.formatMsgNoLookups=true -jar /opt/minecraft_server/paper-1.19.4-524.jar nogui'

ExecReload=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "reload"\\015'

ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all"\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\\015'

Restart=on-failure
RestartSec=10s

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

:::note info
`ExecReload`などに書いてある通り、bash側からマイクラのコマンドを送ることができます。例えば、`/say from console`というコマンドをbashからマイクラに送りたいときには以下のようなコマンドで実行できます。

```
sudo -u minecraft screen -p 0 -S minecraft -X eval 'stuff "say from console"\\015'
```

これを利用すれば、`crontab -e`でマイクラのコマンドを定期実行することもできます。
以下は、[CoreProtect](https://github.com/PlayPro/CoreProtect/)の20日より前の古いデータを朝5時に削除する例です。

```:crontab -e
0 5 * * * sudo -u minecraft screen -p 0 -S minecraft -X eval 'stuff "co purge t:20d"\\015'
```

:::

.serviceファイルの変更をしたので、`daemon-reload`を行う必要があります。

```
systemctl daemon-reload
```

準備が整ったのでプラグインサーバーを起動しましょう。

```
systemctl start minecraft-server
```

`ps aux | grep minecraft`を行って、正しいjarファイルを使用してマイクラサーバーが起動していることを確認できたら成功です。

プラグインサーバーはこれで起動したので、Java版のゲームからはもうアクセスすることができます。IPアドレスをゲームに入力してアクセスしてみましょう！

:::note info

minecraft-serverはマシン起動時にプロセスが起動するようにsystemdで設定されています。マシンが起動したらマイクラサーバーも起動するということです。

```
systemctl is-enabled minecraft-server
> enabled
```
:::

## 定期再起動

安定稼働のためには夜間にプロセスを再起動させると良いでしょう。
rootユーザーでcronを設定して朝4時に再起動させます。

```
crontab -e
```

設定に以下のように記載

```crontab
0 4 * * * systemctl restart minecraft-server
```

## OP権限の付与

screenでマイクラ側のコンソールにアクセスし、最初のオペレータを生み出しましょう。
screenの詳細な使い方は別の記事を参照してください。

https://qiita.com/hnishi/items/3190f2901f88e2594a5f

マイクラのscreenセッションは`root`ユーザーではなく`minecraft`というユーザーで起動しているので、`minecraft`ユーザーにスイッチします。

```
su - minecraft
```

そしてscreenの中に入ります。`minecraft-server.service`からも分かる通り、起動screenのセッションには`minecraft`という名前がついているので、`minecraft`をアタッチします。

```
screen -r minecraft
```


:::note info
これを一行で書くこともできます。

```
sudo -u minecraft screen -r minecraft
```
:::
するとマイクラのコンソールが出てきます。ここから自分をマイクラ内の最初のオペレータに変更しましょう。仮にマイクラ内の自分のIDが`example_crafter`だとすると、以下のように入力すれば良いです。

```
op example_crafter
```

もしオペレータ権限を外したい時は、deopで解除できます。

```
deop example_crafter
```

screenから抜け出したい時は、`[Ctrl + a] + d`で抜けることができます。

## プラグインの導入

それでは実際にプラグインを入れてみましょう。

### 最初のプラグイン導入

もしあなたがマイクラサーバーを初めて作ったのならば、最初に入れて動作確認をするのは、導入がシンプルなプラグインの方が良いでしょう。
おすすめは[GSit](https://www.spigotmc.org/resources/gsit-modern-sit-seat-and-chair-lay-and-crawl-plugin-1-13-x-1-19-x.62325/)です。階段を右クリックしたら座ることができるというシンプルなプラグインで、インストールも簡単です。スクショを撮る時に座ってるとかわいいので事実上必須のプラグインですね。

`/opt/minecraft_server/plugins`に`GSit-1.4.4.jar`のような、サーバーのバージョンに合ったjarファイルをダウンロードしてきて突っ込み、サーバーを停止／起動するだけです。簡単ですね。

```
systemctl stop minecraft-server
systemctl start minecraft-server
```

動作確認は階段ブロックを作って右クリックしてみて、座れたらOKです。マイクラはF5で視点切り替えができるので確認してみましょう。

### Dynmap導入

Dynmapは言わずとしれたマップのプラグインで、ブラウザからワールドを一望できます。
Dynmapの導入で気を付けなければならないことは２つあります。

1. 追加でポートを開けないといけない
2. デフォルトの設定だとストレージを沢山消費するので場合によっては軽量化する必要がある

#### プラグインファイルの移動

上の手順でGSitを入れたように、`/opt/minecraft_server/plugins`に[dynmapのjarファイル](https://dev.bukkit.org/projects/dynmap/files)を突っ込んでsystemctlでプロセスを再起動すれば良いです。ただし、これだけではブラウザからDynmapにアクセスすることができません。理由はもちろんポートが開いておらず通信がブロックされているためです。

#### ポートを開ける

dynmapはデフォルトでTCPの8123ポートを使用します。minecraftのJava版はTCPの25565番を使用していて、統合版はUDPの19132番を使用しているので、いずれとも違います。

手順通りに作成したサーバーが今どうなっているかというと、TCPの25565番とUDPの19132番がセキュリティグループ上では開放されていて、Ubuntu上ではTCPの25565番が空いていてUDPの19132番は空いていないという状態になっています（2023/05/07現在の状態なので変更されている可能性もある）。おそらくJava版用で作成したためこうなっています。

||TCP/25565(Java版)|UDP/19132(統合版)|TCP/8123(Dynmap)|
|---|---|---|---|
|セキュリティグループ(ConoHa)|開放|開放|✕|
|ファイアウォール(Ubuntu)|開放|✕|✕|

もしGeyserMCなどを使用して統合版からもアクセスさせたいということであれば後からUDPの19132番をUbuntu上で開けないといけないので注意が必要です。今回はGeyserMCは関係ないのでスキップします。

dynmapはあくまでデフォルトで8123番になっているだけなので、80番に変更しようと思えば変更することもできます。今回はそのまま8123で行くことにします。

最初にセキュリティグループで8123を許可します。
8123を開放しているセキュリティグループはデフォルトでは存在しないので、自分で新しいセキュリティグループを作る必要があります。セキュリティ ＞ セキュリティグループから新しいセキュリティグループを画像のように作成しましょう。セキュリティグループ名と説明はわかり易ければ何でもOKです。

![conoha8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/33bff525-1c48-393d-cff0-8b26dda1fd17.png)

そしてマイクラのサーバーに、作成したセキュリティグループをアタッチします。

![conoha9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/6b618817-f823-8b6e-e5b7-dd9c4c14c39c.png)

セキュリティグループの設定が終わったら、今度はrootユーザーからUbuntuのファイアウォールの開放をする必要があります。筆者はiptablesには詳しくないので以下のコマンドが最適かはあまり自信がありません。詳しい人がいたら教えてください。

```
apt install iptables-persistent

ufw allow 8123
iptables -I INPUT 6 -m state --state NEW -p tcp --dport 8123 -j ACCEPT

netfilter-persistent save
```

ポートが適切に開いたのであれば、`http://[IPアドレス]:8123/`でブラウザからマップにアクセスができるはずです。

#### 軽量化

dynmapはそのまま使うには負荷が高くストレージも消費するので、場合によっては以下の記事などを参考に軽量化を行う必要があります。

https://shirohtoda.hatenablog.jp/entry/2021/11/06/180232

もし、マップを出力するのが不要なワールドがあるのであれば、そのマップ自体を消してしまいましょう。

```
/dynmap pause all
/dmap mapdelete [ワールド名]:[マップタイプ]

# 例
/dmap mapdelete lobby:flat
```

# おわりに

プラグインは公開サーバーを作る上で必要不可欠です。楽しいマルチプレイライフを！

# 参考

https://www.youtube.com/watch?v=pVFiOZIccP4