Docker Compose 的 RuoYi nginx exporter Prometheus + Alertmanager + 钉钉告警

一、整体落地架构(最终可用版)

复制代码
复制代码
Node Exporter → Prometheus → Alertmanager → DingTalk Webhook → 钉钉群
                                  ↓
                             告警恢复

✅ 核心结论:

告警能不能发出去,90% 取决于服务名、路径、模板三件事。


二、目录结构(必须完全一致)

复制代码
复制代码
/docker-compose/
├── docker-compose.yml
├── prometheus/
│   ├── prometheus.yml
│   └── rules/
│       └── node.yml
├── alertmanager/
│   └── alertmanager.yml
├── webhook/
│   ├── config.yml
│   └── templates/
│       └── default.tmpl   ✅ 缺这个必报 400

三、核心配置(全部来自 docx 实测)

✅ 1️⃣ Alertmanager(最容易写错的地方)

/docker-compose/alertmanager/alertmanager.yml

复制代码
复制代码
route:
  group_by: ["alertname"]
  group_wait: 10s
  group_interval: 30s
  repeat_interval: 1h
  receiver: dingtalk

receivers:
- name: dingtalk
  webhook_configs:
  - url: "http://dingtalk-webhook:8060/dingtalk/node/send"
    send_resolved: true

🚨 踩坑点

  • ❌ altermanager:9093(拼写错误)

  • ❌ 指向 webhook:8060

  • ✅ 必须写容器名 dingtalk-webhook


✅ 2️⃣ Prometheus 告警规则

/docker-compose/prometheus/rules/node.yml

复制代码
复制代码
groups:
- name: node-alerts
  rules:
  - alert: NodeDown
    expr: up{job="node_exporter"} == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "节点 {{ $labels.instance }} 已离线"
      description: "Node Exporter 无法访问超过 1 分钟"

并在 prometheus.yml中引入:

复制代码
复制代码
rule_files:
  - "/etc/prometheus/rules/*.yml"

🚨 踩坑点

  • Prometheus 里 job_name≠ 规则里 job=→ 告警永远不会触发

  • 测试时把 == 0改成 == 1立刻触发


✅ 3️⃣ Webhook 配置(解决 400 的关键)

/docker-compose/webhook/config.yml

复制代码
复制代码
targets:
  node:
    url: https://oapi.dingtalk.com/robot/send?access_token=7f92268b91852caa413f46e18783424e53db16df7a1a390301b2868ddebd6368
    message:
      text: '{{ template "dingtalk.default.message" . }}'
    http_config:
      headers:
        Content-Type: application/json

templates:
  - /etc/prometheus-webhook-dingtalk/templates/default.tmpl

✅ 必须显式声明 Content-Type: application/json


✅ 4️⃣ 告警模板(Go Template)

/docker-compose/webhook/templates/default.tmpl

复制代码
复制代码
{{ define "dingtalk.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range .Alerts -}}
==== [告警触发] ====
告警名称:{{ .Labels.alertname }}
实例:{{ .Labels.instance }}
级别:{{ .Labels.severity }}
摘要:{{ .Annotations.summary }}
详情:{{ .Annotations.description }}
时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{- end }}
{{- end }}

{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range .Alerts -}}
==== [告警恢复] ====
告警名称:{{ .Labels.alertname }}
实例:{{ .Labels.instance }}
时间:{{ .EndsAt.Format "2006-01-02 15:04:05" }}
{{- end }}
{{- end }}
{{ end }}

🚨 缺这个文件 = 100% 发不出告警


✅ 5️⃣ Docker Compose(webhook 部分)

复制代码
复制代码
dingtalk-webhook:
  image: timonwong/prometheus-webhook-dingtalk:latest
  container_name: dingtalk-webhook
  restart: unless-stopped
  ports:
    - "8060:8060"
  volumes:
    - /docker-compose/webhook/config.yml:/etc/prometheus-webhook-dingtalk/config.yml
    - /docker-compose/webhook/templates:/etc/prometheus-webhook-dingtalk/templates:ro
  networks:
    - ruoyi-net

四、Docx 中出现的「经典 6 大坑」

现象 根因 解决方式
no such host Docker DNS 找不到服务 用 容器名​ 而非服务名
Prometheus 不告警 job 不匹配 job="node_exporter"两边一致
钉钉无消息 400 错误 补 Content-Type: application/json
Webhook 报错 模板缺失 新建 default.tmpl
规则不生效 未挂载 rules 重启整个 compose
Alertmanager 不通 拼写错误 altermanager→ alertmanager

五、验证流程(照做必成功)

复制代码
复制代码
# 1. 触发告警
vi /docker-compose/prometheus/rules/node.yml
# expr 改为 up == 1

# 2. 重启
docker compose restart prometheus alertmanager dingtalk-webhook

# 3. 查看 webhook 日志
docker logs dingtalk-webhook --tail=50

# 4. 恢复告警
# 改回 up == 0
docker compose restart prometheus
相关推荐
杨浦老苏16 小时前
把项目管理搬回自己服务器:Windshift部署与避坑
docker·项目管理·群晖
木雷坞16 小时前
Baserow Docker部署:导入设备借用CSV,再用表单新增登记
运维·docker·容器
广目软件17 小时前
HA分布式架构采集节点变更操作手册20261029
运维·服务器·ansible·zabbix·prometheus
wefg118 小时前
【Docker】基本指令
运维·docker·容器
牛马工作号19 小时前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
运维·docker·容器
oioihoii20 小时前
Windows部署MySpeed自建测速服务:Docker运行后直接测速,再配置固定公网地址远程查看
运维·docker·容器
Jack N1 天前
【Strapi 系列之八】二次开发 + 生产部署,Docker + PostgreSQL + Nginx 一把梭
nginx·docker·postgresql·strapi
岁月宁静1 天前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
正经教主2 天前
【FDE系列】阶段2:Day 42(UP详细版):Dockerfile 实战 — 把你的应用打包成镜像
人工智能·docker·fde
刘马想放假2 天前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
docker·容器