MinetestGameサーバをdockerコンテナで構築する

### 背景・目的
自作サーバ仮想化で、収支計算、開発環境を構築してきましたが、新たな機能を追加したいと思うようになりました。
また、妻がMinecraftに最近興味を示し始めたことで、ゲームが出来たらストレス解消になるのではと思いました。

そこで、Minecraftのオープンソース版（？）であるminetest game（以降minetestと記載）の構築をしようと思います。

Minecraftはmicrosoftアカウントと製品購入が必須です。
これまでの活動として無料利用というコンセプトは崩したくないため、OSS版がないかを調べたところ、Github上にminetestというサンドボックスゲームが使えるということがわかりました。
Minetest専用クライアントをインストールし、サーバ上にMinetestをインストールすれば使えそうです。

https://note.com/ueponx/n/n1897653f1056

今回、自分好みにカスタマイズできるminetest環境を構築することにしました。
ただし、セキュリティ脆弱性は十分考慮の上利用するよう注意が必要のため、脆弱性情報（CVE）も事前確認しながら進める必要があります。

----

### 前提
* docker-composeで構築します。
低スペックで、シングルプレイで利用するならゲーミングPCを使わなくても良いため、仮想サーバを搭載したノートPC上で稼働させることを前提とします。

* アーキテクチャは下記とします。
   * Minetestクライアント→SSHポートフォワーディング→Minetestコンテナ
   * ゲーム中断・再開ができるよう、データはVirtual Machine上の仮想ディスク（/var領域）に保管


----

### 実施内容
* minetestのクライアントツールのインストール

以下のサイトでダウンロードが可能ですので、ダウンロードし、zipファイルを任意フォルダに展開します。

https://www.minetest.net/downloads/



ダウンロード時の注意点として、5.6.0未満は
情報を取得される、情報を改ざんされる、およびサービス運用妨害 (DoS) 状態にされる可能性があるという記載がCVEで公開されているため、
最新版5.8.0をダウンロードしています。

https://jvndb.jvn.jp/ja/contents/2022/JVNDB-2022-014956.html

https://jvndb.jvn.jp/ja/contents/2022/JVNDB-2022-004489.html


https://qiita.com/kolinz/items/ef7a22a73def7f860758
→minetestのクライアントインストール。

#### Github上のdocker imageをpullする
* 参考

https://github.com/linuxserver/docker-minetest/tree/5.8.0-ls139

```
[root@t_kyn040 minecraftcompose]# docker pull lscr.io/linuxserver/minetest:5.8.0-ls139
5.8.0-ls139: Pulling from linuxserver/minetest

7d799789a204: Pulling fs layer 
2298c655b51e: Pulling fs layer 
037ea017dcd2: Pulling fs layer 
d63427398e66: Pulling fs layer 
5bc242145922: Pulling fs layer 
36a2b6ebeb4c: Pulling fs layer 
74a25c9f8e57: Pulling fs layer 
5bc242145922: Waiting 
36a2b6ebeb4c: Waiting 
74a25c9f8e57: Waiting 
d63427398e66: Waiting 
～～～長いので省略～～～
74a25c9f8e57: Pull complete Digest: sha256:3ee96cb1949f77779d2fc322053b353796fa512042aea607a416f9f3ef865c34
Status: Downloaded newer image for lscr.io/linuxserver/minetest:5.8.0-ls139
lscr.io/linuxserver/minetest:5.8.0-ls139
[root@t_kyn040 minecraftcompose]# 
```

#### minetestのdockerコンテナを作成
* ポートは必要に応じてカスタマイズ（今回はデフォルト）
* ほかに操作許可する設定は好みに合わせて変更する。
```
[root@t_kyn040 minecraftcompose]# cat docker-compose.yml
version: '3.3'

services:
  minetest:
    image: lscr.io/linuxserver/minetest:5.8.0-ls139
    container_name: minetest
    environment:
      - PUID=＜ユーザ秘密！＞
      - PGID=＜グループ秘密！＞
      - TZ=Etc/UTC
      - "CLI_ARGS=--gameid minetest_game --port 30000"
    volumes:
      - /var/mc_data/config:/config/.minetest
    ports:
      - 30000:30000/udp
    restart: unless-stopped


[root@t_kyn040 minecraftcompose]# 
```
* ゲームはdevtestで簡素なものしかないので、minetestのgamesを入れるとよいでしょう。
https://github.com/minetest/minetest_game

* コンテナを作成する
dockerComposeで起動します。
```
docker-compose up -d
```

#### サーバのSSHポートフォワーディングをします。
* teratermかSSHコマンドで行います。今回はTeratermから
* SSH転送→SSHポート転送の画面になるので、追加を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/761e914c-8e80-1a21-82f9-f8756af38170.png)

* Minetestへ転送するためのポートを設定し、OKを押し、追加します。
（※SSHの制限はしましょう。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/4eb404d3-8d61-a9f1-9296-abd8ea2bf1e4.png)

* 接続できたらゲームプレイができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/267e41df-0b6d-1df0-93fb-8156cc87f622.png)

### ログイン後
* 構築は割とスムーズにできましたが、家を作るほうに時間がかかりました。。。
![screenshot_20240324_233434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/1b965292-461c-75c9-1e32-80f90c8d2f85.png)

### コンテナを停止・起動する
コンテナを中断したい場合、下記コマンドで停止します。
```
docker stop <コンテナID>
docker stop minetest
```
データは保存されるので、再び起動すると停止した際にいた場所から再開します
```
docker start <コンテナID>
docker start minetest
```

----

### あとがき
構築はできましたが、課題がたくさん出てきました。
* 妻レビュー
ゲームをプレイしたものの、結局すぐ中断…
  * 「こんなのできるんだ！すごい！」という第一印象
  * しかし、10分だけプレイしてくれてからはPCのキーボード操作なのでやりづらい
  * 構築した私がゲームに夢中な姿を見て、廃人になるからもうやめてと悲しいコメント
* キャラクターやネザーゲートがない
キャラクターやネザーゲートの追加はmobs追加が必要…
    * 動物
    * 村人
    * ゾンビ、クリーパーなどのモンスター
    * ネザーゲート

* イメージやコンテナの状態をバックアップする運用がほしいです。
運用イメージは下記の通り
    * イメージの保存、ロード
        * docker save <imageID> | gzip > XXXXXXXX.tar.gz
        * docker load <imageID> < XXXXXXXX.tar.gz
    * コンテナ状態のエクスポート、インポート
        * docker export <コンテナID> > XXXXXXXX.tar
        * docker import <コンテナID> < XXXXXXXX.tar
* CVEを調べていくのは時間がかかるため、脆弱性診断ツールが必要
    * Trivyでコンテナイメージに対する脆弱性診断が可能
    * https://engineering.nifty.co.jp/blog/14208
* 上記の改善や、性能測定も今後時間に余裕ができれば確認しようと思います。
### 謝辞
Minetest構築を進めるにあたって、本記事が参考になりました。感謝申し上げます。

https://qiita.com/kolinz/items/ef7a22a73def7f860758

https://note.com/ueponx/n/n1897653f1056