Prometheus + Grafanaで自宅サーバーのCPU・温度・ディスクを可視化する:node_exporterから始める

Photo: Brett Sayles / Pexels
先に結論です。自宅サーバーの CPU・メモリ・温度・ディスクの推移を見たいなら、node_exporter(数値を集める)・Prometheus(ためる)・Grafana(グラフにする)の 3 つを Docker Compose でまとめて立てるのが近道です。
- 3 つとも同じ機械に置き、Grafana の画面(3000 番)以外は外から見えないようにする
- グラフは定番のダッシュボード(ID 1860)を読み込めば、その日のうちに一通り出る
- 保存期間は最初に決めておく。既定の 15 日では「去年の夏と比べる」ができない
落ちてから調べるのではなく、普段の値を知っておくための仕組みです。
3 つの役割と、動かす機械
| 名前 | 役割 | ポート |
|---|---|---|
| node_exporter | CPU・メモリ・ディスク・温度などの数値を出す | 9100 |
| Prometheus | 15 秒ごとに数値を取りに行き、ためておく | 9090 |
| Grafana | ためた数値をグラフにする画面 | 3000 |
2026 年 10 月時点の版は、node_exporter が v1.12.1、Prometheus が長期サポート版の v3.13 系(2027 年 7 月末までサポート)、Grafana が 13.2 系です。Prometheus は約 6 週間ごとに新しい版が出ますが、自宅で放っておく用途なら長期サポート版のほうが更新の手間が少なく済みます。
どれも軽いソフトなので、すでに動いている自宅サーバーに同居させてかまいません。Grafana は最小でメモリ 512MB・CPU 1 コアとされています。新しく用意するなら Beelink Mini S12 Pro のような N100 のミニPC が扱いやすいです。Raspberry Pi 5 8GB でも動きますが、Prometheus は書き込みが続くので、microSD ではなく SSD から起動する構成にしておきます。
Docker Compose で 3 つをまとめて立てる
作業用のフォルダ(例:~/monitoring)に 2 つのファイルを作ります。まず prometheus.yml です。
global:
scrape_interval: 15s
scrape_configs:
- job_name: node
static_configs:
- targets: ["127.0.0.1:9100"]
次に compose.yaml です。
services:
node-exporter:
image: quay.io/prometheus/node-exporter:v1.12.1
container_name: node-exporter
network_mode: host
pid: host
restart: unless-stopped
command:
- --path.rootfs=/host
- --web.listen-address=127.0.0.1:9100
volumes:
- /:/host:ro,rslave
prometheus:
image: prom/prometheus:v3.13.4
container_name: prometheus
network_mode: host
restart: unless-stopped
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention.time=90d
- --storage.tsdb.retention.size=10GB
- --web.listen-address=127.0.0.1:9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
grafana:
image: grafana/grafana:13.2.4
container_name: grafana
network_mode: host
restart: unless-stopped
volumes:
- grafana_data:/var/lib/grafana
volumes:
prometheus_data:
grafana_data:
ポイントは 4 つです。
network_mode: host:3 つとも機械本体のネットワークをそのまま使います。お互いを127.0.0.1で呼べるので、コンテナ同士のネットワークを考えずに済みます127.0.0.1で待ち受け:Prometheus と node_exporter にはログイン画面がありません。同じ機械の Grafana から読めれば足りるので、LAN からは見えないようにします/:/host:ro,rslaveと--path.rootfs=/host:機械全体を読み取り専用で見せ、コンテナではなく本体のディスク使用量を数えさせる設定です。node_exporter の公式の例と同じ形です- Prometheus の
commandは先頭 2 行も書く:commandを書くと既定の指定が置き換わるため、設定ファイルとデータの置き場所も省かずに書きます
docker compose up -d で起動したら、サーバーの上で取れているか確かめます。
curl -s http://127.0.0.1:9100/metrics | grep -E "node_hwmon_temp_celsius|node_thermal_zone_temp"
curl -s http://127.0.0.1:9090/api/v1/targets | grep -o '"health":"[a-z]*"'
1 行目で温度の行が出て、2 行目が "health":"up" なら、集める・ためるまでは動いています。
ufw を有効にしているなら、Grafana の 3000 番だけを LAN に開けます(sudo ufw allow from 192.168.1.0/24 to any port 3000 proto tcp)。Forgejo など別のソフトがすでに 3000 番を使っているときは、Grafana に環境変数 GF_SERVER_HTTP_PORT=3001 を足して番号をずらします。
Grafana でグラフを出す:定番ダッシュボードと自分用の 4 枚
ブラウザで http://サーバーのIPアドレス:3000 を開き、ユーザー名 admin・パスワード admin でログインします。最初にパスワードの変更を求められるので、ここで必ず変えます。
続けて、データの取り出し先を登録します(表記は版によって多少違います)。
- 「Connections」→「Data sources」→「Add new data source」で「Prometheus」を選ぶ
- URL に
http://127.0.0.1:9090を入れて「Save & test」を押す
グラフは一から作らなくてもかまいません。「Dashboards」→「New」→「Import」で ID に 1860 を入れ、先ほどのデータソースを選ぶと、定番の「Node Exporter Full」が読み込まれます。CPU・メモリ・ディスク・ネットワークの大半はこれで見られます。
ただ、項目が多すぎて毎日眺める画面には向きません。私なら、次の 4 枚だけを並べた自分用のダッシュボードを別に作ります。
| 見たいもの | PromQL(Grafana のクエリ欄に入れる式) |
|---|---|
| CPU 使用率(%) | 100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 |
| メモリ使用率(%) | 100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) |
| ディスク使用率(%) | 100 * (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) |
| 温度(℃) | ミニPC は node_hwmon_temp_celsius、ラズパイは node_thermal_zone_temp |
温度は機種によってセンサーの数も名前も違います。Intel のミニPC では、chip というラベルに coretemp を含む系列が CPU、nvme を含む系列が SSD であることが多いので、node_hwmon_temp_celsius{chip=~".*coretemp.*"} のように絞ると見やすくなります。
ディスクを食わせない保存期間と、2 台目の追加
Prometheus の保存期間は、何も指定しないと 15 日です。夏の温度を翌年と比べるには足りないので、上の例では retention.time=90d にし、retention.size=10GB で容量の上限も付けています。両方を指定すると、先に届いたほうの条件で古いデータから消されます。
必要な容量は、公式ドキュメントでは「保存する秒数 × 毎秒のサンプル数 × 1 サンプルあたり 1〜2 バイト」で見積もれるとされています。node_exporter 1 台で 2,000 系列と仮定すると、15 秒ごとなら毎秒約 133 サンプルで、90 日なら約 2GB が目安です。系列の数は機械によって違うので、1 週間ほど動かしてから docker system df -v でボリュームの増え方を見て調整します。
ラズパイや NAS など 2 台目も見たいときは、その機械に node_exporter を入れ、prometheus.yml の targets に足します。Raspberry Pi OS なら sudo apt install prometheus-node-exporter で入り、9100 番で待ち受けます。
- targets: ["127.0.0.1:9100", "192.168.1.20:9100"]
書き換えたら docker compose restart prometheus で読み込み直します。2 台目の 9100 番は LAN に開くので、ルーターで家の外へ転送しないでください。
1〜2 週間眺めて普段の値が分かったら、Grafana のアラート機能で「ディスク使用率 85% 超え」のような通知を足すと、落ちる前に気づけるようになります。
まとめ
- node_exporter(集める)・Prometheus(ためる)・Grafana(見せる)の 3 つを Docker Compose で 1 台にまとめる
- 3 つとも host ネットワークにし、Prometheus と node_exporter は
127.0.0.1だけで待ち受ける - Grafana は初回ログインで admin のパスワードを変え、ID 1860 のダッシュボードを読み込む
- 毎日見るのは CPU・メモリ・ディスク・温度の 4 枚に絞る
- 保存期間は既定の 15 日から延ばし、容量の上限も一緒に付ける
運営者が作った Excel テンプレートを BOOTH で配布しています。IT 資産管理台帳(無料 Lite 版あり) / IT 資格の学習管理シート


