minecraftサーバー（Spigot）備忘録

# はじめに

minecraftサーバーを長らく運用しているものの、いろいろなことを常に覚えているわけではないので、備忘録がてら書いていこうと思います。
まずは基本的な構築について記して、なにかあれば追記したいと思います。

## 環境

検証環境も含めて色々な環境で運用していましたが、2021年8月現在運用中の環境の2台のみを記載します。

### サーバー1
* Web ARENA Indigo 8GB 6vCPU 160GBインスタンス
* CentOS Linux release 7.9.2009.
* spigot 1.16.2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238748/1740d288-826e-a940-336b-fcb5af5bf4c7.png)
* 導入Plugin

|プラグイン名|簡単な説明
|:---:|:---
|Vault|前提プラグイン
|InvSort|チェストやインベントリをソートしてくれる
|EnchantableBlocks|かまどにエンチャントできる
|SetHomes|ホームを設定してテレポートできる
|dynmap|ブラウザでマップ表示する
|WorldEdit|ブロック設置、消去、コピーなどのエディット機能
|DiscordSRV|サーバーの状態などをディスコードBOTに通知させる
|WorldGuard|ブロックを保護する
|CoreProtect|ログ記録プラグイン

### サーバー2（検証用）
* 自作PC
* Windows Server 2019 Standerd（使用版） or Ubuntu（必要なときに検証したいOSを入れて検証しています。）
* Spigot 1.17.1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238748/6b43a606-bb16-55b2-fa4b-3306f8843a0b.png)
* 導入Plugin

|プラグイン名|説明
|:---:|:---
|GoTo|テレポートするプラグイン
|floodgate|統合版（BE版）のアカウントでログインできるようにする
|Vault|前提プラグイン
|ChestSort|チェストをソートしてくれる
|EnchantableBlocks|かまどにエンチャントできる
|dynmap|ブラウザでマップ表示する
|WorldEdit|ブロック設置、消去、コピーなどのエディット機能
|Geyser-Spigot|統合版（BE版）クライアントからJava版サーバーに通信をさせる
|WorldGuard|ブロックを保護する
|CoreProtect|ログ記録プラグイン

その他検証用の仮想環境もありますが、しょっちゅう消したり作ったりするので割愛します。

## 構築について

* 基本的にLinux（Ubuntu）での構築を考えます。

### 1.17よりJava16が必要になったのでインストールします。

```
sudo apt install openjdk-16-jdk
```
* 以下のコマンドでバージョンを確認できます。

```
java -version
```

### Spigotをビルドします。

* ビルドをするためgitをインストールします。

```
sudo apt install git
```

### BuildToolsをダウンロードして実行させます。

https://hub.spigotmc.org/jenkins/job/BuildTools/

上記URLよりダウンロードします。wgetでとってくれば良いと思います。

* BuildTools.jsをダウンロードしたら以下のコマンドで実行します。

```
java -jar BuildTools.jar --rev latest
```

時間がかかりますが終了すると「spigot-1.17.1.jar」が生成されるので、マイクラサーバーを展開したいディレクトリに移動します。

### Spigotの起動

マイクラサーバーのディレクトリに移動し、基本的に以下のコマンドで実行できます。

```
java -jar spigot-1.17.1.jar
```
初回実行時にエラーになりますが、eula.txtが生成されるので、eula=Falseをeula=trueにして保存します。
その後再度実行させます。

基本的には以上でSpigotの起動はできます。

## バックグラウンドで実行させる
このままだと起動はするのですが、フォアグラウンドのためめっちゃ使いづらいです。
順当にバックグラウンドにしてしまうとサーバーから直接コマンドでの操作ができません。
そのため、私はscreenを使用しています。
バックグラウンドでシステム起動と同時に実行させ、必要なときにサーバー画面に移れるようにしています。
以下のコマンドでインストールします。

```
sudo apt install screen
```

インストールさたか念の為確認します。

```
screen --version
Screen version 4.01.00devel (GNU) 2-May-06
```

軽いシェルスクリプトを書きます。

```start.sh
screen -AmdS mc java -Xms5120M -Xmx5120M -server -jar spigot-x.xx.x.jar
```

crontabに起動時にシェルスクリプトを読み込むように書きます。

```crontab
@reboot sh /home/minecraft/server/spigot-x.xx.x/start.sh
```

もしも手動で停止させた場合、起動するときはstart.shを実行するようにしています。

### Screenの簡単な使い方

#### スクリーンを表示させる

```
Screen -r <スクリーン名>
```
#### 切り替えたスクリーンから前のスクリーンに戻る
"Ctrl+A" を押したあと "D" で直前のスクリーンに戻る

## バックアップについて

前は自動でバックアップをするプラグインがあったのですが、1.16以降をサポートしなくなって動作しなくなりました。
いまは不定期に手動でバックアップをかけています。その手順を書いておきます。

スクリプトを作ります。
私はこちらのページを参考にスクリプトを修正しました。

https://minecraft.server-memo.net/mc_backup/#minecraft

```mcserver-backup.sh
#!/bin/bash
SERVICE='spigot-x.xx.x.jar'
OPTION='-p 25565'
USERNAME='minecraft'
SCNAME='mc'
MC_PATH='/home/minecraft/minecraft'
MC_DIRECTORY='spigot'
BK_PATH='/home/minecraft/minecraft/backup'

BK_TIME=`date +%Y%m%d-%H%M%S`
BK_NAME="$BK_PATH/mc_backup_full_${BK_TIME}.tar.bz2"
BK_GEN="3"

XMX="5120M"
XMS="5120M"

cd $MC_PATH

ME=`whoami`

if [ $ME == $USERNAME ] ; then
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
        echo "Full backup start minecraft data..."
        screen -p 0 -S $SCNAME -X eval 'stuff "say まもなくサーバーのバックアップを開始します。1分後にサーバーが停止します。"\015'
        sleep 30
        screen -p 0 -S $SCNAME -X eval 'stuff "say まもなくサーバーのバックアップを開始します。30秒後にサーバーが停止します。"\015'
        sleep 20
        screen -p 0 -S $SCNAME -X eval 'stuff "say まもなくサーバーのバックアップを開始します。10秒後にサーバーが停止します。"\015'
        sleep 10
        screen -p 0 -S $SCNAME -X eval 'stuff "save-all"\015'
        screen -p 0 -S $SCNAME -X eval 'stuff "stop"\015'
        sleep 40
        echo "Stopped minecraft_server"
        echo "Full Backup start ..."
        tar -jcvf $BK_NAME $MC_DIRECTORY
        sleep 10
        echo "Full Backup compleate!"
        # 三日以前のファイルは削除する
        #find $BK_PATH -name "mc_backup_full*.tar.bz2" -type f -mtime +$BK_GEN -exec rm {} \;
        echo "Starting $SERVICE..."
        #screen -AmdS $SCNAME java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui
        screen -AmdS $SCNAME java -Xms$XMX -Xmx$XMS -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -server -jar $SERVICE $OPTION
    else
        echo "$SERVICE was not runnning."
        echo "Full Backup start ..."
        tar -jcvf $BK_NAME $MC_DIRECTORY
        sleep 10
        echo "Full Backup compleate!"
        # 三日以前のファイルは削除する
        #find $BK_PATH -name "mc_backup_full*.tar.bz2" -type f -mtime +$BK_GEN -exec rm {} \;
        echo "Starting $SERVICE..."
        #screen -AmdS $SCNAME java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui
        screen -AmdS $SCNAME java -Xms$XMX -Xmx$XMS -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -server -jar $SERVICE $OPTION
    fi
else
    echo "Please run the $USERNAME user."
fi
```
bzip2でフルバックアップしています。おおよそ10GBぐらいになります。
SpigotのJava起動パラメーター（-XX:+UseG1GCなど）は意味がわかっていません。正直なくても動くので"-Xms$XMX -Xmx$XMS"だけ指定してあげればいいのかな・・？とは思っています。

1. コミュニティなどがあればそこにメンテの旨を書き込みます。
1. 用意したスクリプトを実行します。
1. 自動で終了してバックアップされ、立ち上がります。（超長い）
1. 手動で外部のレンタルサーバーへsftpでアップロードします。

古いバックアップは手動で削除します。サーバー内5つぐらい保持していて、それ以上は消しています。

## リソースパックについて

#### Server.propatiesに記載するリソースパックURLとSHA1について

```
resource-pack=（ここにリソースパックのURLを入れる）
resource-pack-sha1=（SHA1のハッシュ値を入れる）
```

#### ハッシュ値とは？

ファイルの同一性を確認するための値です。
Windowsの場合コマンドプロンプトで計算可能

```BAT
certutil -hashfile （リソースパック）
```