バックアップの失敗にずっと気づかなかったので対策した話

こんにちは。日々是発見が楽しみな西山です。

完璧に作ったと思ったシステムが実はちゃんと動いてなくて、がっかりしたり冷や汗をかいたり怒られた経験、どなたも一度はしていますよね。
私も最近久しぶりにやらかしたので、失敗の深堀りと導入した対策をシェアしたいと思います。
しくじったのがお客様のシステムではなく自分用環境だったので、誰にもご迷惑をかけずに学びを得られたのが救いですね……。

止まったlsyncd

以前の記事で書いたとおり、私は自宅でNextcloudを立ててファイルを色々保存しています。
このサーバーはオンプレミスで、もし自宅が災害に遭ったり落雷でサーバーが故障したらデータは消えてなくなってしまいます。
なので念には念を入れ、Wasabiストレージにlsyncdでファイルをコピーしてクラウドバックアップを作っています。
……と、この辺まで書けば何が起こったかお分かりでしょう。とある弾みでバックアップが停止し、それに気づかないまま数ヶ月が過ぎていたのです。

消されたrpmパッケージ

このNextcloudサーバー(AlmaLinux)では、S3互換ストレージをローカルファイルシステムのようにマウントできる「Rclone」を使い、NextCloudサーバー上で「/cloud」というディレクトリにマウントした上で、lsyncdのtargetに/cloudを指定して同期させていました。

それが止まったのは、今年(2025年)の2月頃にサーバー上でdnf updateを実行したのがきっかけでした。
Rcloneは「fusermount」という、ユーザー権限でマウント操作を可能にするライブラリに依存しています。どうやらこの時期に、AlmaLinux側でパッケージ「fusermount」が後継の「fusermount3」に差し替えられたようなのです。
当時の状況をすべて把握はできてないですが、古い「fusermount」は他の関連ライブラリの更新に引きずられたのか削除されていました。そして、後継の「fusermount3」は明示的に「dnf install fusermount3」としないと入りませんが、そもそも差し替わったことに気づいていなかったので私は何もしませんでした。
結果サーバーから「fusermount」コマンドが消え、依存ライブラリを失ったRcloneが止まり、「/cloud」のマウントが外れてlsyncdはメインプロセスだけがゾンビ状態で起動していました。
lsyncdの動作状況も特にチェックしておらず、Wasabiストレージは念のためのバックアップという位置づけで普段は全く中を見ていなかったので、止まっていることにほぼ半年間気づきませんでした。

何を監視しよう?

再発防止策ですが、とにかく明日再発しても気付けるようベタに監視スクリプトを書いてcronで回すことにしました。カッコよくイケてるメトリクスダッシュボードなんか作るのは後回しです。
ChatGPT相手に何を監視するか相談してコードも書いたもらいましたが、最終的に何をどう監視するかは自分で決めました。以下の3点が今回のポイントです。

  1. Rcloneが止まるとマウントポイントの「/cloud」が消えるので、これを検知トリガーに
  2. lsyncdが生きてるかはsystemctl is-activeコマンドで判定できる
  3. 上2つのどちらかを検知したらメールで通知する

そしてできたスクリプトがこちらです。通知をメールではなくSlackなどにするのはお好みで。

#!/bin/bash

# 通知先メールアドレス
MAIL_TO="server-reports@example.com"
HOSTNAME=$(hostname)
NOW=$(date '+%Y-%m-%d %H:%M:%S')

ERRORS=""

# --- /cloud マウント確認 ---
if ! mountpoint -q /cloud; then
           ERRORS+="[ERROR] /cloud is not mounted\n"
fi

# --- lsyncd (systemd 管理) 稼働確認 ---
if ! systemctl is-active --quiet lsyncd; then
           ERRORS+="[ERROR] lsyncd service is not active\n"
fi

# --- 異常があればメール送信 ---
if [ -n "$ERRORS" ]; then
           echo -e "[$NOW] Check on $HOSTNAME:\n\n$ERRORS" \
                           | mail -s "[ALERT] Cloud/Lsyncd check failed on $HOSTNAME" -r "server-reports@example.com" -S mta=smtp://mail.example.com:25 -S smtp-auth=none -S v15-compat=yes "$MAIL_TO"
fi

バックアップ系のトラブルは「静かに止まって誰も気づかない」のがあるあるでやっかいですね。
こういうのをAIでいい感じに監視設定できれば……という話は同僚の中でちょいちょい出るのですが、「どこをチェックポイントにするか」のキモどころ(上で書いた3点の方針)を決めるのが難しいと思います。
個人的に「キモどころのヒントをAIに出してもらうのは何とかできるけど、どのキモどころをどのように監視するかを決めるのにAIはまだ役不足」だと感じる2025年の年の瀬でした。