結論

ローカル開発基盤の監視レイヤーは、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 → 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 サービス構成

初期は 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 の分離基準

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

node_exporter は Network=hostVolume=/:/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
  

ポート一覧

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

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 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)への移行を進めている。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 が前提