【Minecraft】鯖立て・自動運用・Discord通知実装の手順 | すこれるブログ(仮)

【Minecraft】鯖立て・自動運用・Discord通知実装の手順

Minecraft

最近、にじ若手女子マイクラを見ていたら久々にマイクラをやりたくなったので、4年振りくらいにマイクラサーバーを立てました。その時の手順をせっかくなので記事に備忘と共有を兼ねて残してみます。

鯖立ては初心者向け手順にはなってますが、本記事はどちらかと言うと、サーバー運用管理の利便化に関する内容がメインになってると思います。

自動で再起動やバックアップを取ったり、サーバーの再起動や起動やMinecraftの入退室をDiscordに通知したりなどさせています。

スポンサーリンク

はじめに

普段はConoha VPSで鯖立てしてるのですが、今回はあまり長く鯖を立て続けるつもりがなかったので、前から気になっていたConoHa for GAMEでマイクラサーバーを立ててみました最新バージョンで遊ぶ分にはこちらで全然充分だと感じました。

過去バージョンで遊びたい時は……

サーバのjarファイルを置き換えたりsystemdを書き換えたりする
VPSの方で手動で鯖立てする

と言った手間が必要になります。

ちなみに同じサーバーで他のゲームサーバーとして立て直すことも出来ます。もし今後マイクラをやらなくなってARKやCoreKeeper等のサーバーを立てたくなった場合に流用出来ます。

ConoHa for GAMEは料金を支払ってConoHa上の管理画面でサーバーを立てればすぐにゲームが始められるので初心者の方にもオススメです。結果的に本記事も鯖立てまで、であれば初心者向けとなっています。

ConoHa for GAMEではConoHaの管理画面からある程度自動でメンテナンスをさせることも出来ます。私が何故そちらを使わないのかは該当項目にて説明します。

スポンサーリンク

Minecraftサーバーの準備

では早速Minecraftサーバーを立てていきましょう。大体30分もしないうちに作成できます。

申し込み

ConoHa for GAMEのトップページから「テンプレート一覧」⇒Minecraftのお申込みをクリックしましょう。

マイクラのバージョンメモリを選択し、「アカウント作成に進む」をクリックします。一応、バージョンもメモリもアカウント作成後に改めて選択は可能です。メモリについては鯖立て後でもスケールアップ、スケールダウンも可能ですので、一旦2GBで立ててみて、重かったら4GBにする、というのもありです。

本記事ではJava版、2GBで鯖立てします。

料金プラン選択

アカウント作成の諸々が終わったらプラン選択の画面に遷移します。元々ConoHaアカウントを持っている方もこの画面に飛ぶと思います。

料金プランの選択画面

申し込み時に選択したゲームとEdition、メモリが既に選択されていますが、念のため以下の項目を再度確認していきましょう。

イメージタイプMincraftのJava版、もしくは統合版等、
遊ぶ予定のゲームかどうか確認しましょう。
Forgeを導入したい方はForgeを選択します。
料金タイプ割引のある「長期割引」がオススメです。
有効期間メモリもここで選択しましょう。
rootパスワードサーバの管理で必要になります。
主にMinecraftの設定変更の際に使用します。
変更が出来ないので必ずメモ等しておきます
ネームタグConoHa管理画面等での名前です。
自分が分かりやすい名前でOKです。

オプションを見る」については、とりあえず遊びたい人には不要、かつ後で変更可能な項目なので、一旦後回しでOKです。

入力が終わったら「次へ」をクリックします。その後は、

  • アカウント情報の入力
  • アカウントをSMS認証か電話認証で認証
  • お支払情報入力⇒申し込み

の流れとなり、申し込み終えるとサーバーが自動で構築され始めます。

サーバー起動確認

支払いが済むとサーバーが自動で構築されるので、サーバーが無事起動されるかを確認します。

ConoHa管理画面で上部メニューで「GAME」を選択、左側メニュー「サーバー」を選択すると、サーバーリストを確認出来るので、ステータスが「起動中」になるのを確認しましょう。長くても10分くらいで起動中になるかと思います。

更にサーバーの詳細を確認したい場合は「ネームタグ」をクリックします。

一先ずは起動中にさえなれば、サーバーの「IPアドレス」をMinecraftで入力すればサーバーに接続できる状態になっています。一旦マルチプレイを遊ぶだけであればここまでの手順で完了となります。

スポンサーリンク

細かめなサーバー設定

Minecraftを遊ぶだけであれば鯖立て手順のみで完結しますが、サーバーに見知らぬ人が入ってこないようにしたり、MODを入れたり等したので、本項目ではそれに関する手順を紹介します。

Minecraft設定・ホワイトリスト設定

サーバーを構築した直後のMinecraftサーバーは、IPアドレスさえ分かれば誰でもゲームにログイン出来る状態になっています。

IPアドレスを総当たりして勝手にログインしてサーバーを荒らす、悪意のある人がやってくる可能性もあり得なくないので、そういった事を防ぐためにサーバー管理画面でホワイトリストと呼ばれる機能を使用します。

その他、ゲームモードや難易度を変更する場合もサーバー管理画面を使用するので、ついでに手順を紹介します。

サーバーの管理画面へ移動

早速設定していきましょう。さっきの画面から、「ネームタグ」をクリックします。↓の画像で言うと「game-mincraft~~」と書いてある部分です。

↓の画像のようなサーバーの詳細画面が開きます。この画面はサーバーを色々と弄る時にも使用するので、後の項目の手順を実施する際は覚えておきましょう。

この画面で「管理画面」をクリックします。するとポップアップウインドウでアカウント名とパスワード入力を求められるので以下を入力しましょう。

ユーザー名root
パスワードサーバー構築時に設定したrootパスワード

すると、↓の画像のようにサーバー管理画面が別のタブで開きます。

ホワイトリストを設定

サーバー管理画面の上部メニューから「ホワイトリスト」を選択します。

ホワイトリストの設定画面に移動しました。ここで、ホワイトリストをONにして、「ユーザー追加」をクリックします。

するとポップアップウインドウが出てくるので、ログインを許可するユーザ名を入力して、「実行」をクリックします。

ユーザ名が分からない人は……

Minecraft Launcherを開いて、ユーザ名を確認してもらいましょう。JAVA版であれば↓の画像の赤塗りの位置にユーザ名が表示されていると思います。

もしそれでもわからない場合、ホワイトリストを有効化する前にMinecraftにログインしてもらえば、Minecraftゲーム内のチャット等でログイン通知があるので、表示されたユーザ名をメモしましょう。

すると画面下部に入力したユーザ名が表示されると思います。

注意事項として、この時点ではまだホワイトリストは有効になりませんサーバーを再起動することでホワイトリストの設定がサーバーに反映されます

Minecraft設定

ついでにゲームの設定変更もしたい方はここで済ませてしまいましょう。サーバー管理画面の上部メニューで「Minecraft設定」を選択します。

ここでゲームの各種設定を変更出来るので、お好みの設定に変更しておきましょう。

ホワイトリストと同様、サーバーを再起動することで設定変更がサーバーに反映されます

サーバー再起動

ここまで終わったら元のサーバー詳細画面に戻って、「再起動」をクリックしましょう。これで設定が反映された状態でサーバーが起動します。

サーバーにForge・MOD導入

ここではサーバーのForge導入手順を紹介します。クライアント側の導入手順についてはここでは割愛します。

先ほどのサーバー構築手順でForgeを選択していた場合は不要ですが、後からやっぱ入れたくなった場合や、自分でForgeを導入したい場合は本手順を参考にしてみてください。

公式サイトでサーバ用Forgeをダウンロード

以下の公式サイトにアクセスします。

Minecraft Forge downloads
Downloads for Minecraft Forge for Minecraft 1.21.4Latest: 54.1.1Recommended: 54.1.0

Download Recommended」の方の「Installer」をクリックします。(Latestは不具合を引いたり、他MOD等がサポートされなかったり等、予期しないことが起きやすいです。)

遷移先の画面でしばらく待つと、画面右上に「SKIP」と表示されるのでクリックします。クリックするとダウンロード画面が出てくるので、自分が分かりやすい場所にインストーラーをダウンロードしましょう。

下の方の目立つ方はクリックしないように。

ダウンロードしたインストーラーをダブルクリックしましょう。名前はバージョンによって異なりますが、「forge-1.XX.X-XX.X.XX-installer」みたいな名前だと思います。

するとインストーラーが起動するので、今回はサーバ用なので「Install server」をクリックします。ここでの目的は、サーバーにアップロードするためのファイルの用意、なので、インストール先フォルダはご自身が分かりやすい場所で大丈夫です。

しばらく「Complete」と表示されるまで待ちます。

入れたいMODが決まってる場合は……

入れたいMODが決まっている場合はそのMODの.jarファイルもダウンロードしておきましょう。後ほど、Forgeをサーバに導入する際に一緒にサーバーにアップロードすることになりますので、同じフォルダにダウンロードしておいてください。

Forgeのインストールが終わった後のファイル、入れたいMODファイルを全て集めるとこのようになると思います。そのうちの、青線で囲った部分はもう不要なので削除してOKです。

twilightforestは「入れたいMOD」の例です。

これらのファイルをサーバーにアップロードするのですが、まだサーバーにファイルをアップロードするためのツール導入やサーバーの設定が済んでいないので、先にそちらを実施します。

WinSCPをダウンロード

FTPソフトのWinSCPをダウンロードして導入します。後のサーバーメンテナンス系の手順でも頻繁に使用します。

これに関してはgoogleで検索すれば窓の社等のダウンロードページが見つかると思うので、そちらでダウンロードしてください。

サーバーのSSHを有効化

初期設定ではセキュリティの観点から、サーバー側がファイルの転送等を受け付けていない状態なので、サーバーの設定を変更します。

先ほどのサーバー詳細画面の左側メニューで「セキュリティ」⇒「セキュリティグループ」を選択して、セキュリティグループの画面で「+セキュリティグループ」をクリックします。

すると作成ウインドウが出てくるので、ご自身が分かりやすい名前を入力して「作成」をクリックします。(本手順ではSSH、という名前で作成しますが、好きな名前でOKです。)

するとセキュリティグループリストに、作成したセキュリティグループが追加されますのでクリックして開いて、「+」マークをクリックします。

↓の画像のように作成画面が出てくるので、以下を入力します。

プロトコルTCP
ポート範囲22
IP/CIDRMy IPで表示されているIPアドレス
※これを入力すると自分だけが接続できるようになります

特にIPアドレスを設定することがセキュリティ上大事です。空欄にした場合、誰でもアクセス出来てしまうため、サイバー犯罪の踏み台にされるリスクが生じます。他の記事で良く「IPv4v6-SSH」というデフォルトのセキュリティグループを使用しているのを見かけますが、これも誰でもアクセスできる設定になっているので使用は非推奨です。

ここまで設定したらまたサーバーの詳細画面に戻り、「ネットワーク詳細」を開いて「セキュリティグループ」の+マークをクリックして、プルダウンから先ほど作成したセキュリティグループを選択し、「保存」をクリックします。

もしもセキュリティグループに「IPv4v6-Minecraft」が無い場合、Minecraftのゲームにログインできないので追加しておきましょう。とは言え既に追加済みなはずです。

後はサーバー管理画面でSSHサーバを起動、にして再度サーバーを再起動すれば完了です。

SSHサーバーを起動。これでファイルがサーバーに送れるようになります。再起動も忘れずに。

サーバにForge・MODをアップロード

ここまでくればあともう少しです。

WinSCPを起動して、「新しいサイト」をクリックして以下を入力しましょう。入力したら「保存」をクリックします。

ホスト名MincraftサーバーのIPアドレスを入力します。
さっきのサーバー詳細画面のネットワーク情報で確認できます。
ポート番号22
ユーザ名root
パスワード設定したrootパスワードを入力します。

保存をクリックすると以下の画面が出てくるのでOKを押します。

「パスワードを保存」にチェックを入れると……

ログイン時にパスワード入力が不要になりますが、ここのチェックは自己責任でお願いします。チェックを入れてもサーバー自体のセキュリティに穴が空くわけではないです。(ご家庭で使用する分には基本的にはチェックを入れて問題は無いと思います。)

パスワードを保存する場合は自己責任で。

その後作成した設定を選択してログインをクリックします。もし「不明なサーバーに接続し~」から始まるホップアップ画面が出た場合は「はい」をクリックしてください。

以下のような画面になれば、サーバにログインが出来ています。右側がサーバーのエクスプローラーです。

そしたらサーバーのMinecraftに関するデータがあるフォルダまで移動しましょう。
opt ⇒ minecraft_server の順にフォルダを開いていきます。すると以下のような画面になると思います。

そしたら左側の画面が自分のPCのエクスプローラーなので、ForgeやMODをインストールしたフォルダに移動しましょう。そしたら、ドラッグ&ドロップで、右側のMinecraftサーバにコピーします。

もし、「~を上書きしますか?」とホップアップが出てきたら、「すべてはい」にチェックを入れてください。これでForgeとMODの導入は終了です。後はForgeを起動してあげます。

Forgeを起動

サーバー詳細画面に戻り、コンソールをクリックします。

クリックした際に、もしConoHaのログイン画面が出た場合はログインしたのち、ホップアップ画面を閉じてから再度コンソールを開きます。

するとこんな画面になると思います。ここで、rootと入力してエンター、passwordを求められたらrootパスワードを入力してエンターを押します。コピー&ペーストで入力する場合は、「テキストを送信」を開いて、入力した後、「送信」をクリックします。

そしたら、以下のコマンドを入力してエンターを押します。「テキストを送信」を使用したコピー&ペーストでもOKです。

Bash
sh /opt/minecraft_server/run.sh

すると起動ログがたくさん流れてきますが、ログが止まって、下から2行目くらいのとこに「Done (XXXs)! For help, type “help”」というログが出力されていれば起動は完了です。

もしMODも追加する場合は以下の手順も実施しましょう。

MODの追加

Forgeを追加した時と同じサーバーのフォルダにWinSCPでアクセスしましょう。

そしたら「新規」をクリックして「ディレクトリ」を選択します。

フォルダ作成のポップアップ画面が出るので、新しいフォルダ名を「mods」と入力して「OK」をクリックします。フォルダ名が1文字でも違うとダメなので注意してください。

そしたらForgeを導入した時と同じ要領で、「mods」フォルダにMODのjarファイルをドラッグ&ドロップで移動します。

ここまで完了したらサーバーを再起動すればOKです。お疲れ様でした!

MODは競合が発生して上手く起動できない場合もあるので、複数導入する際は1つずつ導入して、その都度再起動⇒Minecraftにログインできるか確認、を繰り返すのをオススメします。

スポンサーリンク

自動メンテナンススクリプトの作成

ここからが個人的には本題です。結構オタクな話にもなってくるので、情報が必要な方、teratermの導入や使い方は分かってる人向けです。基本的にサーバーの設定等はteratermを使用して行います。

ConoHa for GAMEで不便なところ

ConoHa for GAMEではConoHaの管理画面からでも自動再起動や自動バックアップを設定することは可能なのですが、以下の制約や懸念点があります。

  • ConoHaのバックアップではバックアップファイルのサイズが300MB程と大きめ。サーバー設定変更をする際の使用を想定されているので、毎日ワールドのバックアップを自動で取る、といった用途に少し不向き
  • 自動再起動で再起動を実施する際、ゲーム内チャット等に通知が一切無い。また、毎日のこの時刻、という設定しかできず、曜日の指定等は出来ない

なので今回は以下を全て一緒に、そして自動で行ってくれるようにスクリプト等を組みました。また次の大項目で詳しく記載しますが、必要に応じてdiscordにも通知を行ってくれるようにしてます。

  • 毎日自動で再起動(設定次第で曜日指定等も可能)
  • worldのバックアップを取得、5日間より古いバックアップは削除
  • 再起動を実施する前にゲーム内チャットに通知する
  • サーバー、Minecraft再起動時にDiscordに通知

実装スクリプト

まずは結果として実装したスクリプトを記載します。このままコピペしても恐らく動かないので、どの部分の書き換えが必要か、という部分や、詳細な補足を以降の項目で説明します。

また、スクリプトを自動的に実行するのにはクーロンという機能を使いますのでそちらの設定も軽く紹介します。

Minecraft自動再起動・バックアップ用スクリプト

名前はrestart_and_backup.shにしてます。

Bash
#!/bin/bash

############## 環境変数設定 #################

# screenのソケット名
SCREEN_NAME='minecraft'

# サーバ終了までの待ち時間
WAIT=60

# バックアップデータの保存期間
STORAGE_PERIOD=+5

# バックアップ元
WORLD_DIR=/opt/minecraft_server/world/

# バックアップ先
BACKUP_DIR=/var/opt/minecraft_backup/

# カウントダウンの秒数
COUNT=10

### discord webhook連携用の環境変数 ###

# Webhook URL
WEBHOOK_URL="https://discord.com/api/webhooks/~~~~~~~~~~~~"

# メッセージコンテンツ
MESSAGE_CONTENT1="${WAIT}秒後にMinecraftを爆破します"
MESSAGE_CONTENT2="匠の手によってMinecraftが生まれ変わりました"

# リクエストボディ
REQUEST_BODY1="{\"content\":\"$MESSAGE_CONTENT1\"}"
REQUEST_BODY2="{\"content\":\"$MESSAGE_CONTENT2\"}"


############## かならずminecraftユーザで実行する #################

#discord通知
curl -X POST -H "Content-Type: application/json" -d "$REQUEST_BODY1" "$WEBHOOK_URL"

#ここからはscreen上のコマンド
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${WAIT}'秒後にサーバーを再起動します。\015"'
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${WAIT}'秒後自動でキックされます。\015"'

# カウントダウンがあるのでCOUNTで指定した秒数マイナスしただけsleep
sleep $(($WAIT - $COUNT))

# 環境変数で設定した秒数のカウントダウン
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 停止まで―\015"'

for ((i=$COUNT; i>0; i--));
do

 screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say '${i}'\015"'

 sleep 1

done

# 停止前に全プレイヤーをキックする
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "kick @a サーバーを再起動します。バックアップ及び起動に3~5分かかります。 \015"'

############## バックアップ開始 #################

# Minecraft停止
#/etc/systemd/system/minecraft-server.serviceの内容を使用
screen -p 0 -S minecraft -X eval 'stuff "stop"\\015'

#ワールドディレクトリのコピー
cp -r ${WORLD_DIR} ${BACKUP_DIR}

#zipに圧縮
zip -r ${BACKUP_DIR}/world_`date "+%Y%m%d_%H%M"` ${BACKUP_DIR}/world

#ゴミ削除
rm -rf ${BACKUP_DIR}/world

# バックアップフォルダからSTORAGE_PERIODで指定した日数以上前のデータを削除
find ${BACKUP_DIR} -maxdepth 1 -mtime ${STORAGE_PERIOD} -name '*.zip' -exec rm -f {} \;

################################

# Minecraft起動
#/etc/systemd/system/minecraft-server.serviceの内容を使用
/bin/sh -c '/usr/bin/screen -DmS minecraft /usr/bin/java -server -Xms512M -Xmx3072M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -jar /opt/minecraft_server/minecraft_server.1.21.4.jar nogui'

#discord通知
curl -X POST -H "Content-Type: application/json" -d "$REQUEST_BODY2" "$WEBHOOK_URL"

サーバー再起動スクリプト

名前はreboot.shにしてます

Bash
#!/bin/bash

############## 環境変数設定 #################
# サーバ再起動までの待ち時間
WAIT=60

# Webhook URL
WEBHOOK_URL="https://discord.com/api/webhooks/~~~~~~~~~~~~~~~"

# メッセージコンテンツ
MESSAGE_CONTENT="${WAIT}秒後に鯖を爆破します。起動には5分程度かかります"

# リクエストボディ
REQUEST_BODY="{\"content\":\"$MESSAGE_CONTENT\"}"

############## コマンド実行 #################
# Discordへ通知
curl -X POST -H "Content-Type: application/json" -d "$REQUEST_BODY" "$WEBHOOK_URL"

#再起動
sleep ${WAIT}
/usr/sbin/reboot

実装クーロン

rootユーザーと、minecraftを動かしているユーザーそれぞれ別のクーロンを設定します。Minecraftの動作に関わるスクリプトはMinecraftを実行しているユーザーでクーロンを設定する必要があります

ConoHa for GAMEでは、minecraftというユーザーが既に作成されていて、そのユーザーでMinecraftを動かしています。

Bash
root@vm-dc:~# crontab -l
2 14 * * * /opt/minecraft-manager/reboot.sh

root@vm-dc:~# su minecraft
$ crontab -l
59 13 * * * /opt/minecraft-manager/restart_and_backup.sh

クーロンの通り、作成したスクリプトは/opt/minecraft-manager/に配置します(場場所自体は自由ですが、クーロンのコマンドで記載するファイルパスは変更必要です)また、権限の付与も必要になります。権限付与手順は後述します。

スクリプトの補足説明

まず、個々人の環境によって必ず変更が必要な部分は以下の部分です。

Bash
restart_and_backup.shの部分
# バックアップ元
WORLD_DIR=/opt/minecraft_server/world/

# バックアップ先
BACKUP_DIR=/var/opt/minecraft_backup/

# Webhook URL
WEBHOOK_URL="https://discord.com/api/webhooks/~~~~~~~~~~~~~~"

# Minecraft起動
#/etc/systemd/system/minecraft-server.serviceの内容を使用
/bin/sh -c '/usr/bin/screen -DmS minecraft /usr/bin/java -server -Xms512M -Xmx3072M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -jar /opt/minecraft_server/minecraft_server.1.21.4.jar nogui'


reboot.shの部分
# Webhook URL
WEBHOOK_URL="https://discord.com/api/webhooks/~~~~~~~~~~~~~~"

また、お好みに応じて変更が可能な箇所は以下の通りです。メッセージ内容は基本的に自由なので省略します。

Bash
restart_and_backup.shの部分
# サーバ終了までの待ち時間
WAIT=60

# バックアップデータの保存期間(保存日数です)
STORAGE_PERIOD=+5

# カウントダウンの秒数(ゲーム内チャットでのカウントダウン通知秒数です)
COUNT=10

reboot.shの部分
# サーバ再起動までの待ち時間
WAIT=60

各パラメータについて

個々人の環境によって変更が必要なパラメータについて説明します。

#バックアップ元
#バックアップ先
バックアップ元はworldフォルダのパスを書きます。
ConoHa for GAMEなら/opt/minecraft_server/world/だと思います。
バックアップ先は保存先ディレクトリを書きます。
個々人の自由ですが、予めディレクトリは作成しておいてください。
#Webhook URLDiscord通知に必要になります。
確認に必要な手順は後述します。
Discord通知が不要の場合、コメントアウトしてください。
(#discord通知 の部分もコメントアウトしてください。)
#Minecraft起動コメントの通り、/etc/systemd/system/minecraft-server.service
で記載されている、ExecStartに記載のコマンドを使います。
ConoHa for GAMEであれば変更不要ですが、
もしバージョンアップした場合は確認とスクリプト内容変更が必要
これも詳しくは後述します。
#discord通知不要な場合、コメントアウトしてください。

クーロンの補足説明

この項目をお読みの方は分かる人も多いと思いますが、クーロンの編集・確認コマンドは以下のコマンドです。

Bash
#クーロン編集
crontab -e
#クーロン確認
crontab -l

またクーロンは以下の構成になっています。曜日は0~6で日曜~土曜の順で表記します。条件を複数(例えば11時と23時)にしたい場合は「,」で区切ります。

Bash
   曜日  実行コマンド

#例えば、毎週土日の23時59分に実行させたい場合はこんな感じ
59 23 * 0,6 * 実行コマンド

忘れずにスクリプトに実行権限付与

スクリプトをサーバに配置したら必ず実行権限を付与するために、以下のコマンドを実行してください。

Bash
#スクリプトに実行権限を付与
chmod +x /opt/minecraft-manager/restart_and_backup.sh
chmod +x /opt/minecraft-manager/reboot.sh

#minecraftを動かしているユーザーがスクリプトを動かせるようにする
chown minecraft:minecraft /opt/minecraft-manager/restart_and_backup.sh

Minecraft起動コマンドの確認方法

以下のコマンドで確認できます。出力結果のうち、「ExecStart=」に記載されている部分がMinecraftの起動コマンドです。

Bash
#サービスの起動、停止、再起動で実際に使用しているコマンドを確認
cat /etc/systemd/system/minecraft-server.service

もしこれで出力されない場合、サービス名が違う可能性があります。ConoHa for GAMEは基本このサービス名だと思いますが、違った場合は以下コマンドでサービス名を確認しましょう。

Bash
#サービス名を確認
systemctl status | grep minecraft

Discord連携について

Discordではwebhookを利用することで外部サービスと連携が可能です。これを今回利用します。

通知を送りたいサーバのサーバ設定を開き、「連携サービス」から「ウェブフック」をクリックします。

新しいウェブフック」をクリックします。するとウェブフックが作成され、クリックすると設定画面が出てきます。

名前はご自身が管理しやすい名前、チャンネルは通知を飛ばしたいチャンネルを選択してください。設定したら画面下部に「保存」を促すホップアップが出るので、保存します。

ここまで終わったら、「ウェブフックのURLをコピー」します。スクリプト中のWebhook URLはこのコピーしたURLを記載してください。WEBHOOK_URL=” “という記載の仕方をしているので、末尾の「”」だけ消さないように注意です。

ちなみにアイコンもここで変更が可能です。私はクリーパーのアイコンにしています。

スポンサーリンク

サーバー起動通知スクリプト

ここまでで定期メンテナンスを自動化できましたが、個人的にはサーバーが無事起動したかどうかとか、もうゲームにログインできるかな?と言うのを知りたいので、サーバーが起動してきたことをDiscordに通知してくれるようなスクリプトを組みました。

逆に言えば、さっきまでのスクリプトだけでは起動通知はしてくれないです。

実装したもの

今回はスクリプトだけでなく、サービスも自身で作成が必要です。

スクリプト

名前はboot_notice.shにし、/opt/minecraft-manager/配下に置いています。もし名前や配置先を変える場合はサービスの内容も変更が必要です。

Bash
#!/bin/bash

############## 環境変数設定 #################
# Webhook URL
WEBHOOK_URL="https://discord.com/api/webhooks/~~~~~~~~~~~~~"

# メッセージコンテンツ
MESSAGE_CONTENT="匠の手によって鯖が生まれ変わりました"

# リクエストボディ
REQUEST_BODY="{\"content\":\"$MESSAGE_CONTENT\"}"

############## コマンド実行 #################
# Discordへ通知
curl -X POST -H "Content-Type: application/json" -d "$REQUEST_BODY" "$WEBHOOK_URL"

サービス

サービス名は自由ですが、boot_notice.serviceにしています。

Bash
[Unit]
Description=boot notice
After=network-online.target

[Service]
ExecStart=/opt/minecraft-manager/boot_notice.sh
type=oneshot
Restart=on-failure

[Install]
WantedBy=multi-user.target

サービス作成・登録手順

以下のコマンドを実行します。viコマンドを実行するとviの編集画面に移動するので、そこでコピーした内容をペーストしましょう。

vi上ではiを入力すると編集画面、escで編集画面から抜ける。:wq!と入力すればセーブしてviから抜けれます。かなりざっくりな説明なので、詳しく知りたい人はググってください。ここではviの説明は省略します。

Bash
#起動時スクリプトを実行するためのサービスを作成
sudo vi /etc/systemd/system/boot_notice.service

#サービス有効化
sudo systemctl enable boot_notice.service

#スクリプトに実行権限を付与
chmod +x /opt/minecraft-manager/boot_notice.sh

これで、以降サーバーを再起動した際はDiscordに通知してくれるようになります。

補足

後でサービスの内容を変更した場合は以下コマンドを実行しないと、変更が反映されませんので注意です。

Bash
#もしサービスの設定変更したら使うコマンド
systemctl daemon-reload
スポンサーリンク

入退室Discord通知スクリプト

最後に、ユーザーがMinecraftにログイン、ログアウトしたことをDiscordに通知してくれるスクリプトも組んでみたのでこれも紹介します。

Slackで通知している方のものをDiscord用に改造しています。Discordに通知する場合、ウェブフックURLの末尾に/slackを追記してください。

これもサービスを作成、登録することで、サーバー起動時からDiscord通知をしてくれるようになります。

実装したもの

スクリプト

参考サイトの内容から変更した部分としては、通知テキストがシンプルになるようにawkコマンドで整形したこと、そもそもif文の文法が間違ってたのでそこを直したりしました。

Bash
HOST_NAME=$(hostname)
CHANNEL=#minecraft-notice
USERNAME=Minecraft
#DiscordはWebhook URL末尾に /slack
#https://discordapp.com/developers/docs/resources/webhook#execute-slackcompatible-webhook
WEBHOOK_URL=https://discord.com/api/webhooks/~~~~~~~~~~~~/slack

post_webhook() {
  while read i
  do
    echo $i | grep -iq -e "joined the game" -e "left the game"
    if [ $? = 0 ];then
      #echo $i
      TEXT=`echo $i | awk '{print $4, $5, $6, $7}'`
      curl -X POST --data-urlencode "payload=\
      {\
        \"channel\": \"$CHANNEL\", \
        \"username\": \"$USERNAME\", \
        \"text\": \"$TEXT\" \
      }" \
      $WEBHOOK_URL
    fi
  done
}

tail -n 0 -F $1 | post_webhook

サービス

Bash
[Unit]
Description=Server daemon for Minecraft notifier
After=network-online.target

[Service]
Type=forking
KillMode=none
Restart=on-failure
ExecStart=/usr/bin/screen -dmS minecraft_notifier /bin/bash -c "/opt/minecraft-manager/notify_log.sh /opt/minecraft_server/logs/latest.log"
ExecStop=/usr/bin/screen -S minecraft_notifier -X quit

[Install]
WantedBy=multi-user.target

補足ですが、「/opt/minecraft_server/logs/latest.log」の部分でMinecraftのログを見に行っているので、Minecraftのログ保管場所が異なる場合は書き換えてください。

サービス作成・登録手順

以下のコマンドを実行します。viコマンドを実行するとviの編集画面に移動するので、そこでコピーした内容をペーストしましょう。

vi上ではiを入力すると編集画面、escで編集画面から抜ける。:wq!と入力すればセーブしてviから抜けれます。かなりざっくりな説明なので、詳しく知りたい人はググってください。ここではviの説明は省略します。

サービス名は自由です。

Bash
#起動時スクリプトを実行するためのサービスを作成
sudo vi /etc/systemd/system/minecraft_notifier.service

#サービス有効化
sudo systemctl enable minecraft_notifier.service

#スクリプトに実行権限を付与
chmod +x /opt/minecraft-manager/notify_log.sh

これで、以降ユーザーのログイン・ログアウトをDiscordに通知してくれるようになります。

補足

後でサービスの内容を変更した場合は以下コマンドを実行しないと、変更が反映されませんので注意です。

Bash
#もしサービスの設定変更したら使うコマンド
systemctl daemon-reload
スポンサーリンク

参考サイト

スクリプト等を作成するにあたって参考にさせていただいたサイトの紹介で、本記事を締めさせていただきます。

CentOSでのminecraft_server(マルチサーバ)バックアップ
バックアップの必要性原因は色々とあるのですが、minecraftで遊んでいると、まれにゲームデータが壊れてしまうことがあります。そうなると、プレイに支障をきたし、せっかく時間を掛けて作ってきた世界が突然失われてしまいます・・ですが、バックア...
【minecraftサーバ】MOD・プラグイン不要!!自動バックアップ+再起動システム - Qiita
#シェルによるバックアップシステムMinecraftのサーバを運営していて定期的にバックアップと再起動をしたいと思って作りました。minecraft内での処理ではなくシェルスクリプトを使いOS…
ConoHa VPSでマイクラ鯖を立てた時の話(バックアップとかOS再起動とか) - Qiita
前回の話前回はマイクラ鯖のサービスをOS起動時に自動で開始するようにSystemdに追加するとこまでが記事かな。今回について今回は前回に続く話で、マイクラ鯖のサービス自動起動まではできるように…
外部サービスからDiscordにメッセージを送る(Webhook)
systemd サービスユニット覚書 - Qiita
initはもはや昔のしくみで、OS起動・停止時の制御はsystemdが行う。initよりも並列度を高める設計思想なので、HWの進化ともあいまって最近のOS起動はとにかく速い。操作には冪等性があるし…
network.targetとnetwork-online.target(備忘録) - Qiita
はじめに備忘録です!!実行環境# cat /etc/redhat-releaseRocky Linux release 8.4 (Green Obsidian)n…
Discord Developer Portal — API Docs for Bots and Developers
Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with...
シェルスクリプトの特殊変数「$?」について
件名の通りシェルスクリプトの特殊変数「$?」について質問があります。「$?」は直前実行したコマンドの終了値(0は成功、1は失敗)という認識なのですが、インターネットでは場合によっては他の値もあ
スポンサーリンク

コメント

タイトルとURLをコピーしました