はじめに
Java版のサーバ設置に関してはあちらこちらに参考になる記事があるのですが、こと統合版に関してはあまり情報がなく、手探りでサーバの設定をしなくてはなりません。
そこで今後統合版のサーバを自宅サーバやレンタルVPS上に設置してみたいという方のために作業の記録を残しておきます。
私はRealmsからの乗り換えとなります。毎月1000円でメンテフリーでマルチができるのは魅力ですが、マップが拡大するにつれて処理能力の限界を感じて来たり、レンダリング距離が短く高スペックなPCがあっても生かせなかったり、カスタマイズ性にも乏しいので1年ほど遊んでいるとなんだか物足りなくなってきたので自前でサーバ設置を考え始めました。
本記事の執筆にあたり様々なネット記事を参考にしました。特にKagoya VPSさんが出しているJava版サーバ設置方法の記事とほとんど同じ方法で統合版もサーバを建てることができます。
前提
サーバはKagoya VPSというレンタルVPSを利用します。プランは3コア/2GB RAMの月1000円ほどのものを選んでいますが、それ以上でもそれ以下でもサーバ設置に当たっては問題ありません。
Kagoya VPS上のOSはUbuntu 20.04 LTSです。
また各種操作を行うにあたり、ssh接続ができたりnanoやvim等のエディタが使えることを前提として話を進めて行きます。
やりたいこと
- 公式サーバをインストールして走らせる
-
screen
で操作できるように(後述)
-
- 毎日3回バックアップを取る
- 最大5個のバージョンを残しておく
- 毎月1回アーカイブを残す
- Minecraft Overviewerで地図を作るため
- 毎日1回再起動する
- 再起動にあたり自動でbedrock_serverも起動したい
参考程度に、ディレクトリ構成図を載せておきます。
/home/minecraft
├── backups/
│ ├── annual/
│ ├── backup.sh*
├── bedrock/
│ ├── 1.17.31.01/
│ │ ├── bedrock_server*
│ │ ├── permissions.json
│ │ ├── server.properties
│ │ ├── worlds/
│ ├── bedrock-server-1.17.31.01.zip
│ └── update.sh*
├── reboot.sh*
├── run.sh*
I. サーバを設置する
最初に必要なパッケージがいくつかあるのでインストールしておきましょう。
おそらく一つだけで大丈夫ですが、適宜root
でインストールしておいてください。
~ $ sudo apt install iptables-persistent # ポートを常時開放するためのパッケージ
次にサーバ管理を行うためのユーザminecraft
を作りましょう。
今後の操作は特記ない限りすべてユーザminecraft
から行います。
~ $ sudo adduser minecraft
~ $ su - minecraft
続いてMojangの公式サイトから統合版サーバをVPSにダウンロードして展開します。
下記ページにアクセスしてLinux用サーバのダウンロードリンクを取得してください。
作業用フォルダbedrock/
を作ってそこにダウンロード、さらにその下にサブフォルダ1.17.31.01/
を作って展開します。
サブフォルダを作るのは、サーバのアップデートの際に便利という理由です。
サブフォルダの名称は便宜上バージョンを付けていますが、必ずこの通りにはしなくて大丈夫です。
~ $ mkdir bedrock/
~ $ cd bedrock/
~/bedrock/ $ wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.17.31.01.zip
~/bedrock/ $ unzip bedrock-server* -d 1.17.31.01/
既にワールドデータがある場合は、scp
などの方法でサーバに保存し、~/bedrock/1.17.31.01/worlds
内に配置してください。
続いてポート開放をします。VPSの場合であれば以下で終わると思いますが、自宅サーバの場合は別途ルータなどのポート開放が必要になる場合があります。
iptables -A INPUT -p tcp --dport 19132 -j ACCEPT # ポート19132を開放
iptables -A INPUT -p tcp --sport 19132 -j ACCEPT # 統合版の初期値なので、他のポートでも問題ないです
これでサーバの設定にひと段落ついたので試運転します。
以下のコマンドでホストを動かしましょう。
~/bedrock/ $ cd 1.17.31.01/
~/bedrock/1.17.31.01/ $ ./bedrock_server
クライアント側でこのように表示されればOKです。
ただこのままではbedrock_server
を起動したsshが閉じてしまうとbedrock_server
の諸操作ができなくなってしまいます。
次項でこれを改善します。
II. screen
でホストを走らせる
screen
とは、仮想環境のようなものです。複数のセッションを一括管理できるものです。
bedrock_server
を起動するには以下のようなコマンドを打てばいいのですが、毎回タイプするのは面倒です。
cd ~/bedrock/1.17.31.01; screen -dm -S minecraft /bin/bash -c ~/bedrock/1.17.31.01/bedrock_server
そこでホームディレクトリにrun.sh
というスクリプトを書いて配置します。
#!/bin/bash
cd ~/bedrock/1.17.31.01/
screen -dm -S minecraft /bin/bash -c ~/bedrock/1.17.31.01/bedrock_server
今後スクリプトを追加する際は同様に実行権限付与を行ってください。
~ $ chmod 755 run.sh
実際にこのスクリプトを走らせてみます。
~ $ ./run.sh
このままだと画面には何も変化ありません。
screen
コマンドの詳しい使い方は他の方の解説に譲るとして、bedrock_server
に入って何か操作するときは以下のコマンドを実行します。
~ $ screen -r minecraft # minecraftという名前のセッションに接続
[2021-09-27 07:30:55:803 INFO] Level Name: OurCity
[2021-09-27 07:30:55:804 ERROR] xuid or permission missing from permissions file: permissions.json
(略)
title @a title hello # プレイヤーの画面にhelloと表示できる
op Steve # プレイヤーSteveにOperator権限を付与
stop # bedrock_server終了
screen
はCtrl-a d
でセッションを一旦閉じることができます。閉じたセッションを開きなおすにはscreen -r <セッション名 or ID>
と覚えておきましょう。
III. 再起動を定期的に行う
毎日1回サーバの再起動を行い、再起動前にプレイヤーにアナウンスして再起動後は自動的にbedrock_server
を起動するようにします。
ホームディレクトリに以下のスクリプトを配置します。
#!/bin/bash
# tellrawコマンドの表示プリセット
STR_1="tellraw @a {\"rawtext\":[{\"text\":\"[SERVER] Reboot in "
STR_2=" sec\"}]}\\015"
STR_3=" min\"}]}\\015"
# 再起動する旨をプレイヤーに告知
screen -S minecraft -p 0 -X stuff 'tellraw @a {"rawtext":[{"text":"[SERVER] The server will be rebooted in 10 min"}]}\015'
# 9分前から1分前まで2分刻みでカウントダウン
for i in {10..2}; do
sleep 1m
screen -S minecraft -p 0 -X stuff "$STR_1$i$STR_3"
done
# 60秒前から20秒前まで10秒刻みでカウントダウン
for i in 60 50 40 30 20; do
sleep 10s
screen -S minecraft -p 0 -X stuff "$STR_1$i$STR_2"
done
# 10秒前から1秒刻みでカウントダウン
for i in {10..0}; do
sleep 1s
screen -S minecraft -p 0 -X stuff "$STR_1$i$STR_2"
done
# bedrock_serverを終了
screen -S minecraft -p 0 -X stuff 'stop\015'
カウントダウンの方法はもう少しやりようがあった気もしますが、まあだいたいでいいかなと思います。
このスクリプトを自動実行するように設定をしておきます。
~ $ crontab -e
@reboot /home/minecraft/run.sh # 再起動した後は必ずrun.shを走らせる
13 7 * * * /home/minecraft/run.sh # 万が一再起動にトラブルがあった場合に7:13にrun.shを走らせる
またサーバ自体の再起動も行いたいので、root
ユーザにログインして同様にスケジュールを組みます。
root:~ $ crontab -e
0 7 * * * sudo shutdown -r now
IV. バックアップを定期的に行う
bedrock_server
には標準でバックアップ機能がついているのですが、バージョン管理ができないなどあまり便利とは言えないものなので、ワールドデータを圧縮してバックアップ用フォルダに保存する方法を考えます。
先述の通り、万が一の復元用のバックアップは1日3回、また地図を作成するためのデータは月1回生成します。
/home/minecraft
├── backups/ # 毎日バックアップ用フォルダ
│ ├── annual/ # 毎月バックアップ用フォルダ
| ├── backup.sh # バックアップスクリプト
├── bedrock/
│ ├── 1.17.31.01/
│ │ ├── worlds/ # ワールドデータ
バックアップを行うスクリプトは以下の通りです。
#!/bin/bash
# バックアップ元
TARGET_DIR=/home/minecraft/bedrock/1.17.31.01/worlds/OurCity/
# バックアップ先
BACKUP_DIR=/home/minecraft/backups/`date +%Y-%m-%d_%H:%M:%S`
# 毎月バックアップ先
ANNUAL_DIR=/home/minecraft/backups/annual/`date +%Y-%m`
# 毎日バックアップの保管数
NUM_GENS=5
# コマンドライン引数からバックアップモードを指定
# 0 : 毎日バックアップ
# 1 : 毎月バックアップ
BACKUP_MODE=$1
# 古いバックアップを消去する関数
delete_file () {
CNT=0
for file in `ls -1t *zip`
do
CNT=$((CNT+1))
if [ $CNT -le $NUM_GENS ]; then
continue
fi
eval "rm ${file}"
done
}
# zipファイルを作成する関数
make_zip () {
zip ${1} -r ${2}
}
# BACKUP_MODEの判定
if [ $BACKUP_MODE -eq 0 ]; then
make_zip $BACKUP_DIR $TARGET_DIR
delete_file
elif [ $BACKUP_MODE -eq 1 ]; then
make_zip $ANNUAL_DIR $TARGET_DIR
fi
このコマンドを定期的に実行させるためにcrontab
を編集します。
~ $ crontab -e
...
# 以下追加行
0 3 * * * /home/minecraft/backups/backup.sh 0 # 毎日AM3:00に実行
0 12 * * * /home/minecraft/backups/backup.sh 0 # 毎日PM12:00に実行
0 19 * * * /home/minecraft/backups/backup.sh 0 # 毎日PM19:00に実行
0 3 * * * /home/minecraft/backups/backup.sh 1 # 毎月1日に実行
さいごに
今回は統合版Minecraftのサーバ設置の一部始終をお伝えいたしました。
お伝えした内容で以下のことができるようになりました。
- 公式サーバをインストールして走らせる
-
screen
で操作できるように(後述)
-
- 毎日3回バックアップを取る
- 最大5個のバージョンを残しておく
- 毎月1回アーカイブを残す
- Minecraft Overviewerで地図を作るため
- 毎日1回再起動する
- 再起動にあたり自動でbedrock_serverも起動したい
まだ粗削りな部分がありますので、今後もサーバに手を加えつつこちらのページも更新していきます。