Mintest環境をIaaS（例 IBM Cloud）上で用意して使用可能にするまで

# IBM Cloudを選んだ理由
旧SoftLayer時代からのIBM Cloud利用者であると同時に、米国時間2023年7月28日のAWSの発表で、IPv4アドレスに課金されるようになるということで、今後はAWSを引き続き使いつつも、IBM Cloudを今以上に使うことになるだろうということ、そのうち、無料枠のあるAIサービスのWatson等を使った拡張ができれば良いくらいに考えました。そんな理由です。

# 今回の使用環境
IBM Cloud Virtual Server for Classicを使います。IBM Cloud Virtual Server for Classicの「一時」サーバーは、仮想サーバーをとても安く利用できるという点で、動作検証や開発機、短期的に動かすといった場合に重宝します。

< IBM Cloud Virtual Server for Classic >
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/f8309ea0-84d2-d595-7eb8-21b2fb0751f8.png)

作成した仮想サーバー
- プロファイル：2仮想CPU、4GBのRAMを選択
- OS : Ubuntu 22.04
- ストレージ：25GB（本格的に運用する場合は、25GBでは不安）
- セキュリティグループ設定で、インバウンドでSSH接続(TCP22番)とUDP30000番につながるように設定
- adduserコマンドで作業用ユーザーを作成し、 usermod -aG sudo 作成した作業用ユーザー名 を実行し、sudo を使える作業用ユーザーを作成する。（例 workuser1） 

IBM Cloud Virtual Server for VPC でも構いません。短期間に使う場合は、IBM Cloud Virtual Server for Classicを使い、長めに運用する場合は、IBM Cloud Virtual Server for VPC と使い分けると良いでしょう。IBM Cloud Virtual Server for VPCの場合は、Intel系以外にIBM zも選べることが魅力的です。
< IBM Cloud Virtual Server for VPC >
![スクリーンショット 2023-09-11 12.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/8ae9d6ee-ef40-dd31-bc74-6b514c5833b0.png)

# Mintestのセットアップ
## Minetestとは
Minecraftのようなボクセル型ゲームを運用するための「ゲームエンジン」という位置づけです。2010年に最初のバージョンがリリースされ、2023年7月現在は、バージョン 5.7.0 が最新。
2009年に登場したMineCraftと異なり、マルチプレイのためのサーバー機能が含まれていることから、Minetestは「ゲームエンジン」という言い方をしています。Minetestに付属する「Minetest Game」が、ゲーム本体。
Minetestは、オープンソースソフトウェアライセンスの「LGPLv2.1+」が適用される。オープンソースソフトウェアはビジネス利用ができますが、細かい条件等があるのでビジネス利用したい場合は、[MINETEST WikiのLicensing](https://wiki.minetest.net/Licensing)をご確認ください。「Mintest」をそのまま使って、ゲームプラットフォームとして使う分には、難しいことを考えずに気軽に使用できる。

## Minetestのインストール
Ubuntuの環境を最新の状態にする
```
sudo timedatectl set-timezone Asia/Tokyo
sudo apt update -y
sudo apt upgrade -y
```
Minetestをインストールするためのリポジトリを追加する。
```
sudo add-apt-repository ppa:minetestdevs/stable
```
次のように表示されるので、Enterキーを押す。
```
Press [ENTER] to continue or Ctrl-c to cancel.
```
Minetestをインストール
```
sudo apt update
sudo apt install -y unzip minetest
```
「Daemons using outdated libraries」の処理を求められた場合は、<Ok>に移動し、Enterキーを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/6ae91631-70e8-2c52-0a06-c99512c5bf37.png)

## カスタムコンフィグファイルの作成と適用
Minetestでは、たとえば、Fly（空を飛ぶ）機能も、初期状態では無効になっているので、カスタムコンフィグファイルで、Flyを有効にする必要があります。カスタムコンフィグファイルの作成と適用方法は次の手順になります。
### カスタムコンフィグファイルの作成
ログインしているユーザー（例 workuser1）のホームディレクトリに移動
```
cd /home/workuser1
```
Minetestのインストールで追加された、サンプルのコンフィグファイルを複製。zcat コマンドは、gz（gzip）形式のファイルの中身を表示することができる。
```
sudo zcat /usr/share/doc/minetest/minetest.conf.example.gz > minetest.conf
```
これで、Minetestをサーバーモードで起動する際に、/home/workuser1/minetest.conf を読み込ませることで、minetestの様々なオプションを利用することが可能になる。

### カスタムコンフィグファイルの編集
Ubuntuを使っているので、nano を使って、編集を行う。
```
nano minetest.conf
```
例として、Fly（空を飛ぶ）を使えるようにする。編集箇所は、次の通り。編集後、保存しておく。
#### 編集前
```
# default_privs = interact, shout
```
#### 編集後
```
# default_privs = interact, shout
default_privs = interact, shout, fly
```
### カスタムコンフィグファイルを用いた、Minetestサーバーの起動
起動時に、--configオプションを使うことで、カスタムコンフィグファイルを指定し、Minetest をサーバーモードで起動することができる。
```
minetest --server --config /home/workuser1/minetest.conf
```
起動すると、次のように表示される。Ctrl + c キーを押すことで、Minetestのサーバーモードは停止する。
```
         __.               __.                 __.
  _____ |__| ____   _____ /  |_  _____  _____ /  |_
 /     \|  |/    \ /  __ \    _\/  __ \/   __>    _\
|  Y Y  \  |   |  \   ___/|  | |   ___/\___  \|  |
|__|_|  /  |___|  /\______>  |  \______>_____/|  |
      \/ \/     \/         \/                  \/
2023-07-31 23:25:47: ACTION[Main]: World at [/home/workuser1/.minetest/worlds/world]
2023-07-31 23:25:47: ACTION[Main]: Server for gameid="minetest" listening on 0.0.0.0:30000.
```
# Minetest クライアントアプリから、Minetestサーバーに接続
## Minetest クライアントアプリのインストールと起動
Minetestの公式サイトの「[Downloads](https://www.minetest.net/downloads/)」にアクセスし、Windwos、Mac、Android 端末のいずれかのアプリをダウンロードし、インストールを行う。iPhone/iPad 向けはないので注意すること。

2023年7月現在の最新版は、Minetest 5.7.0で、Windows環境のパソコンでは、「Minetest 5.7.0 - portable, 64-bit (recommended)」をクリックして「minetest-5.7.0-win64.zip」ダウンロードする。
ダウンロード後、「minetest-5.7.0-win64.zip」を解凍し、「minetest-5.7.0-win64」フォルダが作成される。「minetest-5.7.0-win64」を開くと、同名の「minetest-5.7.0-win64」、さらにその下の「bin」に「minetest.exe」が入っているので、「minetest.exe」をダブルクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/df14345b-2d85-d345-de27-1168e1fb64a7.png)
「minetest.exe」の初回起動の場合は、「WindowsによってPCが保護されました」と表示されるので、「詳細情報」>>「実行」の順にクリックすること。少しわかりにくいが、Minetestのクライアントアプリが起動する。2回目以降のために、スタート画面等にピン留めする等しておこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/e41506f6-8471-7432-561b-e560d1ec5f0a.png)
## Minetestサーバーに接続
< Mintestクライアントアプリが起動したところ >
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/497e90fe-e2f0-460f-1f8d-20b6a593c669.png)
Minetest クライアントアプリ内の「ゲームに参加」タブをクリックし、「アドレス」にIPアドレスを入力する。このIPアドレスは、Minetestサーバーが稼働する仮想サーバーのグローバルIPを用いる。また、「ポート」にポート番号の「30000」を入力する。サイズの都合で途切れるが入力する。

< Minetestサーバーに接続するためのIPアドレスとポート番号の入力例 >
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/5357d923-9d5e-67af-7959-1b12692bfe0b.png)
「登録」をクリックする。
ユーザー作成画面が表示される。「名前」と「パスワード」を英数字で入力する。例として、名前はuser1、パスワードは8文字の英数字の組み合わせとした。入力後、「登録」をクリックする。

< user1というユーザーをMinetestサーバーに登録する画面 >
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/c123e5da-026a-c1af-5eb0-60a1230f0b9b.png)

よく見るボクセル型ゲームの画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/f5947e1e-a948-ad78-f132-56b313ed23d9.png)

キーボードの「Esc」キーを押すことで、操作方法が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/b03151e5-1ef6-3616-e39e-f8be94ddd46a.png)

「キー変更」をクリックした場合。「キャンセル」で戻れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/fd29e254-2e57-00c6-1f99-8d6ba6f5bdf0.png)

カスタムコンフィグファイルにより、Flyモードが有効になっているので、スペースキーを押すとFly状態になり上昇、左Shiftキーで下降する。Flyモード時の移動は、歩行時と同じ操作で、前進 / 後退 / 左移動 / 右移動が行われる。Flyモードの終了は、kキーを押すとFlyモードが無効化され、歩けるようになる。Flyモード無効化時は、スペースキーはジャンプになる。
再度kキーを押すと、Flyモードが有効化され、スペースキーで上昇できる。

キーボードの「Esc」キーを押した後に、「終了」をクリックすると、Minetestクライアントアプリが終了する。
MinetestクライアントアプリからMintestサーバーに再接続する場合、既にユーザー登録済みのユーザーがある場合は、名前（ユーザー名）とパスワードを入力し、「ログイン」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/5357d923-9d5e-67af-7959-1b12692bfe0b.png)

# Mintest サーバーのsystemd対応
ログインしている作業用ユーザー（例 workuser1）を用いて、Mintestサーバーを、systemctlで制御できるようにする。systemctlで制御できるようにすることで、自動起動、開始、停止、再起動を容易に制御できるようになる。
## unit定義ファイルの作成
```
sudo nano /etc/systemd/system/minetest.service
```
以下のように記述する。Minetestサーバーがカスタムコンフィグファイルを読み込んで起動するようにしている。
```
[Unit]
Description=Minetest Server
After=network.target

[Service]
Type=simple
User=workuser1
Group=workuser1
WorkingDirectory=/home/workuser1
ExecStart=/usr/bin/minetest --server --config /home/workuser1/minetest.conf
Restart=on-abort

[Install]
WantedBy=multi-user.target
```
保存する。
## Mintestサーバーの自動起動対応
次のコマンドを実行する
```
sudo systemctl enable minetest.service
```
実行結果
```
Created symlink /etc/systemd/system/multi-user.target.wants/minetest.service → /etc/systemd/system/minetest.service.
```
これで、仮想サーバーの再起動毎に、Minetestサーバーが自動起動するようになる。

## systemctlによるMinetestサーバーの起動
Mintestサーバーを起動する場合は、次のコマンドを実行する。
```
sudo systemctl start minetest.service
sudo systemctl status minetest.service
```
実行結果
```
● minetest.service - Minetest Server
     Loaded: loaded (/etc/systemd/system/minetest.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-08-01 00:29:51 JST; 6min ago
   Main PID: 23373 (minetest)
      Tasks: 6 (limit: 4636)
     Memory: 17.0M
        CPU: 1.340s
     CGroup: /system.slice/minetest.service
             mq23373 /usr/bin/minetest --server --config /home/workuser1/minetest.conf

Aug 01 00:29:51 virtualserver01 systemd[1]: Started Minetest Server.
Aug 01 00:29:51 virtualserver01 minetest[23373]: 2023-08-01 00:29:51: [Main]: Automatically selecting world at [/home/workuser1/.minet>
~~~~ 中略 ~~~~
Aug 01 00:29:51 virtualserver01 minetest[23373]: 2023-08-01 00:29:51: ACTION[Main]: Server for gameid="minetest" listening on 0.0.0>
lines 1-20/20 (END)
```
qキーを押すことで、再びコマンドを実行できるようになる。

## systemctlによるMinetestサーバーの停止
Mintestサーバーを停止する場合は、次のコマンドを実行する。
```
sudo systemctl stop minetest.service
sudo systemctl status minetest.service
```
実行結果
```
○ minetest.service - Minetest Server
     Loaded: loaded (/etc/systemd/system/minetest.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Tue 2023-08-01 00:42:30 JST; 1s ago
    Process: 23373 ExecStart=/usr/bin/minetest --server --config /home/workuser1/minetest.conf (code=exited, status=0/SUCCESS)
   Main PID: 23373 (code=exited, status=0/SUCCESS)
        CPU: 3.211s

Aug 01 00:29:51 virtualserver01 minetest[23373]: 2023-08-01 00:29:51: ACTION[Main]: World at [/home/workuser1/.minetest/worlds/world]
Aug 01 00:29:51 virtualserver01 minetest[23373]: 2023-08-01 00:29:51: ACTION[Main]: Server for gameid="minetest" listening on 0.0.0>
Aug 01 00:38:51 virtualserver01 minetest[23373]: 2023-08-01 00:38:51: ACTION[Server]: user1 [36.240.248.57] joins game. List of pla>
Aug 01 00:38:55 virtualserver01 minetest[23373]: 2023-08-01 00:38:55: ACTION[Server]: user1 leaves game. List of players:
Aug 01 00:42:30 virtualserver01 systemd[1]: Stopping Minetest Server...
Aug 01 00:42:30 virtualserver01 minetest[23373]: 2023-08-01 00:42:30: [Main]: INFO: signal_handler(): got SIGTERM, shutting down.
Aug 01 00:42:30 virtualserver01 minetest[23373]: 2023-08-01 00:42:30: ACTION[Main]: Server: Shutting down
Aug 01 00:42:30 virtualserver01 systemd[1]: minetest.service: Deactivated successfully.
Aug 01 00:42:30 virtualserver01 systemd[1]: Stopped Minetest Server.
Aug 01 00:42:30 virtualserver01 systemd[1]: minetest.service: Consumed 3.211s CPU time.
```
qキーを押すことで、再びコマンドを実行できるようになる。

## systemctlによるMinetestサーバーの停止
Mintestサーバーを再起動する場合は、次のコマンドを実行する。
```
sudo systemctl restart minetest.service
```

# 次は、modsの読み込みなど
Linux（Ubuntu 22.04）環境の仮想サーバーで、Minetestをインストールし、初期状態で無効化されている機能を有効化する「カスタムコンフィグファイル」と「systemctlコマンドによる自動起動や起動、停止、再起動の制御」についてまとめた。
次回は、ボクセル型ゲームではお馴染みの「mods」の追加方法についてまとめる。

# 実際に大学の授業でMinetest環境構築を取り入れてみた結果
Minetestは、ボクセル型ゲームエンジンという位置づけのため、ゲーム作成に興味のある学生をクラウドコンピューティングの世界に誘うツールとして使いやすい。また、Linuxの操作を学ぶきっかけにもしやすい。
Minetestは、1人でプレイするだけでなく、Minetestサーバーに複数のユーザーが同時接続できるため、チームビルディングのようなコラボレーション能力を高めるような使い方もできる。

# 参考資料
MINETEST Wiki : https://wiki.minetest.net/Main_Page