Storage Server の常時稼働監視基盤: Prometheus・Loki・Promtail と Quadlet による構築記録
Mac mini (Ubuntu 24.04) を常時稼働の監視ノードとして構築し、Prometheus・Loki・Promtail・MKTXP を Quadlet で rootful/rootless 分離運用する全記録。RouterOS/Netgear の syslog 収集、node_exporter の3台展開、Grafana 統合まで。
結論
ローカル開発基盤の監視レイヤーは、Storage Server(Mac mini, Ubuntu 24.04)を 24/7 稼働の監視ノードとして集約する構成で確定した。Compute Server や Desktop PC が停止しても、メトリクス収集とログ集約は Storage Server 単体で継続する。
サービス管理は初期の compose + systemd テンプレートから Quadlet(.container → systemd 自動生成)に移行し、rootful と rootless でスコープを分離している。
| 収集対象 | 経路 | 保存先 |
|---|---|---|
| ホストメトリクス(3台) | node_exporter → Prometheus | Storage Server |
| ディスク健全性(2台) | smartctl_exporter → Prometheus | Storage Server |
| RouterOS メトリクス | MKTXP (API) → Prometheus | Storage Server |
| MinIO メトリクス | /minio/v2/metrics/cluster → Prometheus | Storage Server |
| RouterOS / Netgear syslog | UDP 1514 (rfc3164) → Promtail → Loki | Storage Server |
| Linux ログ | journal / ファイル → Promtail → Loki | Storage Server |
| 可視化 | Grafana (Desktop PC) → Prometheus + Loki | Desktop PC |
ハードウェアとストレージ
| 項目 | 内容 |
|---|---|
| 筐体 | Mac mini late 2018 (x86) |
| CPU | Core i3 |
| RAM | DDR4 SO-DIMM 8GB |
| Storage | SSD 2TB (OS, LVM), ext M.2 SSD 4TB (LUKS → /mnt/data) |
| NIC | 1GbE + ext 10GbE (RTL8159, 10.10.10.3) |
nvme0n1 (1.8T) → LVM → / (100G)
nvme1n1 (3.6T) → LUKS → /mnt/data (archive, backups, object storage)
OS は Ubuntu 24.04.3 LTS。NTP と DNS はルーター参照、タイムゾーンは UTC に統一している。
Quadlet サービス構成
初期は compose + [email protected] テンプレートでサービスごとに専用ユーザー(prometheus, loki, promtail)を作り rootless 運用していた。現在は Quadlet に移行し、rootful と rootless でスコープを分離している。
/opt/containers/systemd/
├── rootful/
│ ├── node-exporter.container
│ ├── promtail.container
│ └── smartctl-exporter.container
└── rootless/
├── loki.container
├── minio.container
├── mktxp.container
└── prometheus.container
rootful / rootless の分離基準
| スコープ | 配置先 | 理由 |
|---|---|---|
| rootful | node-exporter, promtail, smartctl | ホストの /、/var/log/journal、SMART デバイスへのアクセスが必要 |
| rootless | prometheus, loki, mktxp, minio | ネットワーク経由のデータ収集・保存のみ。ホストデバイスへの直接アクセス不要 |
node_exporter は Network=host、Volume=/:/host:ro,rslave でホスト全体をマウントするため rootful が自然。promtail も /var/log/journal と UDP 1514 のリスンが必要で rootful に置いている。smartctl_exporter はディスクデバイスへの直接アクセスが必要。
Quadlet の動作検証と UID マッピングの詳細は Rootless Podman + Quadlet によるコンテナ運用基盤の構築 を参照。
Prometheus 設定
全 7 job で 3 台のホストと RouterOS、MinIO をカバーしている。
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- storage.home.arpa:9090
- job_name: node-exporter
static_configs:
- targets:
- storage.home.arpa:9100
- desktop.home.arpa:9100
- compute.home.arpa:9100
- job_name: loki
static_configs:
- targets:
- storage.home.arpa:3100
- job_name: promtail
static_configs:
- targets:
- storage.home.arpa:9080
- job_name: smartctl
scrape_interval: 5m
static_configs:
- targets:
- storage.home.arpa:9633
- compute.home.arpa:9633
- job_name: mikrotik
static_configs:
- targets:
- storage.home.arpa:49090
- job_name: minio
metrics_path: /minio/v2/metrics/cluster
static_configs:
- targets:
- storage.home.arpa:9000
ポート一覧
| ポート | サービス | ホスト |
|---|---|---|
| 9090 | Prometheus | storage |
| 9100 | node_exporter | storage, desktop, compute |
| 3100 | Loki | storage |
| 9080 | Promtail | storage |
| 9633 | smartctl_exporter | storage, compute |
| 49090 | MKTXP (RouterOS) | storage |
| 9000 | MinIO | storage |
node_exporter の3台展開
Storage Server 自身は Quadlet(rootful)で node_exporter を常駐させている。Compute Server も同様に Quadlet。Desktop PC(Mac)は Homebrew 経由で導入し、0.0.0.0 でリスンさせている。
# Mac (Homebrew)
brew install node_exporter
sudo brew services start node_exporter
# 外部 scrape 用に listen アドレスを変更
sudo sed -i '' 's/--web.listen-address=127\.0\.0\.1:9100/--web.listen-address=0.0.0.0:9100/' \
/Library/LaunchDaemons/homebrew.mxcl.node_exporter.plist
Promtail 設定(ログ収集)
Promtail は rootful Quadlet で動作し、Linux ログと ネットワーク機器の syslog の両方を収集して Loki に push する。
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /promtail/positions.yaml
clients:
- url: http://storage.home.arpa:3100/loki/api/v1/push
scrape_configs:
# --- Linux ファイルログ ---
- job_name: security-files
static_configs:
- labels:
job: security
host: storage.home.arpa
__path__: /var/log/alternatives.log*
- labels:
job: security
host: storage.home.arpa
__path__: /var/log/apport.log*
- job_name: apt-files
static_configs:
- labels:
job: apt
host: storage.home.arpa
__path__: /var/log/apt/history.log
- labels:
job: apt
host: storage.home.arpa
__path__: /var/log/apt/term.log
- labels:
job: apt
host: storage.home.arpa
__path__: /var/log/dpkg.log
# --- systemd journal ---
- job_name: kernel-journal
journal:
path: /var/log/journal
max_age: 168h
labels:
job: kernel
host: storage.home.arpa
relabel_configs:
- source_labels: ["__journal__hostname"]
target_label: host
- source_labels: ["__journal__syslog_identifier"]
target_label: ident
- source_labels: ["__journal_priority"]
target_label: priority
- job_name: systemd-units
journal:
path: /var/log/journal
max_age: 168h
labels:
job: systemd
host: storage.home.arpa
relabel_configs:
- source_labels: ["__journal__systemd_unit"]
target_label: unit
- source_labels: ["__journal__hostname"]
target_label: host
- source_labels: ["__journal__uid"]
target_label: uid
# --- ネットワーク機器 syslog (RouterOS / Netgear WiFi) ---
- job_name: network-syslog
syslog:
listen_address: 0.0.0.0:1514
listen_protocol: udp
syslog_format: rfc3164
use_incoming_timestamp: false
label_structured_data: true
relabel_configs:
- source_labels: ["__syslog_message_hostname"]
target_label: host
- source_labels: ["__syslog_message_app_name"]
target_label: app
- source_labels: ["__syslog_severity"]
target_label: severity
- source_labels: ["__syslog_facility"]
target_label: facility
ネットワーク機器からの syslog 受信
RouterOS と Netgear WiFi AP から UDP 1514 で rfc3164 形式の syslog を受信する。
RouterOS 側の設定:
/system logging action add name=promtail target=remote remote=10.10.10.3 remote-port=1514 bsd-syslog=yes
/system logging add topics=firewall action=promtail
/system logging add topics=system,info action=promtail
Firewall ログ一括有効化:
/ip firewall filter set [find builtin=no && dynamic=no] log=yes log-prefix="FW: "
MKTXP: RouterOS API メトリクス
RouterOS のメトリクスは SNMP ではなく MKTXP Exporter(RouterOS API 経由)を採用した。API の方が到達性の確認が単純で、SNMP Exporter のネットワークモード問題を回避できる。
[edge.home.arpa]
hostname = edge.home.arpa
username = metrics
password = (API user password)
port = 8728
use_ssl = False
verify_ssl = False
timeout = 5
allow_duplicates = False
http://storage.home.arpa:49090/metrics に RouterOS の CPU、メモリ、温度、インターフェース統計、DHCP 情報が公開される。Grafana では「Mikrotik MKTXP Exporter」ダッシュボードで可視化。
Grafana 連携(Desktop PC 側)
可視化は Desktop PC(Mac Studio)の Grafana から Storage Server のデータソースを参照する。収集・保存と可視化を分離する構成。
データソース
- Prometheus →
http://storage.home.arpa:9090 - Loki →
http://storage.home.arpa:3100
RouterOS ログの Table パネル
| 項目 | 設定 |
|---|---|
| Data source | Loki |
| Query | {job="network-syslog"} |
| Transformations | Extract fields → Organize fields |
| 残す列 | Time, host, app, severity, line |
LogQL クエリ例:
{job="network-syslog"} | line_format "{{.time}} | {{.host}} | {{.severity}} | {{.line}}"
メトリクスとログを同じ Grafana に寄せることで、RouterOS の負荷スパイクと同時刻の firewall ログを一画面で追える。
Vector への移行(進行中)
Promtail は 2026-03 に EOL を迎えたため、Vector(Datadog Telemetry)への移行を進めている。Vector は Rust 製で Promtail のログ収集機能に加えてメトリクス変換・ルーティングも担える。
Go + NATS + Dagster AI オーケストレーション基盤では、TELEMETRY ストリーム(telemetry.>)を Vector が subscribe して Prometheus / Loki に流す構成がすでに設計済みで、Promtail の役割をそのまま Vector に移管する方向で進めている。
注意事項
- CRS304 の L3 / フィルタで監視ポート(9100, 9633 等)がブロックされていないか確認する
- Mac の node_exporter はデフォルトで localhost bind。外部 scrape するなら plist 修正が必要
- 監視ポートは内部セグメントのみに制限する
- smartctl_exporter は 5 分間隔で十分。過剰な scrape はディスクへの負荷になる
- Promtail の journal 収集には
/var/log/journalへのアクセスが必要で、rootful Quadlet が前提
