友人のために Azure VM でマイクラサーバを立てた話

先日、友人と「マイクラしたいね~」という話をしたのをきっかけに、マイクラサーバを立てました。過去に何度かマイクラサーバの立て方を書いてきましたが、Spigot かつ 1.17.1 でのバージョンは初めてだと思いますので、まとめておきます。

ちなみに仮想マシンのサイズは B2ms を選択しました。RAMが8GiBある中では安いほうです。

Java 16 の導入

使用している OS は Ubuntu 20.04 です。マイクラは 1.17.1 の Spigot で動かすので Java 16 の導入も必要ですね。

Java 16 の導入

sudo add-apt-repository ppa:linuxuprising/java -y
sudo apt update
sudo apt install openjdk-16-jre -y

Spigot の導入

Spigot を導入するには git が必要ですが、Ubuntu にはすでに入っているのでそのまま進めます。Spigot は BuildTools を使用して自動でセットアップを行えます。

BuildTools のダウンロード

curl -L -O https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar

セットアップしたいマイクラバージョンのオプションをつけて実行

java -jar BuildTools.jar --rev 1.17.1

しばらくすると同ディレクトリ内にサーバファイルが配置されます。

プラグインの導入

サーバファイルと同じディレクトリ内に plugins というディレクトリを作成し、この中にお好きなプラグインをダウンロードしていきます。

今回使用するプラグインは以下の通りです。

名称 説明
Dynmap イクラの世界地図を見ることができる
LuckPerms パーミッションの管理ができる
MultiverseCore 別ワールドの作成(資源サーバ)が作れる
MultiversePortals 別ワールドへ移動するためのゲートが作れる
UltimateTimber 一気に木を伐ることができる便利ツール
Geyser イクラ統合版とのクロスプレイを可能にする
floodgate 統合版からのログイン時に認証キーを利用した設定が行える

資源サーバ(ワールド)設定

まずはプレイヤーに管理者権限を与え、次のコマンドを実行します。

/mv create world_resource NORMAL

ワールドが生成されたらその世界へテレポートします。

/mv tp <PlayerName> world_resource

資源サーバと生活サーバを行き来できるようにゲートを作成し、プレイヤーにゲートの範囲を指定できるアイテムを与えます。

/mvp wand

そのアイテムを持ったまま、ゲートの左上のブロックを左クリック、右下のブロックを右クリックしてゲートの有効範囲を指定します。この状態で

/mvp create gate_resource

というコマンドを実行すると gate_resource という名前のポータルが作られます。一度、生活サーバにもどります。

/mv tp world

生活サーバでゲートを作成し、同じようにしてゲート範囲を指定します。そして、そのゲートと資源サーバのゲートをつなげます。

/mvp create gate_world p:gate_resource:s

ここで、:s は資源サーバへ移動したときのプレイヤーの向きを指定しています。sは南向き、nは北向き、eは東向き、wは西向きに設定できます。作ったゲートを通って資源サーバに移動し、

/mvp select gate_resource

を実行して資源サーバに設置されているゲートを選択します。このゲートを生活サーバのゲートと接続します。

/mvp modify dest p:gate_world:n

これで資源サーバと生活サーバで行き来できるようになります。ただし、パーミッションで一緒に遊ぶプレイヤーに multiverse.portal.access.* を有効にしないとゲートをくぐってもテレポートできないので注意が必要です。

サーバの自動再起動

メモリ解放を行うために、サーバを定期的に再起動するような設定をおこないます。

#!/bin/bash
SCREEN_NAME="minecraft"
RESTART="/home/takunology/start.sh"

screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say メモリ解放のため、5分後にサーバを再起動します。\015"'
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say プレイヤーの皆さんは5分以内にログアウトを済ませてください。\015"'
sleep 120
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say サーバ再起動まで残り3分です。\015"'
sleep 120
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say サーバ再起動まで残り1分です。\015"'
sleep 30
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say 30秒後にサーバを再起動します。\015"'
sleep 20
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say 10秒後にサーバを再起動します。\015"'
sleep 5
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say 再起動まで残り5秒\015"'
sleep 1
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say 再起動まで残り4秒\015"'
sleep 1
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say 再起動まで残り3秒\015"'
sleep 1
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say 再起動まで残り2秒\015"'
sleep 1
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "say 再起動まで残り1秒\015"'
sleep 1
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "kick @a サーバが再起動中です。1分ほどお待ち下さい。\015"'
screen -p 0 -S $SCREEN_NAME -X eval 'stuff "stop\015"'

while [ -n "$(screen -ls | grep -o "$SCREEN_NAME")" ]
do
  sleep 1
done

$RESTART

あとは crontab を利用して、一定期間ごとにシェルスクリプトを実行するように変更すればいいですね。(ここでは毎週月曜日の早朝5:00に再起動するようにしています。)

0 5 * * mon /home/takunology/restart.sh

イベントのお知らせ

2021年8月27日(金)20:00 より、MS Tech Camp #10 を開催します!
今回は Azure Functions の .NET ランタイムとC#プログラミングを使用して、Minecraft で花火を打ち上げます。 Azure Functions や マイクラプログラミング(C#)に興味のある方、ぜひご参加ください!(Minecraft Java 版でも統合版でもご参加いただけます)

mspjp.connpass.com

夏の思い出に「マイクラ花火」いかがでしょうか?