Proxmox Backup Server(pbs01)で毎晩バックアップを取っていたけど、見直したら穴がいくつかあった。
- Minecraftのサーバーも、ほかと一緒に3時に取っていた
- pbs01自身はどこにもバックアップされていない
- 失敗しても誰にも知らされない
そこで、ジョブを3本に分けた。
| 時刻 | 対象 | 保存先 |
|---|---|---|
| 毎日 3:00 | pbs01とmc01以外すべて | pbs01 |
| 毎日 4:30 | mc01(Minecraft) | pbs01 |
| 毎月1日 4:00 | pbs01自身 | ノード②のHDD |
Minecraftは直前にワールドを保存する
スナップショットのバックアップは、始まった瞬間の状態をそのまま保存する。そのときワールドの書き込みが途中だと、中途半端なデータが残る。
そこで、Proxmoxのバックアップの「フックスクリプト」を使って、開始の直前に save-all flush を実行するようにした。コマンドはQEMUゲストエージェント経由でVMの中に送るので、ネットワークの設定はいらない。
#!/bin/bash
# vzdumpから呼ばれる: $1=フェーズ $3=VMID
phase="$1"; vmid="$3"
[ "$vmid" = "3020" ] || exit 0
if [ "$phase" = "backup-start" ]; then
for s in lobby survival; do
qm guest exec 3020 --timeout 60 -- docker exec "$s" rcon-cli save-all flush >/dev/null \
&& echo "hook: $s saved" || echo "hook: $s save FAILED"
done
sleep 3
fi
exit 0
フックスクリプトは画面からは設定できないので、コマンドでジョブに登録する。
pvesh set /cluster/backup/<ジョブID> --script /var/lib/vz/snippets/mc-save-hook.sh
バックアップのログに hook: lobby saved と hook: survival saved が出れば成功。
pbs01自身はノード②のHDDへ
pbs01が自分自身を自分にバックアップしても、壊れたときに戻せない。なので、別のノード(②)にある古いHDDに入れることにした。
ただ、②のHDDは②だけのストレージなので、③で動くpbs01からは書き込めない。そこで②のHDDの一部をNFSで共有して、ほかのノードから使えるストレージとして追加した。
apt install -y nfs-kernel-server
mkdir -p /mnt/pve/local-hdd/nfs-dump
echo "/mnt/pve/local-hdd/nfs-dump <管理用VLANのサブネット>(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports
exportfs -ra
データ用の3TBのHDDはバックアップ対象から外してある(backup=0)ので、取るのはOSのディスクだけ。数GBで済む。
結果をDiscordに通知
Proxmox VE 9の通知機能で、Webhookの通知先を作ってDiscordに送るようにした。
- 通知先:Webhook(POST、
Content-Type: application/json) - 本文:
{"content": "[{{ severity }}] {{ escape title }}"} - Matcher:
type=vzdumpで、重要度 error・warning・info
Discordは1件2000文字までなので、ログ全体が入る本文は送らず、タイトルだけにしている。詳しくはProxmoxのタスク一覧で見ればいい。
これで、3:00と4:30に「backup successful」が届くようになった。成功の通知がうるさくなったら、infoを外して失敗だけにする予定。
残りはオフサイト(家の外への保存)。DBとGitとパスワードだけでも、クラウドに置いておきたい。