１ Minecraft bedrock server の建て方（Backup by Git）

**１ Minecraft bedrock server の建て方（Backup by Git）（今ここ）**
**[２ スクリプト一覧](https://qiita.com/QiitaYkuyo/items/cdbb95c79746f85453a0)**
**[３ 各スクリプトの詳細＆引用元・参考先](https://qiita.com/QiitaYkuyo/items/4f76b09afec30246cda7)**
先に３をよく読んで２をすべて実行しておいてください

#### ＜ GitHub からインストール＞
[Minecraft-bedrock-server_Backup-by-Git](https://github.com/qiitaqiitaykuyo/Minecraft-bedrock-server_Backup-by-Git.)

#### ＜サーバーの起動・停止＞
**サーバー実行中もバックアップを行う**
```bash:bash
# 起動
sudo systemctl start minecraft
# 停止
sudo systemctl stop minecraft

# 確認
sudo systemctl status --no-pager minecraft
sudo journalctl -e -u minecraft | tail -n 25
```
**サーバーを止めたときのみバックアップを行う**
**※ MC（エイリアス）を使うときはコマンド全体を二重引用符で括ってください**
```bash:bash
# 起動
MC "mc_start"
# 停止
MC "mc_stop"
```

#### ＜Minecraft Server 用の制御端末に接続する＞
```bash:bash
# 接続
MC "tmux a"
# 抜ける
［Ctrl + B］
［ D ］
```
Minecraft Bedrock Server 用のコマンド参考先一覧
[Commands](https://minecraft.fandom.com/wiki/Commands)
[Popular Commands](https://learn.microsoft.com/en-us/minecraft/creator/documents/commandspopularcommands)
[List and summary of commands](https://learn.microsoft.com/en-us/minecraft/creator/commands/commands)

#### ＜ワールド　新規作成or切り替え＞
```bash:bash
# ワールドフォルダーの確認
MC "ls -1 worlds"

# フォルダ名をセット
World_Folder=" 新規作成or切り替え のフォルダ名"
# 変更
MC "sed -i -e '/^level-name=/c '\"level-name=$World_Folder\" server.properties"

# 確認
MC "grep \"level-name\" server.properties"
```

#### ＜手動バックアップ＞
```bash:bash
MC "mc_save"
```

#### ＜バックアップの表示＞
```bash:bash
MC "show_worlds_bak"
# 表示数を制限する場合
MC "show_worlds_bak 表示数"
```

#### ＜バックアップの復元＞
```bash:bash
それぞれ ＜バックアップの表示＞ を参照する

# 既存のワールドを上書き
MC "restore_world 'コミット ID' 'ワールドフォルダ名'"

# 別のワールドとして復元
MC "restore_another 'コミット ID' 'ワールドフォルダ名' '新しいフォルダ'"
```
#### ＜各設定ファイルのバックアップ・履歴表示・復元＞
```bash:
# バックアップ
MC "backup_props"
# バックアップの履歴
MC "show_props_bak"
MC "show_props_bak 表示数"
# バックアップの復元
Commit_ID="バックアップの履歴参照"
RestoreMC=" allowlist.json permissions.json server.properties のどれか"
MC "git --git-dir=\"\$Props_Bak_DIR/.git\" \
        --work-tree=\"\$Mine_DIR\" \
        restore -W -s $Commit_ID -- $RestoreMC"
```

#### ＜バックアップ間隔の変更＞
```bash:bash
# h:時 m:分 s:秒　5hとか20mとか120sみたいな感じで指定　例）TIME="1h"
TIME="次のバックアップまでの時間"
sudo -u minecraft sed -i -e '/^BK_INTERVAL=/c '"BK_INTERVAL=$TIME" /opt/MC_Manage/backup.sh

# 変更の反映
sudo systemctl reload minecraft

# 確認
sudo -u minecraft XDG_RUNTIME_DIR=/run/user/$(id -u minecraft) systemctl --user status nonstop_save.timer

# バックアップの一時停止
# sudo -u minecraft XDG_RUNTIME_DIR=/run/user/$(id -u minecraft) systemctl --user stop nonstop_save.timer
# 
# バックアップの再開
# sudo bash /opt/MC_Manage/backup.sh
```

#### ＜最新以外に保持するバックアップの個数を変更＞
```bash:bash
OOD="最新以外に保持するバックアップの個数"
sudo -u minecraft sed -i -e '/^\  SKIP=${2:-.*}$/c \  SKIP=${2:-'"$OOD}" /opt/MC_Manage/git_delete.bash
```

#### ＜最新ではないバックアップの保存期間を変更＞
　バックアップを行ったタイミングで指定した期間が過ぎていれば削除が実行されます
```bash:bash
# 指定方法（末尾の s や .ago は付けても付けなくても良い）
#   90.seconds.ago  1.minutes  2.hour （90秒 1分 2時間）
#   3.days  2.week  1.months （3日 2週間 1か月）
#   never  now （無期限 即時）
# 例）Expire_Date="1.weeks.ago"
Expire_Date="保存期間を代入"

sudo -i -u minecraft git -C "\$Props_Bak_DIR" config --local gc.reflogExpireUnreachable "$Expire_Date"
sudo -i -u minecraft git -C "\$Worlds_Bak_DIR" config --local gc.reflogExpireUnreachable "$Expire_Date"
```

#### ＜ホワイトリストの権限を調整する＞
※ホワイトリストへの書き込みを制限した場合、"allowlist add/remove" 等をするとマイクラがクラッシュします。
```bash:bash
# 一時的にホワイトリストに書き込めなくする
sudo -u minecraft chmod a-w /opt/minecraft/allowlist.json

# 書き込み可に戻す
sudo -u minecraft chmod ug+w /opt/minecraft/allowlist.json

# 確認
sudo ls -l /opt/minecraft/allowlist.json | awk '{print $1,$NF}'
```

#### ＜バックアップデータの手動削除＞
**```sudo -i -u minecraft```**
```bash
***確認***
# 設定される期限の確認
  cat "$Worlds_Bak_DIR/.git/config"

# そのうち削除されるバックアップの確認
  git -C "$Worlds_Bak_DIR" fsck --lost-found
# または
  git -C "$Worlds_Bak_DIR" reflog expire --all  ;# 期限切れの参照履歴を削除
  git -C "$Worlds_Bak_DIR" prune --dry-run --verbose
```
```bash
***削除***
# 期限切れのすべてのバックアップを削除
  git -C "$Worlds_Bak_DIR" gc
# または
  git -C "$Worlds_Bak_DIR" reflog expire --all
  git -C "$Worlds_Bak_DIR" prune --verbose

# 最新以外のすべてのバックアップを削除
  git -C "$Worlds_Bak_DIR" reflog expire --expire-unreachable=all --all
  git -C "$Worlds_Bak_DIR" gc --aggressive --prune=now

# 最新含めたすべてのバックアップを削除
  git -C "$Worlds_Bak_DIR" reflog expire --expire=all --expire-unreachable=all --all
  git -C "$Worlds_Bak_DIR" gc --aggressive --prune=now
```
    ・git reflog expire --all
        ：gc.reflogExpireUnreachable に設定した以前の参照をすべての参照履歴から消す
    ・git reflog expire --expire-unreachable=all --all
        ：最新以外のバックアップをすべて期限切れにする
    ・git reflog expire --expire=all --expire-unreachable=all --all
        ：最新含めたすべてのバックアップを期限切れにする

#### ＜サーバーデータ・ユーザーデータの削除＞
 Minecraft Server をアンインストールし、ユーザー・グループ含むすべてのデータを削除します
```bash:bash
Del_USER=minecraft
Del_GROUP=minecraft

  # バックアップを作成して完全削除
  sudo deluser --system --remove-all-file --backup-to ~/ "$Del_USER"
# または #
  # HOME 配下のみ削除
  sudo deluser --system --remove-home "$Del_USER"
  # バックアップフォルダも削除
  sudo rm -rf "/opt/MC_Manage"

# グループの削除
sudo delgroup --system --only-if-empty "$Del_GROUP"
```
    ・--system
        ：ユーザー/グループがシステムユーザー/グループである場合にのみ削除します。
    ・--remove-home
        ：home ディレクトリを削除します。
    ・--remove-all-file
        ：削除するユーザーが所有しているファイルを、システム全体から走査チェックしてすべて削除します（home ディレクトリも削除します）。
    ・--backup-to
        ：バックアップアーカイブの保存先ディレクトリを指定します。
    ・--only-if-empty
        ：1人も所属ユーザーがいなければ削除します。