監視を集約した構成

ローカル開発基盤の監視を Storage Server(Mac mini, Ubuntu 24.04)に集めました。24/7 稼働させ、Compute Server や Desktop PC が停止してもメトリクスとログを収集します。

サービス管理は compose + systemd から Quadlet に移しました。.container から systemd unit を生成し、アクセス対象に応じて rootful と rootless を分けています。

収集対象経路保存先
ホストメトリクス(3台)node_exporter → PrometheusStorage Server
ディスク健全性(2台)smartctl_exporter → PrometheusStorage Server
RouterOS メトリクスMKTXP (API) → PrometheusStorage Server
MinIO メトリクス/minio/v2/metrics/cluster → PrometheusStorage Server
RouterOS / Netgear syslogUDP 1514 (rfc3164) → Promtail → LokiStorage Server
Linux ログjournal / ファイル → Promtail → LokiStorage Server
可視化Grafana (Desktop PC) → Prometheus + LokiDesktop PC

ハードウェアとストレージ

項目内容
筐体Mac mini late 2018 (x86)
CPUCore i3
RAMDDR4 SO-DIMM 8GB
StorageSSD 2TB (OS, LVM), ext M.2 SSD 4TB (LUKS → /mnt/data)
NIC1GbE + 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 サービス構成

初期構成では、prometheus、loki、promtail の専用ユーザーと podman-compose@.service で rootless 運用していました。その後、Quadlet に移し、必要な権限ごとに分けました。

  /opt/containers/systemd/
├── rootful/
│   ├── node-exporter.container
│   ├── promtail.container
│   └── smartctl-exporter.container
└── rootless/
    ├── loki.container
    ├── minio.container
    ├── mktxp.container
    └── prometheus.container
  

rootful / rootless の分離基準

スコープ配置先理由
rootfulnode-exporter, promtail, smartctlホストの /、/var/log/journal、SMART デバイスへのアクセスが必要
rootlessprometheus, loki, mktxp, minioネットワーク経由のデータ収集・保存のみ。ホストデバイスへの直接アクセス不要

node_exporter は Network=host と Volume=/:/host:ro,rslave を使うため rootful にしました。promtail も /var/log/journal の参照と UDP 1514 の受信が必要です。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
  

ポート一覧

ポートサービスホスト
9090Prometheusstorage
9100node_exporterstorage, desktop, compute
3100Lokistorage
9080Promtailstorage
9633smartctl_exporterstorage, compute
49090MKTXP (RouterOS)storage
9000MinIOstorage

node_exporter の3台展開

Storage Server と Compute Server は rootful Quadlet で node_exporter を動かします。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 に送ります。

  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 のメトリクスには、API を使う MKTXP Exporter を選びました。到達性を確認しやすく、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 で 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 sourceLoki
Query{job="network-syslog"}
TransformationsExtract 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)へ移行中です。Rust 製の Vector はログ収集に加え、メトリクス変換とルーティングも扱えます。

Go + NATS + Dagster AI 基盤では、Vector が TELEMETRY ストリーム (telemetry.>) を購読し、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 が前提