GCP無料VMに、Minecraft サーバを作ってみる（統合版：bedrock_server）

今回は、iOS版のマイクラから接続できるサーバを作ってみます。

# 無料枠のGCPの仮想マシン

以前の投稿で、ちょっと触れてますが、GCPは特定のスペックの仮想マシンを特定の条件で、永久無料で利用できます。
当時とは、スペックが変わりまして、少し性能がよくなりました。自分もVMのスペックを更新することで無料を継続しています。
詳しくは、下記のGCPの説明をご覧ください。

https://cloud.google.com/free/docs/gcp-free-tier/#compute

新規の導入方法は、あちこちに記事化されてますので、そちらにおまかせします(^^)

マイクラサーバはubuntuをサポートしてまして、前回構築したGCPのVMもubuntuでしたのでちょうど良かったです。
新規で導入される方は是非ubuntuで(^^;
尚、自分は外部固定IPにしています（外部固定IPもこのVMに限り無料枠ですー）が、mydns.jpみたいなので名前解決させてもいいかもです。

## ファイアウォールの設定

仮想マシンができたら（自分の場合はもとからあるVMですが・・）、その仮想マシンにマイクラのポートがつながるようにします。
デフォルトでは、
```
IPv4 supported, port: 19132
IPv6 supported, port: 19133
```
で、今回は、とりあえず そのままのつもりなので、
GCPのコンソールの「VPCネットワーク」→「ファイアウォール」で、
```
default-allow-19132
ターゲットタグ:
minecraft19132
ソースフィルタ　IP範囲:
0.0.0.0/0
プロトコルとポート:
tcp:19132
udp:19132
```
```
default-allow-19133
ターゲットタグ:
minecraft19133
ソースフィルタ　IP範囲
::/0
プロトコルとポート：
tcp:19133
udp:19133
```
で、ルールを作ります。

次に、「Compute Engine」で作ったVMを選び、ネットワークタグで、上記の２つを入れておきます。
これで、OK。

# 統合版minecraft
マイクラにはPCで遊ぶJAVA版と、iPhoneなどで遊ぶ統合版があります。
普段はiPhoneなので、統合版のサーバを導入します。

# 使うパッケージを事前にインストール

マイクラサーバは、zipで提供されるので、もしunzipが入ってなければ入れときます。
また、常駐させるために、tmuxを使いたいので、入れておきます。
```
$ sudo apt update
$ sudo apt install unzip
$ sudo apt install tmux
```

# bedrock_serverのダウンロード

PCやMacで、下記にアクセスし、対象のファイルのダウンロードURLをコピります。
https://www.minecraft.net/ja-jp/download/server/bedrock


Windows版とUbuntu版の表示がされますので、Ubuntu版のほうの「同意」をチェックして、ダウンロードボタンを右ボタンで触って、リンクをコピります。

これを、ubuntu側で、wgetでダウンロードします。

今後は、いつものように、めんどくさいっていう理由で、`sudo su`しちゃって作業してます。

```
$ sudo su
```

```
# cd
# mkdir bedrock_server
# cd bedrock_server
# wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.18.12.01.zip
```

上記のダウンロードURLは、今回の作業時点のものなので、上記の通り、最新のURLを取得して使います。
`/root/bedrock_server`に導入しています。 

展開します。
```
$ unzip bedrock-server-1.18.12.01.zip
```

# server.propertiesのカスタマイズ

自分は下記な感じにしました。

```
　# vi server.properties
```
```
#
server-name=＃＃自分のサーバ名＃＃
gamemode=creative
force-gamemode=true
difficulty=easy
allow-cheats=true
max-players=5
online-mode=true
allow-list=true
# ↑ここをtrueにして、接続できるユーザを絞る
server-port=19132
server-portv6=19133
view-distance=32
tick-distance=4
player-idle-timeout=30
max-threads=8
level-name=＃＃接続するときに表示されるレベルの名前＃＃
level-seed=
level-type=amplified
default-player-permission-level=member
texturepack-required=false
content-log-file-enabled=false
compression-threshold=1
# Allowed values: 0-65535
server-authoritative-movement=server-auth
player-movement-score-threshold=20
player-movement-action-direction-threshold=0.85
player-movement-distance-threshold=0.3
player-movement-duration-threshold-in-ms=500
correct-player-movement=false
server-authoritative-block-breaking=false
enable-command-block=true
allow-nether=true
#
```

これであってるのか、自信なしです。
統合版とJAVA版で違うみたいなんですが、よくわかんないです・・(;_;)
というわけで、プロパティは、ネット等で検索して、自分用に良い感じに設定してください。

# allow-listの設定
server.propertiesで、`allow-list=true`としましたので、`allowlist.json`に接続できるユーザを設定します。

設定には、`xuid`が必要なので、それを知るために、とりあえずserver.propertiesの`allow-list`を`false`にして、自分のiPhoneから接続してみます。
```
 # vi server.properties
```
```
・・・省略

 #allow-list=true
 allow-list=false

・・・省略
```

以下が起動コマンドです。
```
 # LD_LIBRARY_PATH=. ./bedrock_server
```

画面に下記な感じで表示されます。カーソルが点滅して入力待ち？みたいな状態で起動します。
```
 # LD_LIBRARY_PATH=. ./bedrock_server
NO LOG FILE! - setting up server logging...
[2022-02-27 11:04:25:543 INFO] Starting Server
[2022-02-27 11:04:25:543 INFO] Version 1.18.12.01
[2022-02-27 11:04:25:543 INFO] Session ID ee74ba4a-3f19-4ab1-b5e8-2e91c7d4d36d
[2022-02-27 11:04:25:543 INFO] Level Name: hogehogelevel
[2022-02-27 11:04:25:544 INFO] Game mode: 1 Creative
[2022-02-27 11:04:25:544 INFO] Difficulty: 1 EASY
[2022-02-27 11:04:25:584 INFO] opening worlds/hohehogelevel/db
[2022-02-27 11:04:26:126 INFO] IPv4 supported, port: 19132
[2022-02-27 11:04:26:126 INFO] IPv6 supported, port: 19133
[2022-02-27 11:04:26:434 INFO] Server started.
[2022-02-27 11:04:26:461 INFO] IPv4 supported, port: 49358
[2022-02-27 11:04:26:461 INFO] IPv6 supported, port: 49605
(ここでカーソル点滅)
```

ここで、iPhoneでマイクラを起動し、サインイン後、「遊ぶ」→「サーバ」と選び、一番下まで行って、サーバの追加を選ぶと下記の画面が出ますので、サーバ名と仮想マシンの外部IPを入力します。
![マイクラ接続スクショ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/4bcb478d-242c-6c12-2af3-84a53b35f896.png)

保存できたら、そのサーバに接続してみます。
![マイクラ接続スクショ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/0ed76ca9-94ff-1ea8-fbfe-dacc1cbd39c8.png)

接続がうまくいくと、サーバのコンソールに下記のように出ます。

```
[2022-02-27 11:04:43:745 INFO] Player connected: [ゲーマータグ], xuid: 9999999999999
```

上記の9999999999999の部分が接続したユーザの`xuid`です。
これをコピペしておきます。

他の接続したい人にもつないでもらって、同様に`xuid`をメモります。
`stop`コマンドで一旦サーバを止めます。
```
stop
[2022-02-27 11:08:01:763 INFO] Server stop requested.
[2022-02-27 11:08:01:812 INFO] Stopping server...
Quit correctly
# 
```


次に、`allowlist.json `を編集します。

```
 # vi allowlist.json
```

今回は、２名だけ登録したので、こんな感じ・・
```
[
    {
        "ignoresPlayerLimit": false,
        "name": "hogehogeuser1",
        "xuid": "9999999999999"
    },
    {
        "ignoresPlayerLimit": false,
        "name": "hogehogeuser2",
        "xuid": "9999999998888"
    }
]
```

server.propertiesの`allow-list`を`true`に戻して、さっきと同じように、サーバを起動して、つながるか試してみます。
```
 # LD_LIBRARY_PATH=. ./bedrock_server
```

まだ続きますので、また、`stop`コマンドで止めておきましょう。

# permissions.jsonの編集
接続したアカウントをオペレータにしたいです。
これは、permissions.json を編集するとできるようです。

```
 # vi permissions.json
```
```
[
    {
        "permission": "operator",
        "xuid": "9999999999999"
    },
    {
        "permission": "operator",
        "xuid": "9999999998888"
    }
]
```

さて、オペレータになったか、また、さっきと同じように、サーバを起動して、つながるか試してみます。
```
 # LD_LIBRARY_PATH=. ./bedrock_server
```

まだまだ続きますので、また、`stop`コマンドで止めておきましょう。

# 常時起動させたい！（バックグラウンドで動かしたい！）
上記の起動コマンドはシェルを専有しちゃうので、とても不便です。シェルが切っちゃうと、サーバも止まっちゃいます。
そこで、最初に導入しておいた`tmux`を使って、バックグラウンドでっていうか裏画面で動かしとくようにします。
起動のスクリプトを作っちゃいます。

```
　# vi brs_script.sh
```

```
#!/bin/bash
#
SESSION_NAME='bedrock'
 
LD_LIBRARY_PATH='/root/bedrock_server'
SERVICE='/root/bedrock_server/bedrock_server'
 
cd /root/bedrock_server
 
start() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
    echo "$SERVICE は起動済です。"
  else
    echo "$SERVICE 起動中・・"
    tmux new-session -d -s $SESSION_NAME
    tmux send-keys -t $SESSION_NAME:0 "LD_LIBRARY_PATH=$LD_LIBRARY_PATH $SERVICE" C-m
  fi
}
 
stop() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null; then
    echo "$SERVICE を10秒後に停止します・・"
    tmux send-keys -t $SESSION_NAME:0 "say SERVER SHUTDOWN after 10 SECONDS. Please Save..." C-m
    sleep 10
    tmux send-keys -t $SESSION_NAME:0 "stop" C-m
    sleep 10
    echo "Bedrock Server を停止します"
  else
    echo "$SERVICE は起動していません・・"
    exit
  fi
  while :
  do
    if
      pgrep -u $USERNAME -f $SERVICE > /dev/null; then
      echo "$SERVICE 停止処理中・・・"
      sleep 10
    else
      tmux kill-session -t $SESSION_NAME
      echo "$SERVICE を停止しました"
      break
    fi
  done
}
 
case "$1" in
  start) start ;;
  stop)	 stop ;;
  *)	 echo  $"Usage: $0 {start|stop}"
esac
```

実行可能にします。
```
 # chmod 755 brs_script.sh
```

動くかなぁ・・
```
 # cd /root/bedrock_server
 # ./brs_script.sh start
```

```
/root/bedrock_server/bedrock_server は起動済です
```
って出ればOK。

さて、止めてみます。
ログインしている人退出させるために、10秒待つようにしました。
```
 # ./brs_script.sh stop
```
```
/root/bedrock_server/bedrock_server を10秒後に停止します・・
Bedrock Server を停止します
/root/bedrock_server/bedrock_server を停止しました
```
で出れば止まってます。

ちなみに、
```
 # tmux ls
```
ってすると、
```
bedrock: 1 windows (created Fri Mar  4 17:22:08 2022) [80x24]
```
みたいに表示され、動いているのがわかります。
なので、さらにちなみに、
```
　# tmux a -t bedrock
```
で、セッションに入れます(アタッチ)ので、ここで、bedrockのコマンドを打てます。
さらに さらに ちなみに、セッションから抜ける（デタッチする）には`[CTRL] + [b] + [d]`です。


# 完成
めでたしめでたし