Oracle Cloud (OCI)の無料枠でマインクラフトサーバーを建てて運用して、ワールドデータもバックアップする

子供とマイクラをやり始めて、時間を合わせずに進められたほうが便利なのでサーバーを建てることにした。

OCI側の用意

armを使いたかったけど全然空きがない。AMDでも動くことは動くのでこちらにする。

bedrock serverのインストールから起動まで

インストール

sshでログインして作業する。

mkdir minecraft
cd minecraft/
curl -O https://minecraft.azureedge.net/bin-linux/bedrock-server-1.20.51.01.zip

sudo apt install unzip
unzip bedrock-server-1.20.51.01.zip -d bedrock-server-1.20.51.01

ln -s bedrock-server-1.20.51.01 latest

バージョンアップもあるので、シンボリックリンクを作成している。これで、 /home/ubuntu/minecraft/latest がサーバー一式のフォルダーになった。

iptables

iptablesでポートを開ける。上記の通り、OCI側でセキュリティグループでの許可も設定済みなので、これでクライアントからサーバーへの接続ができる。

sudo ufw allow 19132/udp
sudo ufw reload
sudo shutdown -r now

reloadしたら反映されるはずなのに反映されず。とりあえずでrebootしたら、なんか接続できた。ヨシ!

起動の確認

cd latest
LD_LIBRARY_PATH=. ./bedrock_server

こういうのが出ていたら成功。

NO LOG FILE! - setting up server logging...
[2024-05-06 03:41:38:889 INFO] Starting Server
[2024-05-06 03:41:38:889 INFO] Version: 1.20.51.01
[2024-05-06 03:41:38:889 INFO] Session ID: 577dbb5d-08f2-4fa1-9986-136465ee936c
[2024-05-06 03:41:38:889 INFO] Build ID: 24130113
[2024-05-06 03:41:38:889 INFO] Branch: r/20_u8
[2024-05-06 03:41:38:889 INFO] Commit ID: a9081c5429038dcf3f26269f7351d89f75cfb331
[2024-05-06 03:41:38:889 INFO] Configuration: Publish
[2024-05-06 03:41:38:890 INFO] Level Name: foobar
[2024-05-06 03:41:38:892 INFO] No CDN config file found for dedicated server
[2024-05-06 03:41:38:892 INFO] Game mode: 0 Survival
[2024-05-06 03:41:38:892 INFO] Difficulty: 1 EASY
[2024-05-06 03:41:38:893 INFO] Content logging to console is enabled.
[2024-05-06 03:41:39:220 INFO] Opening level 'worlds/xxxxxxxx/db'
[2024-05-06 03:41:44:228 INFO] IPv4 supported, port: 19132: Used for gameplay and LAN discovery
[2024-05-06 03:41:44:228 INFO] IPv6 supported, port: 19133: Used for gameplay
[2024-05-06 03:41:44:243 INFO] Server started.
[2024-05-06 03:41:44:243 INFO] ================ TELEMETRY MESSAGE ===================
[2024-05-06 03:41:44:243 INFO] Server Telemetry is currently not enabled.
[2024-05-06 03:41:44:243 INFO] Enabling this telemetry helps us improve the game.
[2024-05-06 03:41:44:243 INFO]
[2024-05-06 03:41:44:243 INFO] To enable this feature, add the line 'emit-server-telemetry=true'
[2024-05-06 03:41:44:243 INFO] to the server.properties file in the handheld/src-server directory
[2024-05-06 03:41:44:243 INFO] ======================================================

こういうのが出ていたら失敗。メッセージを読んで修正する。 これはカレントワーキングディレクトリが bedrock-server-1.20.51.01 じゃなかった。

NO LOG FILE! - setting up server logging...
[2024-05-06 03:41:05:497 INFO] Starting Server
[2024-05-06 03:41:05:497 INFO] Version: 1.20.51.01
[2024-05-06 03:41:05:497 INFO] Session ID: 17a5ab6b-13b2-49df-886a-c867fb5329d9
[2024-05-06 03:41:05:497 INFO] Build ID: 24130113
[2024-05-06 03:41:05:497 INFO] Branch: r/20_u8
[2024-05-06 03:41:05:497 INFO] Commit ID: a9081c5429038dcf3f26269f7351d89f75cfb331
[2024-05-06 03:41:05:497 INFO] Configuration: Publish
[2024-05-06 03:41:05:497 ERROR] Error reading file: server.properties
[2024-05-06 03:41:05:497 ERROR] Could not load server.properties file, Please check if the current working directory is the same as the bedrock_server directory.
[2024-05-06 03:41:05:497 INFO] Server stop requested.

ファイル編集

接続許可ユーザーやサーバー設定などの各種ファイルを希望に応じて編集。

vim allowlist.json
vim permissions.json
vim server.properties

systemdでサーバー起動

OCIのインスタンスはしばらく使ってないとシャットダウンされるみたい。サーバー起動時に自動で起動してくれる方が便利なのでsystemdを使う。

/etc/systemd/system/minecraft_server.service にファイルを作り、以下の内容を記述。

[Unit]
Description=Minecraft bedrock server
After=network.target

[Service]
User=ubuntu
Group=ubuntu
Type=simple
WorkingDirectory=/home/ubuntu/minecraft
Environment=LD_LIBRARY_PATH=.
ExecStart=/home/ubuntu/minecraft/bedrock-server
Restart=always

[Install]
WantedBy=multi-user.target

以下で設定ファイルを読み込み、有効化、状況確認、起動をする。

sudo systemctl daemon-reload
sudo systemctl enable minecraft_server
sudo systemctl status minecraft_server
sudo systemctl start minecraft_server
sudo systemctl status minecraft_server

最後のstatus確認で、 Active: active (running) と出ていればOK.

● minecraft_server.service - Minecraft bedrock server
     Loaded: loaded (/etc/systemd/system/minecraft_server.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-05-06 03:46:46 UTC; 49min ago
   Main PID: 1141547 (bedrock_server)
      Tasks: 14 (limit: 1053)
     Memory: 129.8M
        CPU: 1min 22.012s
     CGroup: /system.slice/minecraft_server.service
             └─1141547 /home/ubuntu/minecraft/latest/bedrock_server

activeじゃなかったら、次のコマンドでログが確認できるので何が起きたか確認して修正する。

journalctl -xeu minecraft_server

既存のワールドデータの展開

Windowsからのデータ移行なので、「世界をエクスポート」からエクスポートしたファイルをサーバーに持っていき、worldsフォルダー配下に置けばOK。

unzip foobar.mcworld -d foobar

ワールドデータのバックアップ

OCIのオブジェクトストレージに置く。

instance principalというのを使うとAWSでのIAMロールっぽいのが使える。

  • ダイナミックグループ作成
  • ポリシー作成

ocicliをインストール

bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
oci -v
oci setup config

疎通確認

oci os ns get --auth instance_principal
OCI_CLI_AUTH=instance_principal
oci os object put --bucket-name bucket-20240117-2254 --file fuga.txt
export OCI_CLI_AUTH=instance_principal

スクリプトにまとめる

/home/ubuntu/backup.sh

mkdir -p /home/ubuntu/minecraft_worlds_backup
filename=/home/ubuntu/minecraft_worlds_backup/world_backup_$(date '+%Y%m%d-%H%M%S').tar.gz
cd /home/ubuntu/minecraft/worlds/
tar -czvf $filename foobar

export OCI_CLI_AUTH=instance_principal
oci os object put --bucket-name bucket-20240117-2254 --file $filename

バックアップのタイマー起動

これもsystemdで管理する。

/etc/systemd/system/minecraft_backup.service というファイルを作り、以下を記述。

[Unit]
Description=Minecraft backup

[Service]
User=ubuntu
Group=ubuntu
Type=oneshot
WorkingDirectory=/home/ubuntu
ExecStart=/home/ubuntu/backup.sh

/etc/systemd/system/minecraft_backup.timer というタイマー設定のファイルも作成。時間はなんでもいい。一日一回の起動。

[Unit]
Description=Minecraft backup timer

[Timer]
OnCalendar=16:00

[Install]
WantedBy=timers.target

サーバーと同じで、以下で読み込み、有効化、状況確認、起動をする。

sudo systemctl daemon-reload
sudo systemctl enable minecraft_backup.timer
sudo systemctl status minecraft_backup.timer
sudo systemctl start minecraft_backup.timer
sudo systemctl status minecraft_backup.timer

ジャーナルも見ておく。

journalctl -xeu minecraft_backup.timer

以下でタイマーの起動状況が確認できる。

systemctl list-timers
NEXT                        LEFT               LAST                        PASSED       UNIT                           ACTIVATES
Mon 2024-05-06 09:30:04 UTC 4h 39min left      Mon 2024-05-06 03:37:51 UTC 1h 12min ago fwupd-refresh.timer            fwupd-refresh.service
Mon 2024-05-06 12:08:22 UTC 7h left            Mon 2024-05-06 03:37:04 UTC 1h 13min ago motd-news.timer                motd-news.service
Mon 2024-05-06 16:05:06 UTC 11h left           Sun 2024-05-05 16:09:15 UTC 12h ago      minecraft_backup.timer         minecraft_backup.service
Tue 2024-05-07 00:00:00 UTC 19h left           Mon 2024-05-06 00:00:17 UTC 4h 49min ago dpkg-db-backup.timer           dpkg-db-backup.service
Tue 2024-05-07 00:00:00 UTC 19h left           Mon 2024-05-06 00:00:17 UTC 4h 49min ago logrotate.timer                logrotate.service
Tue 2024-05-07 02:15:32 UTC 21h left           Mon 2024-05-06 02:15:32 UTC 2h 34min ago update-notifier-download.timer update-notifier-download.service
Tue 2024-05-07 02:31:17 UTC 21h left           Mon 2024-05-06 02:31:17 UTC 2h 18min ago systemd-tmpfiles-clean.timer   systemd-tmpfiles-clean.service
Tue 2024-05-07 10:25:21 UTC 1 day 5h left      Mon 2024-05-06 03:46:42 UTC 1h 3min ago  man-db.timer                   man-db.service
Sun 2024-05-12 03:10:53 UTC 5 days left        Sun 2024-05-05 03:11:17 UTC 1 day 1h ago e2scrub_all.timer              e2scrub_all.service
Mon 2024-05-13 00:37:45 UTC 6 days left        Mon 2024-05-06 00:44:17 UTC 4h 5min ago  fstrim.timer                   fstrim.service
Mon 2024-05-13 09:11:46 UTC 1 week 0 days left Sun 2024-05-05 18:21:59 UTC 10h ago      update-notifier-motd.timer     update-notifier-motd.service

11 timers listed.
Pass --all to see loaded but inactive timers, too.

バージョンの更新

最新をインストール

先にサーバーを止める。

sudo systemctl stop minecraft_server

更新版をインストール。

cd minecraft/
curl -O https://minecraft.azureedge.net/bin-linux/bedrock-server-1.21.1.03.zip

export NEXT_VER=bedrock-server-1.21.1.03

unzip $NEXT_VER.zip -d $NEXT_VER
unlink latest
ln -s $NEXT_VER latest

データの移行

移行前にデフォルト設定が変更されてないかdiffを取りながらやる。

export PREV_VER=bedrock-server-1.20.81.01

diff $PREV_VER/allowlist.json $NEXT_VER/allowlist.json
cp $PREV_VER/allowlist.json $NEXT_VER/allowlist.json
diff $PREV_VER/permissions.json $NEXT_VER/permissions.json
cp $PREV_VER/permissions.json $NEXT_VER/permissions.json

server.propertiesは内容が変わっている可能性が高いのでdiffを見て、cpか直接編集するか決める。

diff $PREV_VER/server.properties $NEXT_VER/server.properties
cp $PREV_VER/server.properties $NEXT_VER/server.properties
vim $NEXT_VER/server.properties

worldデータは丸ごとコピー。

cp -Rp $PREV_VER/worlds $NEXT_VER/

起動

sudo systemctl start minecraft_server

起動に失敗したらジャーナルを確認して問題を解決する。成功してもjournalは見ておいた方がいい。

journalctl -xeu minecraft_server