はじめに
自宅のマルチサーバー環境を一元監視するため、Raspberry Pi上にPrometheus + Grafanaベースの監視基盤を構築しました。本記事では、設計思想から実装詳細、運用で得られた知見までを共有します。
プロジェクト概要
| 項目 | 内容 |
|---|---|
| 目的 | 複数サーバーの統合監視・可視化 |
| 監視サーバー | Raspberry Pi 4 |
| 監視対象 | Webサーバー、DBサーバー、監視サーバー自身 |
| 使用技術 | Prometheus, Grafana, Docker, systemd, Tailscale |
| 開発期間 | 設計・構築・運用テストまで約1週間 |
技術スタック
コアコンポーネント
- Prometheus - 時系列データベース・メトリクス収集
- Grafana - 可視化・ダッシュボード
- Docker - Exporter群のコンテナ管理
- systemd - サービス管理・自動起動
Exporter(メトリクス収集エージェント)
| Exporter | 用途 | 収集メトリクス |
|---|---|---|
| Node Exporter | システム監視 | CPU、メモリ、ディスク、ネットワーク |
| MySQL Exporter | MySQL/MariaDB監視 | クエリ数、接続数、レプリケーション |
| PostgreSQL Exporter | PostgreSQL監視 | 接続数、トランザクション、テーブル統計 |
| Nginx Exporter | Webサーバー監視 | リクエスト数、アクティブ接続数 |
ネットワーク
- Tailscale - リモートサーバーとのセキュアな接続(VPN)
- ローカルLAN - 同一ネットワーク内サーバー監視
システムアーキテクチャ
┌─────────────────────────────────────────────────────────┐
│ 監視サーバー (Raspberry Pi) │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Prometheus │──────▶│ Grafana │ │
│ │ (TSDB) │PromQL │ (Visualization)│ │
│ │ Port: 9090 │ │ Port: 3000 │ │
│ └────────┬────────┘ └─────────────────┘ │
│ │ │
│ │ HTTP Scrape (15秒間隔) │
│ │ │
│ ┌────────┴────────┐ │
│ │ Node Exporter │ ← ローカルシステムメトリクス │
│ │ :9100 │ │
│ ├─────────────────┤ │
│ │ Postgres Export │ ← Docker経由 │
│ │ :9187 │ │
│ ├─────────────────┤ │
│ │ Nginx Exporter │ ← Docker経由 │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
│ Tailscale VPN / LAN
│
┌───────┴───────┬───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Web │ │ DB │ │ Other │
│ Server │ │ Server │ │ Servers │
│ :9100 │ │ :9100 │ │ :9100 │
│ │ │ :9104 │ │ │
└─────────┘ └─────────┘ └─────────┘
実装のポイント
1. Hybrid運用(systemd + Docker)
メインサービス(Prometheus、Grafana)はsystemdで管理し、Exporterは用途に応じてsystemdとDockerを使い分けました。
systemd管理のメリット:
- OS起動時の自動起動が確実
- ログ管理がjournalctlに統合
- リソース消費が軽量
Docker管理のメリット:
- 環境依存なく同一設定でデプロイ可能
- バージョン管理が容易
- 設定変更時の切り戻しが簡単
# docker-compose.yml(Exporter群)
services:
postgres-exporter:
image: prometheuscommunity/postgres-exporter:latest
environment:
- DATA_SOURCE_NAME=postgresql://user:pass@db:5432/postgres
restart: unless-stopped
2. 自動セットアップスクリプト
新規サーバーへの監視エージェント導入を自動化するスクリプトを作成しました。
#!/bin/bash
# setup-db-server.sh - DBサーバー用
# アーキテクチャ自動判定(arm64/amd64対応)
ARCH=$(uname -m)
if [ "$ARCH" = "aarch64" ]; then
ARCH_SUFFIX="arm64"
else
ARCH_SUFFIX="amd64"
fi
# Node Exporterインストール
wget -q "https://github.com/.../node_exporter-${VERSION}.linux-${ARCH_SUFFIX}.tar.gz"
# DB種別自動判定
if command -v mysql &> /dev/null; then
install_mysql_exporter
fi
if command -v psql &> /dev/null; then
install_postgres_exporter
fi
特徴:
- ARM64/AMD64両対応
- インストール済みDBを自動検出
- 監視ユーザー作成・権限設定を自動化
- 完了後にPrometheus設定の追記内容を出力
3. Tailscaleによるリモート監視
異なるネットワークにあるWebサーバーをTailscale経由で監視しています。
# prometheus.yml
- job_name: 'web-server'
static_configs:
- targets: ['100.126.77.58:9100'] # Tailscale IP
labels:
instance: 'web-ras'
メリット:
- ファイアウォール設定不要
- 暗号化通信
- NATを超えた接続
4. Grafana Provisioning
データソースとダッシュボードを設定ファイルで管理し、再構築時も同一環境を再現可能にしました。
# /etc/grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://localhost:9090
isDefault: true
運用実績
稼働状況
| 項目 | 数値 |
|---|---|
| 連続稼働時間 | 2週間以上 |
| メトリクス収集間隔 | 15秒 |
| データ保持期間 | 15日(デフォルト) |
| 監視対象サーバー | 3台 |
監視対象メトリクス数
# Prometheusのメトリクス数確認
$ curl -s localhost:9090/api/v1/label/__name__/values | jq '.data | length'
1,247
工夫した点
1. 最小権限の原則
DB監視ユーザーには必要最小限の権限のみ付与:
-- MySQL
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
-- PostgreSQL
GRANT pg_monitor TO postgres_exporter;
2. セキュリティ設計
- Exporterポートはファイアウォールで監視サーバーのみ許可
- 認証情報ファイルは
chmod 600で保護 - Tailscale経由でのリモート監視(ポート公開不要)
3. 拡張性
新規サーバー追加時の手順を標準化:
- セットアップスクリプト実行(対象サーバー)
- prometheus.ymlにターゲット追加(監視サーバー)
- Grafanaダッシュボードインポート
今後の改善予定
- Alertmanagerによるアラート通知(Slack/Discord連携)
- Loki + Promtailによるログ収集統合
- Grafana Cloudへのメトリクス転送(長期保存)
- Kubernetes環境への拡張
得られた知見
Raspberry Piでの運用
- メモリ: 4GB RAMで十分運用可能(Prometheus + Grafana + Docker Exporter)
- ストレージ: SDカードでも動作するが、SSDを推奨(書き込み耐久性)
- ARM64対応: 主要なExporterはすべてARM64ビルドが提供されている
Prometheusの設計思想
Pull型アーキテクチャにより:
- 監視対象がダウンしても監視サーバーに影響なし
- ファイアウォール設定が単純(監視サーバー→対象への一方向)
- スケールアウトが容易
まとめ
Raspberry PiとOSSツールのみで、商用監視サービスに匹敵する監視基盤を構築できました。
このプロジェクトで使用した技術:
- インフラ: Linux, systemd, Docker, Docker Compose
- 監視: Prometheus, Grafana, 各種Exporter
- ネットワーク: Tailscale, ファイアウォール設定
- 自動化: Bashスクリプト
対応可能な業務:
- オンプレミス/クラウド環境の監視基盤構築
- Prometheus/Grafanaの導入・運用支援
- インフラの可視化・メトリクス設計
- アラート設計・通知設定