本文へ移動
ch1w4

www.ch1w4.com / blog / backup-jobs

バックアップを3本に分けて、Discordに通知させた

#proxmox#backup

Proxmox Backup Server(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に送るようにした。

Discordは1件2000文字までなので、ログ全体が入る本文は送らず、タイトルだけにしている。詳しくはProxmoxのタスク一覧で見ればいい。

これで、3:00と4:30に「backup successful」が届くようになった。成功の通知がうるさくなったら、infoを外して失敗だけにする予定。

残りはオフサイト(家の外への保存)。DBとGitとパスワードだけでも、クラウドに置いておきたい。