14本目では、読み取り専用ヘルスチェックをsystemd timerで定期実行し、結果をローカルjournalへ残しました。次に考えたくなるのが、YELLOWやREDを見逃さないための通知です。
ただし、いきなりメールやWebhookへ接続すると、誤送信、秘密情報の混入、同じ障害の連続送信が起きやすくなります。15本目では外部へ送らず、実際に送る予定の通知文だけをdry-runで作って確認します。
この記事では送信しません
Webhook、メール、チャット、外部APIへの通信は行いません。トークンやURLも用意しません。確認するのはヘルスチェック結果から作ったローカルのプレビューだけです。
到達点と扱わないこと
- 到達点: GREEN / YELLOW / REDから、同じ書式の通知プレビューを1コマンドで表示する
- 到達点: 終了コード0 / 1 / 2をそのまま呼び出し側へ返す
- 非目標: 外部送信、秘密情報の読み込み、自動修復、再実行、通知抑制の本番運用
通知文に必要な5項目

- 確認時刻
- ホスト名
- GREEN / YELLOW / REDと終了コード
- ヘルスチェックが返した1行要約
- 人が次に確認する場所
snapshotの全文、環境ファイル、パスワードファイル、Webhook URLは含めません。通知文は原因を断定する場所ではなく、調査を始めるための索引です。
dry-runスクリプトを配置する
完成版はリポジトリのexamples/ouchi-lab-backup-notification-preview.shです。13本目の固定パスにあるヘルスチェックだけを呼び出し、最初の1行と終了コードを通知プレビューへ変換します。
sudo install -o root -g root -m 755 \
./ouchi-lab-backup-notification-preview.sh \
/usr/local/sbin/ouchi-lab-backup-notification-preview
sudo /usr/bin/bash -n \
/usr/local/sbin/ouchi-lab-backup-notification-preview
スクリプト内には送信先、認証情報、通信コマンドを置きません。固定したヘルスチェック以外の任意コマンドを引数から受け取らない設計にします。
1コマンドで通知プレビューを作る
sudo /usr/local/sbin/ouchi-lab-backup-notification-preview
status=$?
printf 'preview_exit=%s
' "$status"
正常時の例です。時刻やsnapshot IDは環境ごとに変わります。
DRY_RUN=true
SEND_ENABLED=false
checked_at=2026-08-08T07:00:00+09:00
host=home-server
result=GREEN
exit_code=0
summary=ouchi-lab-backup-health: GREEN: 3つの証拠が一致しました
next_action=対応不要。次回の定期確認を待つ
preview_exit=0
終了コードを消さない
プレビュー生成に成功しても、元のヘルスチェックがREDなら終了コードは2のまま返します。通知文が作れたことと、バックアップが正常なことは別だからです。
| 結果 | 終了コード | 次の行動 |
|---|---|---|
| GREEN | 0 | 次回の定期確認を待つ |
| YELLOW | 1 | timerと直近時刻を確認 |
| RED | 2 | journalから原因切り分け |
| 未知 | 元の値 | スクリプトと実行環境を確認 |
秘密情報が混ざっていないか確認する
sudo /usr/local/sbin/ouchi-lab-backup-notification-preview \
| grep -E 'PASSWORD|TOKEN|WEBHOOK|https?://'
何も表示されないことを確認します。ただし、このgrepだけで完全な安全を保証できるわけではありません。環境ファイルの内容を出力していないこと、出力対象を最初の1行に限定していることもコードで確認します。
dry-runの安全境界

- 行う: ローカルのヘルスチェック実行、結果の整形、標準出力、終了コードの引き継ぎ
- 行わない: curlやメール送信、Webhook、外部DNS接続、トークン読込、自動修復、バックアップ再実行
dry-runスクリプトをsystemd timerへ組み込むのもまだ先です。まず手動でGREEN / YELLOW / REDの3パターンをレビューし、文面と情報量を確定します。
安全に検証するチェックリスト
bash -nが無出力で終わるDRY_RUN=trueとSEND_ENABLED=falseが毎回表示される- 終了コードが元のヘルスチェックと一致する
- パスワード、トークン、URL、環境ファイル内容が出ない
- ネットワーク通信コマンドと自動修復コマンドがない
まとめ
15本目では、バックアップヘルスチェックの結果を通知文へ変換し、外部送信せずローカルで確認するdry-runを作りました。先に文面、終了コード、秘密情報の境界を固めておけば、将来通知先を追加するときも「判定」「文面」「送信」を分離できます。
次に外部通知へ進む場合も、送信先の秘密情報管理、連続通知の抑制、GREEN復旧通知、タイムアウトを別々に設計してから有効化します。



コメント