M5Stack Cardputer を「自宅製 UptimeRobot」にしてみた話
最近、M5Stack Cardputer を使って、Render にデプロイしている個人用サービスを 5 分に一度ローカルから監視する仕組みを作りました。
顔アイコンがぴこぴこ動く小さな端末が、机の上で黙々とサービスを見張り続けてくれています。
「絶対に落としたくないけど、個人用だからできれば無料でやりたい」「UptimeRobot はたまに落ちるし、自分で様子を見たい」。
そんなワガママを全部 Cardputer に押しつけた結果、かなり気に入っているので、構成と考え方をまとめておきます。
モチベーション:無料で、でもちゃんと監視したい
監視対象は Render 上で動かしている個人用の Web サービスで、DB は Neon の PostgreSQL。
仕事ではないけれど、これが落ちると地味に生活が不便になるぐらいには依存しています。
-
できれば 24h / 365d 生きていてほしい
-
でも個人用途なので、監視サービスに月額を払うほどでもない
-
UptimeRobot など外部サービスも悪くないけれど、「監視サービス側が落ちる」パターンもたまにある
だったら、手元のガジェットで「監視専用端末」を作ってしまえばいいのでは?
という発想から、Cardputer を自宅製 UptimeRobot にする計画が始まりました。
全体構成:Cardputer が Render を 5 分ごとにヘルスチェック
やっていること自体はシンプルです。
-
Cardputer 上で小さな監視プログラムを常駐
-
5 分に一度、Render 上のエンドポイント(例:
/healthz)に HTTP リクエスト -
ステータス 200 なら「ニコニコ顔」、失敗やタイムアウトなら「しょんぼり顔」を表示
-
一定回数連続で失敗したときだけ、通知を飛ばす(メールやチャットなどは好みで)
Cardputer は常時給電して机の上に置きっぱなしなので、ちらっと視線を向けるだけで「サービスが元気かどうか」が一発でわかります。
クラウド監視サービスのダッシュボードを開かなくても、物理的な「顔の表情」で状態が見えるのが、思った以上に安心感があります。
キーボード付き端末らしい仕掛け:状態・ログをコマンドで確認
Cardputer は小さな QWERTY キーボード付きなので、「せっかくだから端末っぽく使いたい」と思い、状態確認用のコマンドインターフェイスも実装しました。
状態確認コマンド
一定時間ごとに自動監視は走っているのですが、手動で状況を確認したいときもあります。
そこで、例えばこんな感じのコマンドを打てるようにしました(コマンド名は例):
-
status-
直近のチェック結果(成功/失敗)
-
監視対象 URL
-
最終チェック時刻
-
連続失敗回数
-
を、Cardputer の画面にテキストで表示します。
普段は顔アイコンだけですが、気になったら一瞬だけ「ステータス画面」に切り替えて確認できるイメージです。
ログ表示コマンド
「さっき一瞬顔が曇ってたけど、あれは何だったんだ?」みたいな時のために、簡易ログビューアも用意しました。
-
log-
最近のチェック結果を数十件ぶん表示(日時 / ステータスコード / レスポンスタイムなど)
-
ログはローカルストレージ(ファイル or フラッシュ)にシンプルなテキストで残しておき、キーボードから log を叩くとスクロール可能なログ表示モードに入る、という作りです。
小さな画面に黒地のテキストが並ぶだけでも、それっぽい「監視端末感」が出て楽しいです。
/healthz と /readyz:ヘルスチェック設計の工夫
監視側が楽しくても、サーバー側に無駄な負荷をかけてしまっては本末転倒です。
そこで、ヘルスチェック用のエンドポイントは次のように分けました。
-
/healthz-
できる限り軽量なチェック
-
アプリケーション層だけで完結(できれば DB に触らない)
-
Cardputer の 5 分ごとの監視はこちらを叩く
-
-
/readyz-
DB(Neon)や外部 API も含めた詳しめのチェック
-
Render 自身の health check 設定に使ったり、より低頻度の監視に使う
-
Cardputer からは例えば 1 時間に一度だけ叩く、など頻度を落とす
-
こうしておくと、常時 5 分間隔で飛ぶリクエストは非常に軽く、Neon 側の無料枠や接続数にも優しい構成になります。
「本気で障害を疑う」タイミングだけ /readyz を見に行けば十分です。
規約的にグレーじゃないの?という話
ここが一番モヤモヤしていたポイントですが、結論としては「常識的な頻度で軽いヘルスチェックをしている限り、かなり白寄り」と考えています。
-
Render は公式ドキュメントで「外部からのヘルスチェック」を推奨している
-
一般的な Uptime モニタリングサービスも、1〜5 分間隔でのチェックを標準としている
-
問題視されやすいのは「無料枠の制限を事実上回避するために、過剰な頻度で自動アクセスを繰り返す」ようなケース
今回のように、
-
対象は自分のサービスだけ
-
5 分に一度
-
/healthzはとにかく軽い処理 -
目的は「障害検知」とログ確認
という条件を守っている限り、一般的な利用者の範囲から大きく外れることはないはずです。
いわゆる「Keep-alive ハック」として使わないこと、監視の頻度と内容を常識的なレベルに抑えること、の 2 点だけ意識しておけば、そこまで神経質になる必要はなさそうです。
実装のこまごました話
コードそのものは好みで書けばいいのですが、実際に作ってみて「やってよかった」と感じたポイントを箇条書きで。
-
HTTP リクエストにはタイムアウトを必ず付ける(例:3〜5 秒)
-
1 回失敗しただけでアラートにしない(2〜3 回連続失敗で「ダウン」と判定)
-
成功/失敗どちらもログに残す(時刻・結果・レスポンスタイム)
-
Cardputer の画面 UI
-
通常時:顔アイコン+小さく現時刻
-
statusコマンド:直近の状態をテキストで表示 -
logコマンド:最近のログをスクロール表示
-
-
電源は安定した USB から取り、電源オン自動起動 or 自動再実行を仕込んでおく
端末としての「触っていて楽しい感じ」と、「監視装置としてちゃんと役に立つ感じ」を両立できると、愛着が湧いてきます。
まとめ:ガジェット好きなら一度やってみてほしい
M5Stack Cardputer を使ったローカル監視は、
-
無料枠で運用している個人サービスの「見守り役」としてちょうどいい
-
クラウド監視サービスのダウンに巻き込まれない、という意味でも一つの冗長化になる
-
キーボードで
statusやlogを叩いて状態を確認できるのが、ガジェットとして楽しい
という、かなり満足度の高い遊び兼実用品になりました。
M5 系デバイスやラズパイが余っている人、Render や Neon の無料枠で「でも落ちるのはイヤ…」と思っている人は、ぜひ一度「自宅製 UptimeRobot」を作ってみてください。
机の上で小さな端末がサービスを見守ってくれている光景は、なかなかクセになります。
