ConoHa VPSでマイクラ鯖を立てた時の話(バックアップとかOS再起動とか)

# 前回の話
[前回](https://qiita.com/tarpon2525/items/35336f58227cb9527654)はマイクラ鯖のサービスをOS起動時に自動で開始するようにSystemdに追加するとこまでが記事かな。

# 今回について
今回は前回に続く話で、マイクラ鯖のサービス自動起動まではできるようになったので、今度はデータの自動バックアップと自動再起動(定期)をしたいって話。
OSの再起動はバックアップついでにする。(どうせバックアップのためにサーバーサービス止めてるわけだし、メモリの開放も兼ねてやっちゃいたい。)
<font color="Red">**一応前回の設定ありきのことをやってたりするので、[前回の記事](https://qiita.com/tarpon2525/items/35336f58227cb9527654)を読んでない場合は一応読んでおいてもらえると助かる。** dear 未来の自分含む。</font>

# 1. バックアップ/OS再起動をしてくれるシェルを作りたい
- やりたいこと
  1. バックアップ実行前にサーバー内に向けて指定時間後に再起動がされることを通知
  2. 直前のカウントダウン
  3. サーバーサービスを停止してバックアップ
  4. 過去5日分くらいバックアップがあればいいので5日以降のバックアップデータを削除
  5. バックアップが完了したらOSごとreboot


## 1-1.必要なファイル

ってことで、データバックアップ及び再起動処理はシェルで作った。
以下サイトより｢**自動再起動**｣参考。
- Minecraftサーバをscreenとcronでプラグインを使わずに自動再起動する
  - ｢ https://jyn.jp/minecraft-server-auto-restart/ ｣

|＼|ファイル名|詳細|
|---|---|---|
|1|~~~.sh|｢~~~｣の所は自分で好きなファイル名にしてもろて。<br>今回僕は参考サイト同様に **｢restart.sh｣** 。<br>ちなみにこのファイル自体は触りに行ければどこでもいいので管理しやすいとこへ置いておこう。<br>今回僕は適当に **｢/etc/restart.sh｣** とした|

## 1-2. ~~~.shの内容

~~~ ~~~.sh
#!/bin/bash

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

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

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

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

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

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))

# 10秒のカウントダウン
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"'

# サービス停止
systemctl stop minecraftserver.service

# マイクラサーバーデータのバックアップフォルダへ移動
cd ${BACKUP_DIR}

# ファイル名(日時)
DIR=`date '+%Y%m%d_%H%M'`

# データをtar.gzへ圧縮
tar -zcvf $DIR.tar.gz -C /usr/local/games minecraft

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

# サービスの再起動だけでいいのなら以下のコメントを解除
# systemctl restart minecraftserver.service

# sudo権限で再起動
sudo reboot
~~~

- 因みに、変数について一応補足。
※興味なければ次のステップへ。

|変数|概要|備考|
|---|---|---|
|SCREEN_NAME|サーバーサービスを実行しているscreenのソケット名。<br>このソケット名のscreenにアタッチするための変数。|前回の記事でSystemdにサーバーサービス登録した時に、screenのソケット名を｢***minecraft***｣としているので上記の通りにしている。|
|WAIT|サーバを停止するまでの待ち時間。<br>ここをお好みで変えることで90秒でも120秒でも待ち時間が設定できる。|今回は参考サイトと同様に60秒の待ち時間を設定した。|
|STORAGE_PERIOD|バックアップデータの保存日数。<br>ここに指定した日数以上前のファイルは削除するための設定。|今回のバックアップは毎日やるつもりなので過去5日分のデータを保管するようにしている。<br>自分のサーバーのストレージと相談して3日や4日と変更してあげると良い。<br>例：｢STORAGE_PERIOD=+3｣過去3日保存の場合|
|BACKUP_DIR|マイクラサーバデータのバックアップ先ディレクトリ。|今回はこんな感じのところにディレクトリを作った。<br>｢/var/games/minecraft_backup｣<br>お好みで好きなところにbackupディレクトリを作ってもらえればと思う。|
|COUNT|カウントダウン開始の秒数。|今回は簡単に10秒とした。<br>実際やるならWAITを180にしてCOUNTを30とかにするかな。|

- データの圧縮処理･バックアップについて(以下sh内容参照)
※ここも興味なければ次のステップへ。
  - 今回は圧縮元を｢**/usr/local/games**｣にある｢**minecraft**｣ディレクトリ対象にを丸ごと圧縮してるけど、普通にワールドデータだけでいいならこのディレクトリの下のworldをバックアップ先にすると良いと思う。
  - バックアップを重ねれば意外とデータも容量食うので、3日前くらいのデータだけ残ってればいいって人は前述の表のとおり、｢**STORAGE_PERIOD**｣の値を｢+2｣とか｢+3｣にすればいいと思う。
~~~ sh
# データをtar.gzへ圧縮
tar -zcvf $DIR.tar.gz -C /usr/local/games minecraft

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

- バックアップ後のサービス起動について
コメントアウトでも書いてあるけど、OSの再起動までは別にしなくていいって人は以下のようにコメントアウトを外して有効化すればまたマイクラサーバサービスが起動する。
~~~ sh
# サービスの再起動だけでいいのなら以下のコメントを解除
systemctl restart minecraftserver.service
~~~

## 1-3. 実行テスト
完成したらshコマンドで実行してみよう。(シェルのファイル名は自分のやつにして実行して。)
~~~ #
# sh restart.sh
~~~

上手くいけば｢**/usr/local/games/minecraft/logs**｣の中のサーバーログでこんな感じに出てると思う。
~~~ 
[23:29:01] [Server thread/INFO]: [Server] 60秒後にサーバーを再起動します。
[23:29:01] [Server thread/INFO]: [Server] 60秒後自動でキックされます。
[23:29:51] [Server thread/INFO]: [Server] 停止まで―
[23:29:51] [Server thread/INFO]: [Server] 10
[23:29:52] [Server thread/INFO]: [Server] 9
[23:29:53] [Server thread/INFO]: [Server] 8
[23:29:54] [Server thread/INFO]: [Server] 7
[23:29:55] [Server thread/INFO]: [Server] 6
[23:29:56] [Server thread/INFO]: [Server] 5
[23:29:57] [Server thread/INFO]: [Server] 4
[23:29:58] [Server thread/INFO]: [Server] 3
[23:29:59] [Server thread/INFO]: [Server] 2
[23:30:00] [Server thread/INFO]: [Server] 1
[23:30:01] [Server console handler/ERROR]: Exception handling console input
java.io.IOException: Input/output error
        at java.io.FileInputStream.readBytes(Native Method) ~[?:?]
        at java.io.FileInputStream.read(FileInputStream.java:276) ~[?:?]
~~~

後は以下みたいにバックアップ先を確認して、データが作成されてればOK。
~~~ #
# ll /var/games/minecraft_backup/
total 1053352
-rw-r--r-- 1 root root 1078626900 Mar 14 23:31 20220314_2330.tar.gz
~~~

# 2.完成したシェルを毎日実行したい(自動)
さて、これでやっとデータのバックアップとOSの再起動が行えるようになった。
ってことで次はコレを毎日やってほしいわけござんすね。

## 2-1. crontabを使って定期実行する
今回僕は｢**crontab**｣を利用した。
~~***crontabって別にいいんだよね…？ダメってことないよね？教えて有識者***~~

crontabは以下のコマンドで設定する。
<font color="Red">**※よくやりがちなのが｢crontab -e｣ってやろうとして｢crontab -r｣ってミス。これやると定期実行の設定消えるから気を付けて。**</font>
~~~ #
# crontab -e
~~~

すると編集画面が開かれるので、僕は以下のように設定した。
｢**/etc/restart.sh**｣の部分は自分で作ったファイルの場所とファイル名を書いてね。
~~~ conf
0 4 * * * /etc/restart.sh > /dev/null 2>&1
~~~
一応設定値を補足すると＿
**｢0 4 \* \* \*｣** は左から順に、「分,時,日,月,曜日」を表している。
｢*｣は毎回実行することを意味している。
つまり今回の場合は **｢毎日の4時0分に/etc/restart.shを実行するよ｣** という意味になる。
｢> /dev/null 2>&1｣は魔法の言葉と思っておいてもらえればいい。気になったら調べればすぐに出てくるよ。

## 2-2. あとは待つだけ
待つだけ。
設定した時間が来るまで待とう。
自動実行されてれば、翌日確認したらバックアップファイルが出来上がってるはずだし、サーバーサービスも立ち上がってるはず。
サービスが起動しているかは **｢systemctl status｣** とかコマンド使って確認すればいいと思う。あとは直接マイクラ起動して入ってみるか。
**｢/usr/local/games/minecraft/logs｣** にもこれまでのマイクラサーバーログがあるので確認すると良いかな。

これでひとまずバックアップとOSの再起動は完了。
お疲れ様。

# 最後に
[前回](https://qiita.com/tarpon2525/items/35336f58227cb9527654)と今回とで結構勢いで設定したフシもあるので、**この設定いらなくね？** とかあるかもしれない。
とりあえず誰かほかにやってみたかった人とかお遊びで参考にしてもらえたら程度なので、不満な部分は改良してやってください………

とりあえず、今回は趣味周りの話だったので、趣味の人みたいなレベルの設定の仕方かもしれないけど、まあお仕事と違ってやりたい設定だけしたんで楽しかった。(小学生並の感想)

以上、お疲れ様です。