--- title: 家庭监控方案:Prometheus + Grafana + Node Exporter + cAdvisor +Blackbox tags: - "#prometheus" - "#monitoring" - "#grafana" author: - Wei Shen created: 2025-11-11 published: description: 按优先级与场景划分的、能通过 Docker 部署的监控方案,并附带部署建议、关键监控项、告警示例 --- #prometheus #grafana #monitoring 我给你一套按优先级与场景划分的、能通过 Docker 部署的监控方案,并附带部署建议、关键监控项、告警示例、以及两套可直接拷贝的 `docker-compose` 验证模板(一个轻量、一个较完整)。我把信息组织成清单和操作步骤,便于你直接在 NAS / Ubuntu Server 上实践。 # 核心目标(你要覆盖的监控面) 1. 主机层:CPU / 内存 / 磁盘 / 网络 / I/O / inode。 2. 容器层:容器运行状态、重启次数、资源限制/使用、退出码、镜像版本。 3. 服务层(应用):HTTP(S) 可用性、响应码、延迟、错误率、TLS 证书到期、DNS 解析是否异常。 4. 日志:应用错误/异常、关键业务日志索引(可选全文搜索)。 5. 合规与可视化:集中 time-series 存储 + 仪表盘 + 报警/通知通道(邮件/Slack/电话/Teams)。 ![[IMG-20251229190624400.png]] # 推荐工具(均可 Docker 化) 按功能分组,给出用途与为何推荐(并标注官方安装/镜像文档): ### 观测 + 时序数据 / 查询 / 告警 - **Prometheus(采集 + 告警规则)**:拉取 exporters(node_exporter、cAdvisor、blackbox_exporter)采集指标,支持 PromQL 命名与告警规则。适合做主观测时序库与告警。([Prometheus](https://prometheus.io/?utm_source=chatgpt.com "Prometheus - Monitoring system & time series database")) - **Alertmanager**(Prometheus 的告警分发):用于抑制、分组并把告警推到邮件/Slack/Webhook/PagerDuty。 ### 可视化 + 日志聚合 - **Grafana**:展示 Prometheus / VictoriaMetrics / Loki 等数据源的仪表盘与告警。支持仪表盘模板与报警通知。([Grafana Labs](https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/?utm_source=chatgpt.com "Run Grafana Docker image | Grafana documentation")) - **Grafana Loki + Promtail**(如果你要日志聚合): 轻量级、与 Grafana 原生集成,适合把应用日志索引进来。 ### 主机 / 容器指标(简易采集) - **node_exporter**(主机指标采集,Prometheus exporter) - **cAdvisor**(容器资源/性能指标,Prometheus 可抓取) - **blackbox_exporter**(外网/内网 HTTP/TCP/ICMP/HTTPS 监测/探测,用于合成监测)。 ### 合成 / 可用性 / Uptime 检查(外网/内网访问) - **Uptime Kuma**:自托管的“Uptime Robot”式工具,易上手,做外网或内网的合成可用性探针(HTTP/TCP/DNS/TLS),带历史和通知支持。推荐用于合成监测(synthetic checks)。([uptimekuma.org](https://uptimekuma.org/install-uptime-kuma-docker/?utm_source=chatgpt.com "Install Uptime Kuma using Docker or Docker Compose")) ### 轻量单主机快速看板(推荐做 PoC) - **Netdata**:开箱即用的详细 realtime 主机/容器监控面板(默认 19999 端口)。适合快速诊断热点,能和 Prometheus 集成做长期存储。([learn.netdata.cloud](https://learn.netdata.cloud/docs/netdata-agent/installation/docker?utm_source=chatgpt.com "Install Netdata with Docker")) ### 时序数据库替代(可选,用于更大规模) - **VictoriaMetrics / Thanos / Cortex**:当数据量大或想要长期存储 + 高效写入时。VictoriaMetrics 配置简单,常见于 single-host 或 small-cluster 场景。 ### 管理/操作视角(容器管理) - **Portainer**:可视化管理 Docker 主机/Swarm,带部分监控/日志功能(不替代 Prometheus/Grafana,但便于运维快速操作)。 --- # 推荐的架构方案 ### 标准(生产常见,适合多主机) 用途:长期监控、告警、仪表盘。 组件:Prometheus + node_exporter + cAdvisor + blackbox_exporter + Grafana + Alertmanager。可选 Loki(日志)、VictoriaMetrics(长期存储)。Prometheus 抓取所有主机/容器指标,Grafana 做可视化,Alertmanager 负责通知。([Prometheus](https://prometheus.io/?utm_source=chatgpt.com "Prometheus - Monitoring system & time series database")) --- # 我猜你可能没想过但挺有用的点(主动建议) 1. **合成(synthetic)与真实用户监控结合**:Uptime Kuma 做外网/内网可用性探针 + Prometheus blackbox_exporter 做更细粒度 HTTP/TLS/DNS 探测(响应码、证书有效期、解析时延)。 2. **TLS 证书到期告警**:通过 blackbox_exporter 或直接 Prometheus exporter(或在 Uptime Kuma 中)设置证书剩余天数阈值告警。 3. **DNS 解析单独监控**:外网访问不通常是 DNS 问题,单独做 DNS probe(blackbox_exporter 支持)。 4. **短期与长期数据分层**:Netdata 做短期高分辨率展示,Prometheus + VictoriaMetrics 做长期汇总(remote_write)。 5. **自动化接入新主机**:在新主机上用 Ansible / cloud-init 快速部署 node_exporter + cAdvisor + promtail(日志)并注册到 Prometheus。 6. **容器标签化 & 报表**:保证容器/服务启动时打上 `service=xxx`、`env=prod` 标签,便于 PromQL 分组和 SLA 报表。 --- # 推荐监控项(可直接写为 PromQL/告警条件) 核心指标与告警建议(举例): - 主机:`node_filesystem_avail_bytes` < 10% → 磁盘告警。 - CPU:5 分钟平均 CPU 使用率 > 85%(或按核数修正)→ 告警。 - 内存:`node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.15` → 内存告警。 - 容器:容器重启次数 `increase(container_restart_total[1h]) > 0` → 告警(可过滤重启策略更新产生的重启)。 - HTTP:黑箱探测 `probe_success == 0` 连续 3 次 → 报警;`probe_duration_seconds` 高于阈值 → 性能警告。 - TLS:证书剩余天数 < 14 → 告警。 (这些可直接放进 Prometheus 的 alert rules,也可在 Grafana 转换为告警) --- # 安全与运维注意(捷径与坑) - 减少容器权限:尽量不要给 exporters 过高宿主机权限,除非需要(e.g., Netdata 需要 `/proc`、`/sys`、Docker socket 才能全面监控)。审慎开启 Docker socket 挂载(风险:容器拿到宿主机 root 等同权限)。([learn.netdata.cloud](https://learn.netdata.cloud/docs/netdata-agent/installation/docker?utm_source=chatgpt.com "Install Netdata with Docker")) - 网络分区:把监控流量/端口放在管理 VLAN 或通过防火墙限定访问。 - 存储:Prometheus 本地磁盘会增长,考虑长期保留要用远端存储或定期 snapshot。 - 备份:Grafana 仪表盘 JSON 导出,Prometheus rule 与配置放在 Git(GitOps)。 - 证书/反向代理:生产建议在反向代理(Caddy/Traefik/Nginx)做 TLS 终端并加 Basic/Auth 或内部 SSO。 --- # 快速落地步骤(我会按专家视角把步骤拆成可运行的命令) 1. 在一台测试机器上用上面 PoC compose 启动,验证 Netdata 与 Uptime Kuma 可访问(19999 / 3001)。 2. 把 Prometheus compose 与 `prometheus.yml` 上线到主要监控节点,配置 `scrape_configs` 抓取 node_exporter / cadvisor / blackbox。 3. 在每台主机上用 docker-compose 或 Ansible 部署 node_exporter(或使用 host network 模式),并在 Prometheus 中加入目标。 4. 在 Grafana 导入几个预置 dashboard(node_exporter、cadvisor、blackbox 面板),并在 Alertmanager 中配置告警路由(Slack/邮件)。 5. 把 Uptime Kuma 的探测项(内网域名/公网域名)全部建好,设置通知通道(Mail / Webhook 指向 Alertmanager/Grafana 或直接 Slack)。 --- # 参考资源(官网/文档 — 我把主要 URL 放在下面,便于你深入阅读与部署) - Prometheus 官方: [https://prometheus.io/](https://prometheus.io/) - Prometheus Docker 镜像(Docker Hub): [https://hub.docker.com/r/prom/prometheus](https://hub.docker.com/r/prom/prometheus) - Grafana Docker 安装文档: [https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/](https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/) --- # 我们来落地选项 **A:完整的 `docker-compose` + `prometheus.yml` + alert rules**。 目标是: 在你家里(NAS/Ubuntu Server)上,用 Docker 一键启动一个完整的监控栈。 **功能覆盖**: - 主机与容器指标(`node_exporter`, `cAdvisor`) - 内外网域名健康探测(`blackbox_exporter`) - 数据采集与存储(`prometheus`) - 可视化(`grafana`) - 告警分发(`alertmanager`,可选接邮件/Slack) --- ## 🧱 一、目录结构建议 请在主机上建一个目录 `/opt/monitoring/`(可换路径): ``` /opt/monitoring/ ├── docker-compose.yml ├── prometheus/ │ ├── prometheus.yml │ ├── alerts.yml │ └── targets/ │ ├── node.yml │ ├── cadvisor.yml │ └── blackbox.yml ├── alertmanager/ │ └── config.yml └── grafana/ ``` --- ## 🐳 二、`docker-compose.yml` 这是一个完整可运行的 Compose 文件,覆盖核心组件。 ``` yaml version: '3.8' services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: always volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./prometheus/alerts.yml:/etc/prometheus/alerts.yml:ro - ./prometheus/targets:/etc/prometheus/targets:ro - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.enable-lifecycle' ports: - "9090:9090" depends_on: - cadvisor - node_exporter - blackbox grafana: image: grafana/grafana:latest container_name: grafana restart: always ports: - "3000:3000" environment: - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_NAME=Main Org - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer - GF_SECURITY_ALLOW_EMBEDDING=true - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana-storage:/var/lib/grafana depends_on: - prometheus alertmanager: image: prom/alertmanager:latest container_name: alertmanager restart: always ports: - "9093:9093" volumes: - ./alertmanager/config.yml:/etc/alertmanager/config.yml:ro command: - '--config.file=/etc/alertmanager/config.yml' node_exporter: image: prom/node-exporter:latest container_name: node_exporter restart: always network_mode: "host" pid: "host" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: cadvisor restart: always ports: - "8080:8080" volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro blackbox: image: prom/blackbox-exporter:latest container_name: blackbox restart: always ports: - "9115:9115" volumes: prometheus-data: grafana-storage: ``` --- ## ⚙️ 三、Prometheus 配置文件 `prometheus.yml` ```yaml global: scrape_interval: 15s evaluation_interval: 30s rule_files: - "/etc/prometheus/alerts.yml" alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093'] scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['prometheus:9090'] - job_name: 'node_exporter' file_sd_configs: - files: - /etc/prometheus/targets/node.yml - job_name: 'cadvisor' file_sd_configs: - files: - /etc/prometheus/targets/cadvisor.yml - job_name: 'blackbox_http' metrics_path: /probe params: module: [http_2xx] file_sd_configs: - files: - /etc/prometheus/targets/blackbox.yml relabel_configs: - source_labels: [__address__] target_label: __param_target - target_label: __address__ replacement: blackbox:9115 - source_labels: [__param_target] target_label: instance ``` --- ## 🗂 四、Targets 文件示例 ### `targets/node.yml` ```yaml - targets: - "192.168.3.47:9100" labels: env: home role: server ``` ### `targets/cadvisor.yml` ```yaml - targets: - "cadvisor:8080" labels: env: home role: docker ``` ### `targets/blackbox.yml` ```yaml - targets: - "https://pq2435887bh.vicp.fun" - "http://shenwei-nas.vip.cpolar.cn" - "https://transmission.vip.cpolar.cn" labels: env: home type: website ``` --- ## 🚨 五、Prometheus 告警规则 `alerts.yml` ```yaml groups: - name: system-alerts rules: - alert: HostHighCPU expr: avg(rate(node_cpu_seconds_total{mode="user"}[2m])) * 100 > 85 for: 2m labels: severity: warning annotations: summary: "高 CPU 使用率" description: "主机 CPU 使用率超过 85%(持续 2 分钟)" - alert: HostLowDisk expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) < 0.10 for: 5m labels: severity: critical annotations: summary: "磁盘空间不足" description: "磁盘剩余空间低于 10%" - alert: HostLowMemory expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.15 for: 5m labels: severity: warning annotations: summary: "内存使用率高" description: "可用内存低于 15%" - alert: ContainerRestarting expr: increase(container_last_seen[5m]) == 0 for: 5m labels: severity: warning annotations: summary: "容器异常退出或未上报" description: "5 分钟内容器未更新指标,可能异常退出" - alert: HTTPProbeFailed expr: probe_success == 0 for: 2m labels: severity: critical annotations: summary: "站点不可达" description: "HTTP 探测失败:{{ $labels.instance }}" - alert: TLSCertExpiring expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 14 for: 1h labels: severity: warning annotations: summary: "TLS 证书即将到期" description: "证书 {{ $labels.instance }} 剩余不到 14 天" ``` --- ## 📧 六、Alertmanager 配置 `config.yml` ```yaml global: resolve_timeout: 5m route: receiver: default group_wait: 10s group_interval: 5m repeat_interval: 3h receivers: - name: default email_configs: - to: "youremail@example.com" from: "monitor@example.com" smarthost: "smtp.example.com:587" auth_username: "monitor@example.com" auth_password: "yourpassword" ``` > 💡 你也可以改成 Slack、Teams、Telegram 等通知方式,只要换成对应的 `*_configs` 即可。 --- ## 🧩 七、Grafana 快速导入仪表盘 安装后访问 `http://localhost:3000`(admin/admin 登录): - 添加 Prometheus 数据源:`http://prometheus:9090` - 导入官方 Dashboard: - Node Exporter Full: `1860` - cAdvisor Container Metrics: `14282` - Blackbox Exporter Probe: `7587` 这些 ID 可直接在 Grafana.com → Dashboards → “Import” 输入。 --- ## 🚀 八、启动命令 ```bash cd /opt/monitoring docker compose up -d ``` 验证访问: - Prometheus: [http://192.168.3.47:9090](http://192.168.3.47:9090/) - Grafana: [http://192.168.3.47:3000](http://192.168.3.47:3000/) - Alertmanager: [http://192.168.3.47:9093](http://192.168.3.47:9093/) - cAdvisor: [http://192.168.3.47:8080](http://192.168.3.47:8080/) - Blackbox exporter: [http://192.168.3.47:9115](http://192.168.3.47:9115/) - node_exporter: [http://192.168.3.47:9100/metrics](http://192.168.3.47:9100/metrics) ## 🧠 九、扩展建议(后续可以加) - 加 **Loki + Promtail** 做日志收集。 - 加 **Uptime Kuma** 作为轻量合成探针外层 UI(外观好看)。 - 用 **Traefik/Caddy** 把上述组件统一暴露并加 HTTPS。 - 加 **VictoriaMetrics** 作为长时存储(Prometheus remote_write)。