
ホームラボを監視しよう。Prometheus + Grafana で始めるお手軽サーバー監視入門
はじめに
自宅サーバー、いわゆるホームラボを運用していると「今、負荷はどのくらい?」「ディスクの空きは大丈夫?」と気になることが増えてきます。
私自身、先日こんなことがありました。
リモートから作業しようと SSH や RDP を試みたものの、一向につながらない。「電源が落ちているのかな?」と実機を確認しに行くと、なんと LAN ケーブルが物理的に死んでいて、起動はしたままだったのです。
「つながらない」という事実が起きてから右往左往するのではなく、常日頃から「生きていること(死活)」や「リソースの状態」を可視化できていれば、原因の切り分けはもっとスマートになります。
今回は、監視の定番構成である Prometheus + Grafana を使い、自宅のメインサーバー(母艦)だけでなく、Raspberry Pi や Windows 11 ARM マシンまで一元的に可視化する環境を構築しました。
あえて Docker や Podman を使わず、systemd として動かすことで、OS 標準の管理に載せた「見通しの良い」構成を目指します。
構成の全体像
母艦となるサーバーに Prometheus と Grafana を集約し、各監視対象に「Exporter」を配置してメトリクスを収集します。
- 母艦サーバー (RHEL 10)
- Grafana: メトリクスの可視化(ダッシュボード)
- Prometheus: メトリクスの収集・蓄積
- node_exporter: 自身の OS メトリクスを公開
- 子機 (Raspberry Pi / Windows)
- node_exporter / windows_exporter: 各自のメトリクスを公開
待ち受けポートの整理
ここが最初のポイントです。RHEL 系では管理ツールの Cockpit が標準で 9090 を使うため、Prometheus のポートをずらしています。
| サービス | ポート | 公開範囲 | 備考 |
|---|---|---|---|
| Grafana | 3000 | LAN 内 | 監視画面。ブラウザからアクセス |
| Cockpit | 9090 | - | RHEL 標準。Prometheus と競合する |
| Prometheus | 9091 | 127.0.0.1 | 外部公開せず内部参照のみ |
| node_exporter | 9100 | - | Linux メトリクス用 |
| windows_exporter | 9182 | - | Windows メトリクス用 |
Ansible による母艦の自動構築
構築は Ansible で自動化しました。主なタスクは以下の通り。
- Prometheus / Grafana の導入
- firewalld の設定: Grafana 用に
3000/tcpを開放。 - Prometheus の隠蔽: 内部参照のみにするため、
127.0.0.1:9091で待ち受け。
# 抜粋:Ansible 変数設定
prometheus_listen_address: "127.0.0.1:9091"
grafana_prometheus_datasource_url: http://127.0.0.1:9091
monitoring_firewalld_ports:
- 3000/tcp
Grafana の初期ログイン
構築が完了したら、ブラウザで http://<母艦の IP>:3000 にアクセスします。
初期ログイン情報は以下の通りです。
- User:
admin - Password:
admin

Grafana ログイン画面
ログイン後、パスワードの変更を求められます。Ansible 側で grafana_admin_password を指定している場合は、そちらを使用してください。
ハマりどころ:SELinux とポート競合
1. Cockpit との衝突
前述の通り、9090 が使えなかったため Prometheus を 9091 に変更しました。
起動確認は curl で行います。
curl -s http://127.0.0.1:9091/-/ready
# "Prometheus Server is Ready." が返れば OK
2. SELinux による「Permission Denied」
Grafana のデータソース設定で Prometheus を指定すると、connect: permission denied と怒られました。
原因は SELinux です。Grafana がローカルポートへ接続する権限がないため、以下の Boolean をオンにする必要があります。
sudo setsebool -P grafana_can_tcp_connect_prometheus_port on
さらに今回の環境では 9091/tcp に対するカスタムポリシーが必要だったため、CIL(Common Intermediate Language)で以下のような許可設定を加えました。
(type prometheus_grafana_port_t)
(typeattributeset port_type (prometheus_grafana_port_t))
(allow grafana_t prometheus_grafana_port_t (tcp_socket (name_connect)))
監視対象を増やす(Raspberry Pi & Windows 11 ARM)
母艦が整ったら、監視対象(子機)を増やしていきます。
Raspberry Pi (Linux)
子機には node_exporter だけをインストールします。母艦の prometheus.yml で子機の IP を指定して scrape するだけです。
Windows 11 ARM (Windows)
近年増えている Windows ARM 環境。ここにはwindows_exporter を使います。
- ARM64 用 MSI を GitHub から入手しインストール。
- Firewall 開放: PowerShell でポート
9182を開けます。New-NetFirewallRule -DisplayName "Prometheus Windows Exporter" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 9182
Prometheus の設定例
job_name: node に Linux 群を、job_name: windows に Windows マシンをまとめると管理しやすくなります。
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["localhost:9100", "192.168.1.151:9100"]
- job_name: "windows"
static_configs:
- targets: ["192.168.1.200:9182"]
Grafana での可視化
ダッシュボードを一から作るのは大変なので、定番の ID をインポートしましょう。

Grafana ダッシュボード画面
- Linux 用:
1860(Node Exporter Full) - Windows 用:
14694(Windows Exporter)
まとめ
Prometheus + Grafana + node_exporter を使うと、ホームラボの「健康状態」が一目で分かるようになります。
今回の構築で得られた知見は以下の通り。
- ポート設計: 既存サービス(Cockpit 等)との競合を避ける。
- セキュリティ: Prometheus 自体は localhost に閉じ、SELinux で接続許可を絞る。
- マルチプラットフォーム: Windows ARM でもネイティブな Exporter で軽量に監視可能。
次は Grafana Alerting を設定し、ディスク使用率が 85% を超えたら Slack や Discord に通知が飛ぶようにする予定です。監視があるだけで、ホームラボの運用はぐっと楽になりますね!
