対象: heartpost(OSS・Apache-2.0)

heartpost — サーバーが黙ったことに気づくための道具

2026-09-04 時点の実装にもとづく  ·  v0.1.0  ·  GitHub Releases  ·  github.com/ishizakahiroshi/heartpost

レンタルサーバー(共有ホスティング)と小規模な VPS の死活監視だけを担う小さな道具。 各サーバーで cron から動く小さなプログラムが基本的な状態を集めて、自分で建てた受信サーバーへ送る。 受信側はそれを保存して、届かなくなったら知らせる。最後の一点が本体で、監視項目の数を競う道具ではない。

なぜ要るのか

サーバーが落ちたことに、たいてい人は自分では気づかない。気づくのは「サイトが見られない」と 誰かに言われたときで、そこまでの間ずっと止まっている。監視を入れていない理由も毎回同じで、 入れるほうが面倒だからである。

とくにレンタルサーバーは条件が厳しい。root 権限が無い。パッケージを入れられない。常駐プロセスを 置けない。監視エージェントを入れる前提の道具は、この時点でほぼ全部使えない。 heartpost は「cron から 1 回だけ動いて終わる 1 個のファイル」という形にして、この制約を最初から前提にしている。

設計の中心にあるのは「来なかったこと」の検知。 値が異常になったことを知らせる仕組みは山ほどあるが、 サーバーが完全に止まると異常値すら送られてこない。何も届かない状態は、 「すべて健康で静か」と見た目が区別できない。そこを分けるのがこの道具の役目。

何が嬉しいか

導入がサーバー 1 台につき数分

置くのは実行ファイル 1 個と設定ファイル 1 個。あとは crontab に 1 行足すだけ。 root もパッケージ管理も要らない。付属のスクリプトが SSH 経由でこの一連をやる。

1 回鳴って、直ったらもう 1 回だけ鳴る

止まっている間ずっと鳴り続けない。状態が変わったときだけ通知する。 復帰も 1 回知らせる。鳴りっぱなしの監視は、結局みんな通知を切る。

1 回の取りこぼしで騒がない

既定では実行間隔の 3 倍だまってから「欠報」と判断する。 ホストが一時的に重かった、cron がバックアップと重なった、程度で起こされない。

置き場所が自分の手の内にある

受信側も自分のサーバーに建てる。外部サービスに各サーバーの状態を預けない。 アカウントの発行も課金も、増えていく設定画面も無い。

覚えることが少ない

画面は 1 枚。並ぶのはサーバー名・状態・最終受信・経過時間・ディスク使用率・load だけ。 ダッシュボードを設計する作業が発生しない。

受信側にデータベースが要らない

受け取ったものは 1 行 1 レポートのテキストとしてディスクに追記し、指定した日数で消す。 DB の構築・バックアップ・バージョン上げが増えない。

入れなかった場合との違い

場面入れていない今入れたあと
サーバーが停止した 誰かに指摘されるまで分からない。指摘は数時間後のことも翌日のこともある 実行間隔の 3 倍(既定 15 分)で通知が 1 通届く
ディスクが埋まりかけている 埋まって書き込みが失敗してから気づく 一覧で使用率が並ぶので、埋まる前に目に入る
cron が静かに止まっていた 成果物が出ていないことで後から気づく レポート自体が来なくなるので欠報として出る
証明書の期限が近い(VPS 側) 期限切れで初めて分かる 残り日数と更新タイマーの状態が一覧に出る
サーバーが 10 台に増えた どれを見て回ればいいか分からなくなる 1 枚の表に全部並び、欠報が上に来る

仕組み

レンタルサーバー A cron → heartpost-agent(1 回で終了) レンタルサーバー B cron → heartpost-agent VPS(monitor と同居可) systemd timer → heartpost-agent 署名付き JSON を POST heartpost-monitor 署名を検証して保存 来ない相手を数える 一覧画面を出す webhook 欠報 / 復帰を 1 通ずつ 一覧画面 ブラウザで 1 枚
送る側は常駐しない。受信側だけが常駐する。データベースも外部サービスも間に入らない。

送信は署名付き

レポートには共有鍵で計算した署名(HMAC-SHA256)を付ける。受信側は署名と時刻を検証し、 鍵が違うもの・本文が書き換えられたもの・古すぎる時刻のものを受け付けない。 共有ホスティングは他人と同じホストに同居するので、鍵ファイルの権限が緩いと agent は起動を拒否する。

集まる情報

agent は動く場所に合わせて 2 通りの構成を持つ。どちらも読むだけで、サーバーへ書き込む処理は持たない。 項目は 1 つずつ設定で切れる。

レンタルサーバー向け(9 項目)

hostホスト名・OS
loadavg負荷平均 1 / 5 / 15 分
memory物理メモリ容量
diskマウント別の使用状況
cron登録されている cron 一覧
process自分から見えるプロセス
cpuCPU 使用率
network累積の送受信バイト数
apache_log当日のアクセス数と直近のアクセス

Linux VPS 向け(8 項目)

systemCPU・メモリ・ディスク・稼働時間
processプロセス状況
croncron の登録内容
services指定した systemd ユニットの状態
ssl証明書の残り日数と更新タイマー
ssh認証ログの直近の出来事
nginxアクセスログの直近の出来事
updates適用できる更新の数

監視したいサービスは systemd のユニット名を並べて指定する。特定の製品に紐づく項目は持たない。 使っていない人にとって常に空の欄になるため。

使い方

  1. 受信側を 1 台建てる

    自分の VPS に実行ファイルと設定を置いて起動する。通知先(webhook)と、 agent ごとの共有鍵を書く。保存先のディレクトリを 1 つ決める。データベースは要らない。

    heartpost-monitor -config /etc/heartpost/monitor.toml
  2. 監視したいサーバーへ agent を置く

    付属スクリプトが SSH で実行ファイルと設定を配り、crontab に 1 行足す。 既定は 5 分間隔。root 権限は要らない。

    */5 * * * * $HOME/heartpost/bin/heartpost-agent --config $HOME/heartpost/etc/agent.toml
  3. 画面を開いて、あとは放っておく

    ブラウザで一覧を開くと全台が並ぶ。欠報が出たら上に来て、同時に 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 のみ。必要になった時点で判断する

ライセンスは Apache License 2.0。ソースは github.com/ishizakahiroshi/heartpost