午前2時の気づき:ローカル通知ハブが必要な理由
火曜日の午前2時14分、私は凍えるような寒さで目が覚めました。スマートサーモスタットの自動化システムがクラッシュしていたのです。スマホを確認しましたが、何もありません。Home Assistantからのアラートも、NASからのメールも、Telegramの通知もゼロでした。プロバイダーが深夜0時に「定期メンテナンス」を開始し、ネット接続が切断されていたのです アラートがクラウドベースのAPIに依存していたため、配管が凍結しそうな中、それらはデジタルの虚空に向かって叫んでいるだけでした。
これは典型的な「自宅ラボ(HomeLab)の罠」です。私たちは複雑なローカルシステムを構築しながら、最も重要な部分、つまり「いつ何かが壊れたかを知ること」を外部サービスにアウトソーシングしてしまっています。その夜、私は自分のデータがある場所に存在する通知サーバーが必要だと確信しました。Gotifyが必要だったのです。
Gotifyは、サーバー用のプライベートで高速なメッセージブローカーだと考えてください。非常に軽量で、通常30MB未満のRAMしか消費しません。クリーンなWebインターフェース、堅牢なAndroidアプリ、そして非常にシンプルなAPIを提供しています。Dockerコンテナを立ち上げることができれば、5分足らずでプライベートな通知システムを稼働させることができます。
クイックスタート:300秒で始めるGotify
私は複雑な設定よりもシンプルさを重視します。この最小限のDocker Compose設定だけで、すぐに使い始めることができます。まず、データを保存する場所を作成しましょう。
mkdir -p ~/homelab/gotify/data
cd ~/homelab/gotify
次に、以下の設定を docker-compose.yml ファイルに記述します。私はこの全く同じセットアップをRaspberry Pi 4で14ヶ月以上使用していますが、一度もクラッシュしたことはありません。
version: "3"
services:
gotify:
image: gotify/server
container_name: gotify
restart: always
ports:
- 8080:80
environment:
- GOTIFY_DEFAULTUSER_PASS=admin
volumes:
- "./data:/app/data"
コンテナをデプロイします:
docker-compose up -d
ブラウザで http://your-server-ip:8080 にアクセスしてください。admin/admin でログインします。パスワードはすぐに変更してください。これで、あなた専用の通知インフラが手に入りました。
仕組みの裏側:リアルタイム通信
Gotifyは単なる基本的なダッシュボードではありません。WebSocketを使用してメッセージをデバイスに即座にプッシュします。これにより、メールの遅延やスパムフィルタの不確実性を回避できます。ドライブが故障したとき、数分後ではなく、数ミリ秒以内にそれを知ることができます。
最初のアプリケーションの作成
Gotifyでは、「アプリケーション」がAPIキーとして機能します。「Gotify」にメッセージを送るのではなく、作成した特定の「アプリ」に対して送ります。これにより、アラートをカテゴリ分けできます。私は通常、以下のアプリを個別に作成しています:
- インフラ: UPSのステータス、ディスク容量の警告、温度アラート。
- セキュリティ: SSHログイン失敗、ファイアウォールのブロック。
- サービス: Dockerコンテナの再起動、バックアップの完了ステータス。
Gotify UIの Apps タブに移動し、 Create Application をクリックして、「HomeLab-Monitor」のような名前を付け、トークンをコピーします。次のステップでこれが必要になります。
Androidクライアント
Androidアプリ(F-DroidおよびPlayストアで入手可能)こそがGotifyの真骨頂です。持続的なWebSocket接続を維持するため、GoogleのFirebase Cloud Messaging (FCM)やGoogleアカウントを必要としません。インターネットがダウンしていても、ローカルのWi-Fiが生きていれば動作します。カスタムAndroidビルドや非Googleデバイスを使用しているユーザーにとって、これは救世主です。
実践的な活用:すべてを連携させる
サーバーが稼働したら、楽しい時間の始まりです。すべてをサーバーと連携させましょう。GotifyはシンプルなREST APIを使用しているため、シェルコマンドやスクリプトを実行できるほぼすべてのものから通知を送信できます。
1. Bashスクリプトによる方法
私はこれをcronジョブに使用しています。バックアップが失敗した場合は、すぐに知りたいからです。以下は、優先度の高い通知を送信するためのシンプルな curl コマンドです:
curl -X POST "http://your-server-ip:8080/message?token=YOUR_APP_TOKEN" \
-F "title=バックアップ失敗" \
-F "message=/mnt/data の夜間バックアップが $(date) に失敗しました" \
-F "priority=8"
priority(優先度)フィールドが重要です。Androidアプリでは、優先度に応じて異なる通知音を設定できます。優先度10は火災センサー用の大音量アラーム、優先度1はアップデート成功時のサイレント通知、といった具合に使い分けられます。
2. Pythonとの連携
カスタム自動化スクリプトを書いているなら、Pythonを使うともっと簡単です。私は長時間かかるデータ処理タスクの監視によくこれを使います。
import requests
def send_gotify_alert(title, message, priority=5):
# アラートを送信する関数
url = "http://192.168.1.50:8080/message?token=AmXyZ12345"
payload = {
"title": title,
"message": message,
"priority": priority
}
try:
requests.post(url, json=payload)
except Exception as e:
print(f"アラートの送信に失敗しました: {e}")
send_gotify_alert("サーバー室が高温です", "温度が30°Cを超えました!", 9)
3. リバースプロキシとSSL
外出先でも通知を受け取りたい場合は、Gotifyをインターネットに公開する必要があります。ルーターのポート8080をそのまま開けないでください。 Nginx Proxy ManagerやCaddyなどのリバースプロキシを使用して、SSL暗号化を処理してください。Gotifyがパブリックインターネット経由でWebSocketを確実に動作させるには、安全な接続(HTTPS)が必要です。
ノイズのない自宅ラボのための実践的なヒント
最初にGotifyをセットアップしたとき、私は「すべて」に対して通知を送るという間違いを犯しました。コンテナが更新されるたびにスマホが震えました。48時間以内に私は「アラート疲れ」に陥り、スマホを無視し始めました。そうしてはいけません。それはアラートシステムの目的を台無しにします。
ヒント1:優先度レベルを賢く使う
ラボ用に厳密な優先度スケールを定義しましょう:
- 0-3(低): 情報。音なし、振動なし。後でログを確認するのに便利です。
- 4-7(中): 通常のアラート。標準の通知音。今日中に対応が必要だが、今すぐでなくてもいいものに使用します。
- 8-10(高): 緊急。独特の大音量、可能であれば「おやすみモード」をバイパスします。ハードウェアの故障やセキュリティ侵害に使用します。
ヒント2:Markdownを活用する
Gotifyはメッセージ本文でMarkdownをサポートしています。PortainerインスタンスやDashyダッシュボードへのリンクを通知に直接含めることができます。コンテナが失敗した場合は、メッセージにそのログへのリンクを含めましょう。外出先で問題を解決しようとしているとき、貴重な数秒を節約できます。
ヒント3:通知サーバー自体の死活監視
通知サーバー自体がダウンした場合、誰が教えてくれるでしょうか?私は別のRaspberry Piで、Gotifyに1時間ごとにpingを送るシンプルな「ハートビート」スクリプトを使用しています。失敗した場合、その Pi はフォールバック用のメールを送信するか、オフィスの物理LEDを点灯させます。本番級の自宅ラボにおいて、冗長性は被害妄想ではなく、必須要件です。
Gotifyのセットアップは、私の環境における最高の安定性アップグレードの一つでした。アラートの見逃しはなくなり、外部APIへの依存もなくなり、データを完全にコントロールできるようになりました。システムが実際に動いているかどうか不安になるのに疲れたなら、今日20分時間を割いてこれをセットアップしてみてください。

