レンタルサーバー(共有ホスティング)と小規模な VPS の死活監視だけを担う小さな道具。 各サーバーで cron から動く小さなプログラムが基本的な状態を集めて、自分で建てた受信サーバーへ送る。 受信側はそれを保存して、届かなくなったら知らせる。最後の一点が本体で、監視項目の数を競う道具ではない。
サーバーが落ちたことに、たいてい人は自分では気づかない。気づくのは「サイトが見られない」と 誰かに言われたときで、そこまでの間ずっと止まっている。監視を入れていない理由も毎回同じで、 入れるほうが面倒だからである。
とくにレンタルサーバーは条件が厳しい。root 権限が無い。パッケージを入れられない。常駐プロセスを 置けない。監視エージェントを入れる前提の道具は、この時点でほぼ全部使えない。 heartpost は「cron から 1 回だけ動いて終わる 1 個のファイル」という形にして、この制約を最初から前提にしている。
設計の中心にあるのは「来なかったこと」の検知。 値が異常になったことを知らせる仕組みは山ほどあるが、 サーバーが完全に止まると異常値すら送られてこない。何も届かない状態は、 「すべて健康で静か」と見た目が区別できない。そこを分けるのがこの道具の役目。
置くのは実行ファイル 1 個と設定ファイル 1 個。あとは crontab に 1 行足すだけ。 root もパッケージ管理も要らない。付属のスクリプトが SSH 経由でこの一連をやる。
止まっている間ずっと鳴り続けない。状態が変わったときだけ通知する。 復帰も 1 回知らせる。鳴りっぱなしの監視は、結局みんな通知を切る。
既定では実行間隔の 3 倍だまってから「欠報」と判断する。 ホストが一時的に重かった、cron がバックアップと重なった、程度で起こされない。
受信側も自分のサーバーに建てる。外部サービスに各サーバーの状態を預けない。 アカウントの発行も課金も、増えていく設定画面も無い。
画面は 1 枚。並ぶのはサーバー名・状態・最終受信・経過時間・ディスク使用率・load だけ。 ダッシュボードを設計する作業が発生しない。
受け取ったものは 1 行 1 レポートのテキストとしてディスクに追記し、指定した日数で消す。 DB の構築・バックアップ・バージョン上げが増えない。
| 場面 | 入れていない今 | 入れたあと |
|---|---|---|
| サーバーが停止した | 誰かに指摘されるまで分からない。指摘は数時間後のことも翌日のこともある | 実行間隔の 3 倍(既定 15 分)で通知が 1 通届く |
| ディスクが埋まりかけている | 埋まって書き込みが失敗してから気づく | 一覧で使用率が並ぶので、埋まる前に目に入る |
| cron が静かに止まっていた | 成果物が出ていないことで後から気づく | レポート自体が来なくなるので欠報として出る |
| 証明書の期限が近い(VPS 側) | 期限切れで初めて分かる | 残り日数と更新タイマーの状態が一覧に出る |
| サーバーが 10 台に増えた | どれを見て回ればいいか分からなくなる | 1 枚の表に全部並び、欠報が上に来る |
レポートには共有鍵で計算した署名(HMAC-SHA256)を付ける。受信側は署名と時刻を検証し、 鍵が違うもの・本文が書き換えられたもの・古すぎる時刻のものを受け付けない。 共有ホスティングは他人と同じホストに同居するので、鍵ファイルの権限が緩いと agent は起動を拒否する。
agent は動く場所に合わせて 2 通りの構成を持つ。どちらも読むだけで、サーバーへ書き込む処理は持たない。 項目は 1 つずつ設定で切れる。
host | ホスト名・OS |
loadavg | 負荷平均 1 / 5 / 15 分 |
memory | 物理メモリ容量 |
disk | マウント別の使用状況 |
cron | 登録されている cron 一覧 |
process | 自分から見えるプロセス |
cpu | CPU 使用率 |
network | 累積の送受信バイト数 |
apache_log | 当日のアクセス数と直近のアクセス |
system | CPU・メモリ・ディスク・稼働時間 |
process | プロセス状況 |
cron | cron の登録内容 |
services | 指定した systemd ユニットの状態 |
ssl | 証明書の残り日数と更新タイマー |
ssh | 認証ログの直近の出来事 |
nginx | アクセスログの直近の出来事 |
updates | 適用できる更新の数 |
自分の VPS に実行ファイルと設定を置いて起動する。通知先(webhook)と、 agent ごとの共有鍵を書く。保存先のディレクトリを 1 つ決める。データベースは要らない。
heartpost-monitor -config /etc/heartpost/monitor.toml
付属スクリプトが SSH で実行ファイルと設定を配り、crontab に 1 行足す。 既定は 5 分間隔。root 権限は要らない。
*/5 * * * * $HOME/heartpost/bin/heartpost-agent --config $HOME/heartpost/etc/agent.toml
ブラウザで一覧を開くと全台が並ぶ。欠報が出たら上に来て、同時に webhook が 1 通飛ぶ。 普段は見に行かなくてよい。見に行かなくても済むようにするのがこの道具の目的である。
実行間隔と欠報のしきい値は必ず一緒に変える。
間隔は agent 側の cron 行、しきい値は monitor 側の設定にある。別のマシンの別のファイルにあるので、 片方だけ変えると「すぐ鳴りすぎる」か「いつまでも鳴らない」のどちらかになる。 既定はしきい値が間隔の 3 倍。
この monitor 自身は、別の手段で外から見る。
monitor が落ちていると欠報に気づけない。落ちた monitor の見た目は「全台が健康で静か」と同じである。
受信側には認証なしで応答する健康確認用の入口(/healthz)を用意してあるので、
外部の死活監視サービスか別ホストの cron から、そこを見ておく。
これは後で直せる穴ではなく、1 点にまとめる監視が構造的に持つ穴なので、
隠さずに前提として扱う。
小さく保つために切り捨てている範囲。ここを求める場合は Prometheus・Zabbix・商用の監視サービスのほうが合う。
| 項目 | 状態 | 補足 |
|---|---|---|
| agent(レンタル / VPS 両対応) | 実装済み | 17 項目の収集・署名送信・二重起動防止・鍵権限の強制 |
| 受信 monitor | 実装済み | 署名検証・保存と保持期間・欠報判定・webhook 通知・一覧画面 |
| ビルド対象 | 確認済み | Linux(amd64 / arm64)と FreeBSD(amd64) |
| 配布(リリース版の実行ファイル) | 公開済み | v0.1.0(linux/amd64・linux/arm64・freebsd/amd64) |
| systemd の設定ファイル | 実機未検証 | 同梱済みだが Linux 実機での確認が残っている |
| メール通知 | 見送り | webhook のみ。必要になった時点で判断する |