Telegram 監視通知システム
// 最終更新: 2026-05-14 — raid-watch / cert-watch / perc-watch / WP backup 通知を追加
最新 全 7 unit が稼働中。 障害・期限・dump失敗時に Telegram bot で即通知。 設定変化時のみ送信する state 比較方式。
通知マトリクス
| ホスト | unit / cron | 周期 | 監視対象 | 新旧 |
|---|---|---|---|---|
| maguro | supermicro-watch.timer | 5min | md0 / storage 90%超 / NFS停止 / ATAエラー / LUKS×5 (raid1-4 + storage-cache) | storage-cache 追加 (2026-05-14) |
| maguro | mdadm-watch.timer | 5min | /proc/mdstat md0 状態変化 | — |
| maguro | raid-watch.timer | 5min | IPMI SEL (Drive Fault / Rebuild) | NEW 2026-05-14 |
| maguro / R640 | cert-watch cron 06:30 | daily | LE 全証明書 <14日警告 / 失効 | NEW 2026-05-14 |
| R640 | perc-watch.timer | 5min | SAS×8 + NVMe×2 (smartctl megaraid) + megaraid kernel事件 | NEW 2026-05-14 |
| R640 | wp-katuocloud-db-backup cron 02:30 | daily | katuocloud_wp dump 失敗 + サイズ<10KB 警告 | NEW 2026-05-14 |
Bot 共通設定
BOT_TOKEN="8581883769:AAGkGLkT1bJQ1i0dXmmIvwXm_FfyCmGxSaM"
CHAT_ID="8559271919"
# 全 script で共通の notify 関数
notify() {
curl -sS -4 --connect-timeout 5 --max-time 15 \
-X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
--data-urlencode "text=$1" >/dev/null || true
}
通知絵文字の意味
| 絵文字 | 重大度 | 例 |
|---|---|---|
| 🔴 | 重大 — 即時対応必要 | RAID degraded、 cert 失効、 dump 失敗 |
| 🟠 | 警告 — 早めに確認 | storage 90%、 cert <14日、 dump サイズ異常、 SMART unknown |
| 🟢 | 復旧 — 過去の異常解消 | RAID rebuild 完了、 SMART OK 復帰 |
| 🧪 | テスト送信 | 各 script の --test 引数 |
script 配置
| ホスト | スクリプト | state |
|---|---|---|
| maguro | /usr/local/bin/supermicro_watch_telegram.sh | /var/lib/supermicro-watch/ |
| maguro | /usr/local/bin/mdadm_watch_telegram.sh | /var/lib/mdadm_watch/last_state |
| maguro | /usr/local/bin/raid_watch_telegram.sh | /var/lib/raidwatch/last_sel_id |
| maguro / R640 | /usr/local/bin/cert_watch_telegram.sh | /var/lib/cert-watch/<name>.state |
| R640 | /usr/local/bin/perc_watch_telegram.sh | /var/lib/perc-watch/<disk>.state + journal_cursor |
| R640 | /usr/local/bin/wp-katuocloud-db-backup.sh | /var/log/wp-katuocloud-db-backup.log |
systemd timer 一覧 (maguro)
$ systemctl list-timers --all | grep -E "watch|cert" raid-watch.timer OnUnitActiveSec=5min → /usr/local/bin/raid_watch_telegram.sh supermicro-watch.timer OnUnitActiveSec=5min → /usr/local/bin/supermicro_watch_telegram.sh mdadm-watch.timer OnUnitActiveSec=5min → /usr/local/bin/mdadm_watch_telegram.sh
cert-watch の動作
毎日 06:30 に /etc/letsencrypt/live/*/fullchain.pem を openssl で expiry 取得。 state ファイルと比較し、 状態変化時のみ通知。
NOW=$(date +%s)
for cert in /etc/letsencrypt/live/*/fullchain.pem; do
END=$(openssl x509 -enddate -noout -in "$cert" | cut -d= -f2)
DAYS=$(( ($(date -d "$END" +%s) - NOW) / 86400 ))
STATE="/var/lib/cert-watch/${NAME}.state"
PREV=$(cat "$STATE" 2>/dev/null || echo ok)
if (( DAYS < 0 )); then NEW=expired
elif (( DAYS < 14 )); then NEW=warn
else NEW=ok; fi
[[ "$PREV" != "$NEW" ]] && notify "..."
echo "$NEW" > "$STATE"
done
EXPIRED即時検出の実績 (2026-05-14): cert-watch 設置初回実行で
maguro-storage.duckdns.org (期限 2026-04-08、 1ヶ月放置) を即検出 → 用途確認後 完全撤去。 同じ仕組みで今後の cert 失効を未然に防げる。
perc-watch (R640 HW RAID)
R640 の PERC H730P 配下の SAS×8 + NVMe×2 を smartctl で監視。 megaraid 経由のためバスデバイス指定が必要。
# SAS (megaraid 経由) for n in 0..7; do smartctl -H -d megaraid,$n /dev/bus/0 | grep "Health Status" done # NVMe (直接) smartctl -H /dev/nvme0 smartctl -H /dev/nvme1 # megaraid kernel イベント journalctl -k --after-cursor=$LAST | grep -iE "megaraid_sas.*(error|degraded|fail|rebuild)"
SAS と NVMe の出力差: SAS は
SMART Health Status: OK、 NVMe は SMART overall-health self-assessment test result: PASSED と表記違うため、 regex は両対応 grep -iE 'overall-health|Health Status'、 OK判定は grep -qiE 'PASSED|: OK( |$)'。
IPMI ドライバの永続化 (maguro)
raid-watch.timer (ipmitool 経由 IPMI SEL 取得) を動作させるには /dev/ipmi0 が必要。 Supermicro M/B では起動時に IPMI module をロードしないと出てこないため、 /etc/modules-load.d/ipmi.conf で永続化。
# /etc/modules-load.d/ipmi.conf ipmi_si ipmi_devintf ipmi_msghandler
WP DB backup の失敗通知
katuocloud.com の WordPress DB (katuocloud_wp) を daily 02:30 に mariadb-dump | gzip で保存。 失敗時は ERR trap で Telegram通知、 dump サイズが極端に小さい (<10KB) 場合も警告。 認証は /root/.my-wpuser.cnf (chmod 600) で分離。
# /etc/cron.d/wp-katuocloud-backup 30 2 * * * root /usr/local/bin/wp-katuocloud-db-backup.sh # 保管先 /mnt/data/backup/wp/katuocloud_wp/katuocloud_wp-YYYYMMDD-HHMMSS.sql.gz # 14日保持 (find -mtime +14 -delete)
テスト送信
各 script に --test 引数。 設置時の疎通確認や Bot動作確認に使用。
$ /usr/local/bin/cert_watch_telegram.sh --test 🧪 cert監視テスト OK (sm-storage-01) $ /usr/local/bin/perc_watch_telegram.sh --test 🧪 PERC監視テスト OK (katuo-PowerEdge-R640)
改善候補 (未実装)
- Deadman switch: 通知が一定時間来なかったら「監視自体が止まってる」とみなす仕組み
- certbot.renew 失敗時通知: 現在は cert-watch (state 比較) で間接検知。 renewal 自体の失敗を OnFailure unit で直接通知に改善余地
- nginx upstream エラー監視: SNI passthrough 先 (maguro:443) の不通を即時検知
- Cloudflare cf-tunnel 状態: tunnel 経由サービスがあれば