Chillarin Blog 構成紹介 - 8.監視基盤編 Part2(構築手順編)-
自宅サーバ監視基盤の構築手順。Prometheus / Grafana / Loki / Promtail / node_exporter / cAdvisor をdocker-composeで一気に立ち上げる実践ガイド。
はじめに
Part1(設計思想と全体像)では、「何を監視するか」「なぜこの構成にしたか」を整理しました。 今回は実際に手を動かして、監視スタックを立ち上げていきます。
やることは大きく2つ。
- 監視サーバ (chillarin-ops) に Prometheus / Grafana / Loki を立てる
- 監視対象 (chillarin-sv01 + NUCホスト) に exporter / Promtail を配置する
全部 Docker で動かすので、docker-compose.yml を書いて up -d すれば基本的には動きます。
……とはいえ、いくつかハマりポイントがあるので、そのあたりも書いていきます。
前提
| 項目 | 内容 |
|---|---|
| 監視サーバ | chillarin-ops (VM, 172.16.1.151, Ubuntu 24.04) |
| 監視対象 | chillarin-sv01 (VM, 172.16.1.100), nuc1〜3 (Proxmox hosts) |
| Docker | Docker Engine 27.x + docker-compose v2 |
| NW | 全ホスト 172.16.1.0/24 (VLAN401) で疎通済み |
Step 1: 監視サーバ (chillarin-ops) の構築
ディレクトリ構成
まずはディレクトリを作ります。
mkdir -p /opt/monitoring/{prometheus,grafana,loki,promtail}
cd /opt/monitoring最終的にはこういう構成になります。
/opt/monitoring/
├── docker-compose.yml
├── prometheus/
│ ├── prometheus.yml
│ └── alert-rules.yml
├── grafana/
│ └── provisioning/
│ ├── datasources/
│ │ └── datasources.yml
│ └── dashboards/
│ ├── dashboards.yml
│ └── *.json
├── loki/
│ └── loki-config.yml
└── promtail/
└── promtail-config.ymldocker-compose.yml(監視サーバ側)
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
いくつかポイントを補足します。
ポート番号をLAN IPにバインドしている
172.16.1.151:9090:9090 のように書くことで、LAN内からしかアクセスできないようにしています。
0.0.0.0:9090:9090 だと全インターフェースでlistenしてしまうので、Cloudflare Tunnel 経由で外から叩けてしまう可能性があります。
自宅サーバのセキュリティ設計として地味に大事なところです。
Prometheusのデータ保持期間は90日
--storage.tsdb.retention.time=90d で90日に設定しています。
デフォルトは15日ですが、自宅サーバの場合は「先月と今月でディスクの増え方を比較したい」みたいなユースケースがあるので、少し長めにしています。
ディスク使用量は200系列 × 90日で数GBレベルなので、問題ありません。
--web.enable-lifecycle を有効にしている
これを入れておくと、curl -X POST http://localhost:9090/-/reload で設定をリロードできます。
prometheus.yml を書き換えるたびにコンテナを再起動するのは面倒なので。
prometheus.yml
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
relabel_configs で instance ラベルを上書きしている理由
デフォルトだと instance ラベルが 172.16.1.100:9100 みたいなIPアドレス:ポートになります。
Grafana のダッシュボードで見るとき「どのホストか」がパッとわからないので、人間が読める名前に上書きしています。
Blackbox exporter は監視サーバ (chillarin-ops) 側に置いている
ブログサーバ側には置かず、ops 側の blackbox-exporter:9115 を参照する構成にしています。
これにより、chillarin-sv01 自体が落ちても blackbox は ops 側で独立して動き続けられます。
Cloudflare Exporter のスクレイプ間隔は300秒
CF Analytics API のレート制限に引っかからないよう、5分間隔にしています。
alert-rules.yml
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
アラートルールでは以下の3カテゴリを定義しています。
- ホストアラート: ディスク使用率 85% 超、メモリ使用率 90% 超を検知
- コンテナアラート: nginx / hugo-blog / remark42 / cloudflared 等の主要コンテナの停止を検知
- Blackboxアラート: ブログへの外部アクセス不能を検知
「何を監視するか」の設計は Part1 で説明していますが、それを PromQL のルールに落とし込む具体的な書き方は有料コンテンツで解説しています。
Grafana データソースの provisioning
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
Grafana の provisioning 機能を使って、起動時に自動的に Prometheus と Loki をデータソースとして登録しています。 手動でポチポチ設定するのではなく、コードで管理することで再構築時にも一発で同じ状態を再現できます。
Loki 設定
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
Loki の設定で意識しているのは主に以下のポイントです。
- ストレージはfilesystem: 自宅サーバの規模ではS3互換ストレージは不要。ローカルファイルシステムで十分
- ログ保持期間は30日 (720h): メトリクスと違ってログは容量を食うので、Prometheus の90日より短めに設定
- スキーマは v13 + TSDB: Loki 3.x 系の推奨構成
Step 2: 監視対象 (chillarin-sv01) の構築
docker-compose.yml に追記する exporter 群
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
監視対象サーバには以下の4つのコンテナを追加します。
- node-exporter: ホストのCPU / メモリ / ディスク等のメトリクスを収集
- cAdvisor: Dockerコンテナ単位のリソース使用量を収集
- nginx-exporter: nginx の stub_status からリクエスト数等を収集
- Promtail: ログを Loki に転送
cAdvisor のホスト側ポートを :9101 にしているのは、node-exporter が :9100 を使っているためです。cAdvisor のコンテナ内部ポートは :8080 ですが、外部公開用にずらしています。
nginx の stub_status
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
nginx-exporter がメトリクスを取得するには、nginx 側で stub_status エンドポイントを有効にする必要があります。
ポイントは、このエンドポイントをLAN内からのみアクセス可能にすること。外部に公開する必要はありません。
Promtail 設定
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
Promtail では以下のログソースを収集対象にしています。
- Dockerコンテナログ:
/var/lib/docker/containers/*/*.logをdocker: {}パイプラインで処理 - nginx アクセスログ / エラーログ: それぞれ別ジョブとして定義し、
log_typeラベルで区別 - syslog: OS レベルのログも収集
host ラベルを付与しておくことで、Grafana (Loki) 側でホスト別にフィルタできるようになります。
Step 3: Proxmox ホストへの node_exporter 導入
Proxmox ホストは Docker を入れていない(入れたくない)ので、node_exporter はバイナリを直接インストールして systemd で管理します。
バイナリのダウンロードと配置の手順は以下の通りです。
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xzf node_exporter-1.8.1.linux-amd64.tar.gz
cp node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/
useradd --no-create-home --shell /bin/false node_exportersystemd サービスファイル
📦 この設定ファイルの全量は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
ここでもポイントは --web.listen-address で LAN IP を指定していること。
全インターフェースではなく、監視用ネットワークのIPだけでlistenさせます。
起動と確認は以下の通り。
systemctl daemon-reload
systemctl enable --now node_exporter
curl http://172.16.1.1:9100/metrics | head -20Step 4: 起動と動作確認
全ての設定ファイルを配置したら、監視サーバ側から起動します。
cd /opt/monitoring
docker compose up -d起動後の確認ポイント:
docker compose psで全コンテナがrunningであること- Prometheus Targets (
http://172.16.1.151:9090/targets) で全ターゲットがUPであること - Grafana (
http://172.16.1.151:3000) にログインし、Prometheus / Loki データソースが正常に接続されていること - PromQL テスト:
upクエリを実行して全ターゲットの値が1であること - LogQL テスト:
{host="chillarin-sv01"}でログが流れてきていること
ハマりポイント集
cAdvisor が Permission denied で起動しない
Ubuntu 24.04 の AppArmor が原因で、cAdvisor がホストの /sys や /dev/kmsg にアクセスできずに起動に失敗することがあります。
docker compose logs cadvisor に Permission denied が出ていたらこれを疑ってください。
docker-compose.yml への具体的な対処方法(security_opt の設定)があります。
📦 具体的な解決方法は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
Promtail が Docker ログを読めない
Promtail コンテナがホストの /var/lib/docker/containers/ 以下のログファイルを読めないケースがあります。
パーミッションの問題で、コンテナ内のユーザーがホスト側ファイルの読み取り権限を持っていないことが原因です。
📦 具体的な解決方法は 有料コンテンツ: 自宅サーバ構築シリーズ に含まれています。
Prometheus のメモリ使用量が思ったより大きい
200系列 × 15秒間隔 × 90日保持で、Prometheus のメモリ使用量は 1.5〜2GB 程度になります。 監視サーバのメモリが4GB以下の場合は、保持期間を短くするか、スクレイプ間隔を長くすることを検討してください。
ここまでのまとめ
今回は監視スタックの実際の構築手順を紹介しました。
- 監視サーバに Prometheus / Grafana / Loki / Alertmanager を docker-compose で構築
- 監視対象に node-exporter / cAdvisor / nginx-exporter / Promtail を配置
- Proxmox ホストには node_exporter をバイナリで直接導入
- LAN IP バインドやラベル設計など、自宅サーバならではの工夫を随所に入れた
設計思想(Part1)と構築手順(Part2)を合わせて読むことで、「なぜこうなっているのか」を理解した上で自分の環境に応用できるはずです。
自宅サーバとネットワークの観測の全体像は 自宅 Observability の完全ガイド — Prometheus + Grafana + Loki で家のサーバとネットワークを観測し続ける にまとめています。監視基盤の設計判断から複合障害・retention 運用までを 1 ページで通読できる Pillar ガイドです。
コメント