はじめに
マイクラ統合版のマルチサーバーを運用していて、この仕様に憤りを感じることは少なくないと思います。Java版とは異なり、統合版は自動でホスト側のバージョンがアップデートされるうえに、ホスト側とサーバー側のバージョンが異なるとエラーが発生するため、この問題はサーバー運用においてきわめて深刻です。
もちろん、毎回公式サイトからZIPを落としてきて手作業でファイルを上書きすれば問題は解決します。しかし、これは時間の無駄であることは言うに及びません。
ならば、サーバー側も自動で最新バージョンに追従させる仕組みを作ってしまえばいいだけの話です。今回は、Bedrock Dedicated Serverのアップデート作業を完全に自動化するBashスクリプトの作り方と使い方を解説します。
- 既に統合版のサーバーがあることを前提とします
統合版サーバーの作り方については、まずこちらの記事をご覧ください。
そもそも
統合版のサーバー運用において最大のネックとなるのが、このクライアントとサーバーのバージョン不一致です。前述したように、スマホや家庭用ゲーム機のプレイヤーは、アプリの自動更新によって自動的に最新バージョンへ引き上げられます。一方で公式のBDSには自動アップデート機能などという気が利いたものは実装されておらず、管理者が手動でバイナリを差し替えるまで古いバージョンのまま放置されます。 結果として「サーバーが古くて接続できません」というエラーが頻発し、管理者は深夜だろうが仕事中だろうがサーバーのメンテを迫られるわけです。システムで解決できる部分はしてしまうのが賢明ですよね?
バージョン情報を調べる方法
自動化するにあたって最初にぶつかる壁が「最新バージョンのダウンロードURLをどうやって機械的に取得するか」という問題です。 公式サイトのHTMLをスクレイピングしてURLを調べる手法も考えられますが、サイトのDOM構造が変わった瞬間にスクリプトが使えなくなるので、筋が悪すぎます。 そこで頼りになるのが、オープンソースコミュニティである「Bedrock-OSS」が提供しているAPIです。具体的には:
https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/versions.json
というURLを叩くことで、現在の安定版のバージョン番号がクリーンなJSON形式で返ってきます。
要は、このJSONを curl と jq でパースすることで、安全に最新バイナリの直リンクを生成できるというわけです。
スクリプト
前置きはこれくらいにして、実際に私が運用している自動アップデート用のBashスクリプトを公開します。 処理の流れとしては、最新バージョンのチェックを行い、差分があれば一時ディレクトリにダウンロードして解凍、サーバーを停止してフルバックアップを取得したのち、設定ファイルを避けてバイナリとリソースだけを安全に上書きし、再起動させるという構成にしています。
#設定
MC_DIR="/home/ubuntu/crafters_guild_server" # サーバーのディレクトリ
SERVICE_NAME="bedrock.service" # systemdのサービス名
BACKUP_DIR="/home/ubuntu/server_backups" # バックアップ保存先
VERSION_FILE="$MC_DIR/current_version.txt" # 現在のバージョンを記録するファイル
#Bedrock-OSSから最新バージョン情報を取得
LATEST_VERSION=$(curl -s https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/versions.json | jq -r '.linux.stable')
DOWNLOAD_URL=$(curl -s https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/linux/${LATEST_VERSION}.json | jq -r '.download_url')
if [ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" == "null" ]; then
echo "Error: 最新バージョンの取得に失敗しました。"
exit 1
fi
echo "最新バージョン: $LATEST_VERSION"
#バージョンチェック
if [ -f "$VERSION_FILE" ]; then
CURRENT_VERSION=$(cat "$VERSION_FILE")
else
CURRENT_VERSION="none"
fi
if [ "$LATEST_VERSION" == "$CURRENT_VERSION" ]; then
echo "既に最新バージョンです。アップデートは不要です。"
exit 0
fi
echo "アップデートを開始します ($CURRENT_VERSION -> $LATEST_VERSION)..."
#ダウンロードと準備
TEMP_DIR=$(mktemp -d)
echo "ダウンロード中..."
wget -q "$DOWNLOAD_URL" -O "$TEMP_DIR/server.zip"
echo "解凍中..."
unzip -q "$TEMP_DIR/server.zip" -d "$TEMP_DIR/extracted"
#サーバー停止
echo "サーバーを停止します..."
sudo systemctl stop $SERVICE_NAME
mkdir -p "$BACKUP_DIR"
DATE=$(date +%Y%m%d_%H%M%S)
echo "バックアップを作成中..."
tar -czf "$BACKUP_DIR/pre_update_$DATE.tar.gz" -C "$MC_DIR" .
#ファイルの更新
echo "ファイルを更新中..."
cp -f "$TEMP_DIR/extracted/bedrock_server" "$MC_DIR/"
cp -f "$TEMP_DIR/extracted/bedrock_server_symbols.debug" "$MC_DIR/" 2>/dev/null
cp -rf "$TEMP_DIR/extracted/definitions" "$MC_DIR/"
cp -rf "$TEMP_DIR/extracted/resource_packs" "$MC_DIR/"
cp -rf "$TEMP_DIR/extracted/behavior_packs" "$MC_DIR/"
if [ -d "$TEMP_DIR/extracted/lib" ]; then
cp -rf "$TEMP_DIR/extracted/lib" "$MC_DIR/"
fi
#権限の修正
chown -R root:root "$MC_DIR"
chmod +x "$MC_DIR/bedrock_server"
#バージョン情報の更新
echo "$LATEST_VERSION" > "$VERSION_FILE"
echo "サーバーを起動します..."
sudo systemctl start $SERVICE_NAME
rm -rf "$TEMP_DIR"
echo "アップデート完了!"
find "$BACKUP_DIR" -name "*.tar.gz" -type f -mtime +7 -delete
echo "7日以上前の古いバックアップを削除しました。"
使い方
まず、上記のコードを update_bedrock.sh などの名前でサーバー上の適当な場所に保存しましょう。cdコマンドで適当なフォルダに移動した後、
nano update_bedrock.sh
などと実行することでエディタ画面に入りますので、その画面に上記を貼り付けた後、指示に従って「Ctrl+X → Y → Enter」を入力すればOKです。
その後、
chmod +x update_bedrock.sh
を実行して実行権限を付与します。(ファイル名は各自変えてください)
このスクリプトですが、冒頭のディレクトリパスやサービス名は、ご自身の環境に合わせて必ず書き換えてください。
手動でアップデートしたい時は、単純にこのシェルスクリプトを直接実行するだけで全ての作業が完了します。つまり、cdコマンドでこのshファイルがある場所に移動して、
./update_bedrock.sh
等を実行するだけです。
真の自動化を目指すなら cron に登録するのがベストです。これを使えば、指定の時刻に自動でファイルの実行が可能になります。まず、以下のコマンドで設定ファイルを開きましょう:
crontab -e
これを実行すると、エディタが開くはずです。crontabにおいては、実行したいスケジュールとコマンドを順に記述します。
記述のルールは至ってシンプルで、左から順に「分」「時」「日」「月」「曜日」を指定し、最後に半角スペースを空けて実行するコマンドを並べます。例えば毎日深夜3時にこのスクリプトを実行したい場合は、以下のように書けばOKです:
*/3 * * * * /home/ubuntu/minecraft/update_bedrock.sh > /home/ubuntu/minecraft/update_bedrock.log 2>&1
- ここでは絶対パスを指定する必要があります。パスとファイル名は各自変えましょう
おしまい
手動でのファイルコピーやバックアップといった作業は、スクリプトを作って自動化するべきです。
バージョン更新にお困りの方は、ぜひご自身の環境に導入してみてください!