あらすじ
私は何年も趣味で自宅サーバを運用していますが、その間いろんな問題が発生しました。
- LAN ケーブルが原因不明で抜けた
- ルータの電源アダプターが重すぎて勝手にタップから抜けた
- サーバの SSL 証明書の自動更新が失敗した
- nvidia-smi が原因不明で落ちた
- 夏でサーバが爆熱になった
などなど、大なり小なり問題がありました。
自宅サーバちゃんは高性能な GPU を積んでいて発熱しやすいものだったので、
サーバに接続できないたびに火災が起きないか毎回焦りました。

心配した僕が最近編み出したのは
そんな僕が最近編み出したのは、これ
監視カメラを別のインターネット回線にして、
物理的にサーバの様子を確認できるステータスモニターを作ればいいでは?
というアイディアがあったので、作成しました。
最終的にこんな感じになりました。

家に余ったポータブル 14 インチ画面の光度を 0 まで下げることで、電気代節約できそう。。。?
部屋の方も電気消しているので、監視カメラが勝手に赤外線カメラになった。

ちなみに、サーバの方に GUI がないので、bash から起動しています。
完成したコードはこちらのリポジトリーにて確認できます。
赤外線カメラでも各ステータスが確認できます。
一行目 = CPU 温度 | GPU 温度 | ネットワーク回線の状態
二行目 = nvidia-smi | サーバのヘルスチェック
仮に LAN ケーブルを抜いてみたらこうなります。

ネットワーク状況とサーバのヘルスチェックが通らなくなりましたので、
Dead に変わりました。
これである程度サーバがどういう死に方しているかを物理で把握できましたので、
火災の心配も少なくなりました。
余談
結果だけ見ると簡単に作れそうですが、わりと時間がかかりました。
いくつかの問題に遭遇しました。
ターミナルによってフォントが違う
なので、単純にテキストを描画することができません。
回避策として、0 と 1 フラグを使って、文字列っぽいのを作成しました。
0 の場合、背景色を描画する一方、
1 の場所で背景色を表示するため描画しないようにしました。
下記は "D" 文字の列サンプルです。
ターミナルによって表示できる色が違う
Windows のターミナルや mintty, powershell など非常に表示できる色は多いですが、
生の bash だと表示できる色は非常に限られています。
しかも同じ色でも描画してみたらターミナルによって違う色になります。
Black で指定しても、サーバで描画したのはほぼグレーに見えた場合もあります。
なので、Black のフォントの代わりに本来のターミナルの色の方が黒いので、
Black を使う時、代わりに何も描画しないようにしました。
暗い色じゃないと赤外線カメラでは見えづらい
赤外線カメラはかなり敏感に光に反応しますので、明るい色だと真っ白にしか見えません。
最初は緑と赤で正常時とエラー時を区別していましたが、赤外線カメラを通すとなにも違いがわかりません。

なので、黒色と暗い赤色にして、画面の輝度を 0 にしたら見えました。
LCD 画面が Burn-in する問題
これは後で気付きましたが、ずっと同じ描画をしたら LCD 画面が Burn-in
(画面に同じ表示を長時間出し続けた結果、うっすら残像のように見える現象)
する可能性が高いので、1 分ごとに画面を 3 秒間画面を暗くし、
各ステータス更新が終わったらまた描画するようにしました。
今回は TN パネルを使っていましたが、OLED パネルなど Burn-in しやすいものだともっと工夫しないといけないと思います。
まとめ
趣味でやっている自宅サーバですが、やっぱり何年もやると色々と知恵を得られ、かなり貴重な存在だと感じました。
これからも自宅サーバを育てながら、運用でしか得られない知見を積み重ねていきます。




