Telegram 監視通知システム

// 最終更新: 2026-05-14 — raid-watch / cert-watch / perc-watch / WP backup 通知を追加

最新 全 7 unit が稼働中。 障害・期限・dump失敗時に Telegram bot で即通知。 設定変化時のみ送信する state 比較方式。

通知マトリクス
ホストunit / cron周期監視対象新旧
magurosupermicro-watch.timer5minmd0 / storage 90%超 / NFS停止 / ATAエラー / LUKS×5 (raid1-4 + storage-cache)storage-cache 追加 (2026-05-14)
maguromdadm-watch.timer5min/proc/mdstat md0 状態変化—
maguroraid-watch.timer5minIPMI SEL (Drive Fault / Rebuild)NEW 2026-05-14
maguro / R640cert-watch cron 06:30dailyLE 全証明書 <14日警告 / 失効NEW 2026-05-14
R640perc-watch.timer5minSAS×8 + NVMe×2 (smartctl megaraid) + megaraid kernel事件NEW 2026-05-14
R640wp-katuocloud-db-backup cron 02:30dailykatuocloud_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 経由サービスがあれば