chatGPTでマイクラ(統合版)サーバのバージョンアップを半自動化してみた

このnoteでは、マイクラ(統合版)を更新するスクリプトの完成版と、うちのサーバ環境を載せてます。

chatGPTに頼むまでの背景


息子が大好きなマイクラ統合版。友達と遊びたいとのことで、AWSのEC2に自前のサーバを立ててあげました。

ところが面倒なのがバージョンアップ作業。バージョンアップの度に公式サイトからzipファイルをDLして入れ替え作業をしないといけないそうで。入替時にはマイクラサーバ停止、設定ファイル、ワールドを消さないように…仕事の合間にやるには非常に手間です。(その割にバージョンアップ頻度高めで親泣かせ)

そこで、プロンプト考えずに適当にchatGPTに投げていったら良い感じの半自動化シェルができたのでプロンプトと完成品を載せておきます。

プロンプトと出力

投げやりな依頼です。

ubuntuサーバー上にminecraft bedrock serverを運用しています。 時々、minecraftがバージョンアップするため、更新作業を自動化したいです。

Minecraft Bedrock Serverの更新作業を自動化するには、次の手順を実行することができます。更新用スクリプトの作成 更新用のスクリプトを作成します。このスクリプトは、新しいバージョンのMinecraft Bedrock Serverをダウンロードし、古いバージョンを置き換えます。また、必要に応じてサーバーの設定を更新することもできます。
例えば、以下のようなスクリプトを作成することができます。

#!/bin/bash

# 新しいバージョンのMinecraft Bedrock Serverをダウンロード
wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.17.10.04.zip

# サーバーを停止する
systemctl stop minecraft-bedrock.service

# 古いバージョンのMinecraft Bedrock Serverをバックアップする
cp -r /opt/minecraft-bedrock /opt/minecraft-bedrock-backup

# 新しいバージョンのMinecraft Bedrock Serverを展開する
unzip bedrock-server-1.17.10.04.zip -d /opt/minecraft-bedrock

# サーバーの設定を更新する
# ...

# サーバーを起動する
systemctl start minecraft-bedrock.service

お、良い感じ!すごい。
だけどこのスクリプトの問題点

  • うちの環境に合ってない

  • バージョンが固定

  • ログファイルを出していない

教えてませんからいきなり完璧なものはできませんよねと納得。

完成版 マイクラ(統合版) をバージョンアップするシェル

上記の問題点があるので1つずつ指示をして改善してできたのがこちら。追加で3往復のやり取り、製作時間10分未満、動作確認に15分。ファイル名はupdate_server.shとしました。

#!/bin/bash

# 引数で指定されたバージョンを取得する
version=$1

# 引数が指定されていない場合は終了する
if [ -z "$version" ]; then
  echo "Usage: $0 <version>"
  exit 1
fi

# 現在の日付を取得する
current_date=$(date "+%Y-%m-%d %H:%M:%S")

# シェル開始のログを書き込む
echo "Update started at $current_date" >> /opt/bedrock/update.log

# 最新バージョンのダウンロードリンクを取得する
download_link="https://minecraft.azureedge.net/bin-linux/bedrock-server-$version.zip"

# 最新バージョンのMinecraft Bedrock Serverをダウンロードする
echo "Downloading the latest version of Minecraft Bedrock Server" >> /opt/bedrock/update.log
wget "$download_link" -O bedrock-server.zip || { echo "Failed to download the latest version of Minecraft Bedrock Server" >> /opt/bedrock/update.log ; exit 1; }

# サーバーを停止する
echo "Stopping Minecraft Bedrock Server" >> /opt/bedrock/update.log
/opt/bedrock/ctrl_bedrock.sh stop || { echo "Failed to stop Minecraft Bedrock Server" >> /opt/bedrock/update.log ; exit 1; }

# 古いバージョンのMinecraft Bedrock Serverをバックアップする
backup_dir="/opt/bedrock/bedrock_backup"
backup_file="$backup_dir/bedrock-server$(date +%Y%m%d).tar.gz"
mkdir -p "$backup_dir"
echo "Backing up the current Minecraft Bedrock Server" >> /opt/bedrock/update.log
tar zcpf "$backup_file" -C /opt/bedrock bedrock-server || { echo "Failed to backup Minecraft Bedrock Server" >> /opt/bedrock/update.log ; exit 1; }

# 新しいバージョンのMinecraft Bedrock Serverを展開する
echo "Extracting the latest version of Minecraft Bedrock Server" >> /opt/bedrock/update.log
rm -rf /opt/bedrock/tmp
mkdir /opt/bedrock/tmp
unzip bedrock-server.zip -d /opt/bedrock/tmp || { echo "Failed to extract the latest version of Minecraft Bedrock Server" >> /opt/bedrock/update.log ; exit 1; }
rm /opt/bedrock/tmp/server.properties
rm /opt/bedrock/tmp/permissions.json
rm /opt/bedrock/tmp/allowlist.json

# 新しいバージョンのMinecraft Bedrock Serverをコピーする
echo "Copying the latest version of Minecraft Bedrock Server" >> /opt/bedrock/update.log
cp -r /opt/bedrock/tmp/* /opt/bedrock/bedrock-server/ || { echo "Failed to copy the latest version of Minecraft Bedrock Server" >> /opt/bedrock/update.log ; exit 1; }

# サーバーを起動する
echo "Starting Minecraft Bedrock Server" >> /opt/bedrock/update.log
/opt/bedrock/ctrl_bedrock.sh start || { echo "Failed to start Minecraft Bedrock Server" >> /opt/bedrock/update.log ; exit 1; }

# 一時ディレクトリを削除する
echo "Deleting temporary files" >> /opt/bedrock/update.log
rm -rf /opt/bedrock/tmp
rm -f /opt/bedrock/bedrock-server.zip

# シェル終了のログを書き込む
current_date=$(date "+%Y-%m-%d %H:%M:%S")
echo "Update completed at $current_date" >> /opt/bedrock/update.log

実行方法

このスクリプトを実行するには、ターミナルでスクリプトが保存されているディレクトリに移動して、以下のコマンドを実行します。

update_server.sh <version>

update_server.shはこのスクリプトのファイル名、<version>はアップデートする Minecraft Bedrock Server のバージョン番号です。

例えば、update_server.shという名前のスクリプトファイルがあり、バージョン1.17.10.02の Minecraft Bedrock Server をアップデートしたい場合は、以下のようにコマンドを実行します。

update_server.sh 1.17.10.02

なお、スクリプトファイルに実行権限がない場合は、事前に以下のコマンドで実行権限を付与しておく必要があります。

chmod +x update_server.sh

処理概要

1.引数で指定されたバージョンを取得する
2.引数が指定されていない場合は終了する
3.現在の日付を取得する
4.シェル開始のログを書き込む
5.最新バージョンのダウンロードリンクを取得する
6.最新バージョンのMinecraft Bedrock Serverをダウンロードする
7.サーバーを停止する
8.古いバージョンのMinecraft Bedrock Serverをバックアップする
9.新しいバージョンのMinecraft Bedrock Serverを展開する
10.新しいバージョンのMinecraft Bedrock Serverをコピーする
11.サーバーを起動する
12.一時ディレクトリを削除する
13.シェル終了のログを書き込む

課題や改善点

実行にあたりバージョンを調べて引数に渡さないといけないのは面倒ですね。とはいえ、マイクラの公式サイトのウェブページはcurlやwgetでアクセス禁止になっていたので、バージョンは自力で確認する必要がありました。
これくらいなら息子でもできるから良いかな、と私的には概ね満足です。

(参考情報)私の環境

AWS EC2上のubuntuサーバ
フォルダ構成は次の通り。今回作成したのはupdate_server.shです。環境差異はchatGPTにうちの環境に合わせて変更してとお願いすれば柔軟に修正してもらえますね。

$ pwd
/opt/bedrock

$ ls
bedrock-server  bedrock_backup  change_world.sh  ctrl_bedrock.sh  update.log  update_server.sh

$ ls bedrock-server
Dedicated_Server.txt          definitions                 premium_cache      valid_known_packs.json
allowlist.json                development_behavior_packs  release-notes.txt  world_templates
bedrock_server                development_resource_packs  resource_packs     worlds
bedrock_server_how_to.html    development_skin_packs      s_bedrock_server   worlds_bk
bedrock_server_symbols.debug  log                         server.properties
behavior_packs                minecraftpe                 structures
config                        permissions.json            treatments


いいなと思ったら応援しよう!