自托管监控:用开源工具搭建监控体系

部署监控体系的逐步指南:Prometheus、Grafana、Loki、Node Exporter 和 Uptime Kuma。

监控服务器、服务和网站是必需的。但为每台主机每月向 Datadog 支付 $15 令人心痛,尤其是当你只有几台 VPS 和十几个自托管应用时。好消息是:开源监控体系一小时就能搭建完成,覆盖中等项目 90% 的需求。

本指南将搭建以下体系:Prometheus(指标)、Grafana(仪表板)、Loki(日志)、Node Exporter(系统指标)、Uptime Kuma(网站状态)。全部使用 Docker Compose,全部持久化存储,全部支持告警。

第1步:Docker Compose

创建 monitoring 目录和 docker-compose.yml 文件:

version: "3.8"
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.path=/prometheus"
      - "--storage.tsdb.retention.time=30d"
    ports:
      - "9090:9090"
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - "--path.procfs=/host/proc"
      - "--path.sysfs=/host/sys"
      - "--path.rootfs=/rootfs"
    ports:
      - "9100:9100"
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=changeme
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3000:3000"
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

第2步:Prometheus — 指标采集

创建 prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "node"
    static_configs:
      - targets: ["node-exporter:9100"]

  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

Node Exporter 采集 CPU、内存、磁盘、网络——所有系统指标。要监控多台服务器,在每台上运行 Node Exporter 并在 targets 中填写其 IP 地址。

第3步:Grafana — 可视化

访问 http://你的服务器:3000(用户名:admin,密码:changeme)。添加 Prometheus 作为数据源(URL:http://prometheus:9090)。

导入仪表板 1860(Node Exporter Full)——这是系统指标最受欢迎的模板。导入后你将看到精美的图表。

第4步:Loki — 日志

在 docker-compose.yml 中添加 Loki 和 Promtail:

  loki:
    image: grafana/loki:latest
    volumes:
      - loki_data:/loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    restart: unless-stopped

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - ./promtail.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml
    restart: unless-stopped

在 Grafana 中添加 Loki 作为数据源,使用 Explore 功能搜索日志。所有容器日志和系统日志——集中在一处,支持搜索和过滤。

第5步:Uptime Kuma — 网站状态

使用独立容器运行 Uptime Kuma 来监控网站和 API 的可用性:

  uptime-kuma:
    image: louislam/uptime-kuma:latest
    volumes:
      - uptime_kuma_data:/app/data
    ports:
      - "3001:3001"
    restart: unless-stopped

Uptime Kuma 可以进行 ping 检测、HTTP 状态检查、SSL 证书验证、TCP 端口扫描、DNS 记录检查。可配置 Telegram、Discord 或邮件通知。

第6步:告警

Prometheus 支持 Alertmanager 进行通知管理。最简单的配置——在 prometheus.yml 中添加规则文件:

rule_files:
  - "alert.rules.yml"

alert.rules.yml 中:

groups:
  - name: node
    rules:
      - alert: HighCPU
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }} CPU 使用率超过 80%"

Alertmanager 可以连接到 Telegram、邮件、Slack。

资源消耗

在 2 GB 内存的 VPS 上部署整套体系:

  • Prometheus:约 200 MB 内存 + 数据磁盘空间(取决于保留期)
  • Grafana:约 150 MB 内存
  • Loki:约 200 MB 内存
  • Node Exporter:约 50 MB 内存
  • Promtail:约 100 MB 内存
  • Uptime Kuma:约 100 MB 内存

总计:完整监控体系约 800 MB 内存。剩余的 1.2 GB 足够运行你的应用程序。

后续扩展

有了这套体系,你将获得:

  • 所有服务器的实时指标
  • 集中化的可搜索日志
  • Grafana 的精美仪表板
  • 问题告警
  • 网站可用性监控

当项目规模扩大后,可以添加:cAdvisor(容器指标)、Blackbox Exporter(HTTP/DNS/TCP 检查)、Grafana Tempo(链路追踪)。

不需为每台主机支付 $15。只有你的数据在你的服务器上。

Prometheus 官方网站 | Grafana 官方网站 | Uptime Kuma on GitHub ENDOFFILE'