n8n + 飞书/钉钉 Webhook 实战:监控告警自动推送到群

监控告警最怕的不是出问题,而是出问题没人看见。把 Uptime Kuma 检测到的服务异常,通过 n8n 转到飞书或钉钉群里,整个链路不依赖云端、低延迟、还能顺手做告警聚合和去重。这篇文章从零开始,把 n8n、Uptime Kuma、飞书/钉钉群机器人三件事串起来,做到一篇文章跑通。

整体架构示意图,Uptime Kuma 检测故障后通过 Webhook 通知 n8n,n8n 解析后转发到飞书/钉钉群-1

环境准备

需要一台 Linux 服务器(或者装了 Docker Desktop 的 Mac/Windows),所有组件都跑在 Docker 里,互不污染。下面的命令以 Linux 为例,其他系统基本一致。

  • Docker:没有的话先装一下,执行 docker --version 能输出版本号即可。
  • 公网可达:Webhook 回调必须能从 Uptime Kuma 触达 n8n,所以 n8n 这边要有公网地址或做了反代。本地调试可以用 ngrok 之类的工具把 5678 端口暴露出去。
  • 一个飞书或钉钉群,并有添加机器人的权限。

部署 n8n

n8n 官方仓库 README 提供了最简启动方式,用 n8nio/n8n 镜像直接把数据持久化到本地 volume:

docker volume create n8n_data
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n

参数说明:

  • -p 5678:5678:把容器的 5678 端口映射到宿主机,n8n 编辑器就开在这里。
  • -v n8n_data:/home/node/.n8n:把配置、数据库、凭据等持久化到名为 n8n_data 的 volume,重启容器不丢数据。
  • -it --rm:这是 README 给的交互式启动方式,临时调试用。如果要让它常驻后台,把 -it --rm 换成 -d --restart=always 即可。

启动后浏览器打开 http://:5678,第一次访问会让你创建管理员账号,照着提示走。进到主界面就算部署成功。

> 注意:如果服务器开了防火墙,记得放行 5678 端口;如果你打算在 Uptime Kuma 那边填回调地址,地址必须是 n8n 实际可被访问的地址,不能是 localhost

n8n 编辑器界面,左侧节点面板,右侧空白画布,准备新建工作流-2

部署 Uptime Kuma

Uptime Kuma 自带 Docker 镜像,开箱即用。官方推荐方式:

docker volume create uptime-kuma
docker run -d \
--restart=always \
--name=uptime-kuma \
-p 3001:3001 \
-v uptime-kuma:/app/data \
louislam/uptime-kuma:1

参数说明:

  • -p 3001:3001:Uptime Kuma 的 Web UI 端口。
  • -v uptime-kuma:/app/data:把监控数据、配置、通知设置等持久化到 uptime-kuma volume。
  • --restart=always:保证容器异常退出后自动拉起。

镜像 tag(这里是 :1)建议以 Uptime Kuma 官方仓库 的最新稳定版为准。启动后访问 http://:3001,第一次会让你设置管理员账号密码。

> 同样的:Uptime Kuma 和 n8n 如果不在同一台机器或者走反代,端口和域名要自己对应改一下。

配置飞书/钉钉群机器人

飞书

  1. 打开飞书群聊右上角「设置」→「群机器人」→「添加机器人」→「自定义机器人」。
  2. 填一个机器人名字,比如「告警小助手」。
  3. 安全设置建议至少勾「自定义关键词」,关键词就用「告警」这种词,n8n 拼 JSON 时带上就行。需要更严的可以勾「签名校验」,那就得在 n8n 那边按时间戳 + secret 算签名再一起 POST。
  4. 复制机器人的 Webhook URL,形如 https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx

钉钉

  1. 群聊右上角「群设置」→「智能群助手」→「添加机器人」→「自定义」(旧版叫「自定义机器人」)。
  2. 安全设置里有三种:自定义关键词、加签、IP 白名单。生产环境强烈建议「加签」,n8n 那边按钉钉文档算签名后再发请求。
  3. 复制 Webhook URL,形如 https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx

> 两家的消息 JSON 格式差异较大,而且官方会不定期更新字段。本文的格式示例以 飞书自定义机器人文档钉钉自定义机器人文档 为准,遇到对不上的字段以你看到的最新版文档为准。

飞书群机器人添加自定义机器人时安全设置的三种选项:自定义关键词、加签、IP 白名单-3
📷 Bernd 📷 Dittrich / Unsplash License / 来源

### 在 n8n 里搭工作流

回到 n8n 编辑器,新建一个 workflow。这里设计成「一个 Webhook 入口 + 一条分支到飞书/钉钉」,先做飞书,钉钉同构。

第一步:添加 Webhook 节点

  1. 画布上点 +,搜「Webhook」并添加。
  2. 节点的 HTTP Method 选 POST(Uptime Kuma 默认推 POST)。
  3. Path 写一个辨识度高的字符串,比如 uptime-alert-feishu,最终触发地址会是 http:///webhook/uptime-alert-feishu
  4. Authentication 这里先用 None,生产环境建议改 Header Auth,加一个密钥字段,让 Uptime Kuma 在请求头里带过来,n8n 校验不通过就丢弃。
  5. 点「Listen for test event」或「Execute node」,先让节点进入监听状态。

把这个完整 URL 复制出来,下一步要填到 Uptime Kuma 里。

n8n 中 Webhook 节点配置面板,HTTP Method 为 POST,Path 填入自定义字符串,下方有完整的 Webhook URL-4
📷 Team Nocoloco / Unsplash License / 来源

#### 第二步:加 Function 节点解析 payload

Uptime Kuma 的 Webhook 通知 payload 大致是这样一个 JSON 结构(具体字段名以 Uptime Kuma 文档为准):

{
"monitor": {
"name": "示例站点",
"url": "https://example.com",
"type": "http"
},
"status": "down",
"msg": "HTTP 500",
"time": "2024-01-01T00:00:00.000Z"
}

加一个 Code(或 Function)节点,用 JS 把关心的字段抽出来:

const item = $input.item.json;
const name = item.monitor?.name ?? '未知监控';
const url = item.monitor?.url ?? '';
const status = item.status ?? 'unknown';
const msg = item.msg ?? '';
const time = item.time ?? '';

return [{
json: {
name,
url,
status,
msg,
time
}
}];

如果只想拼文本不写代码,也可以用 Set 节点手动从 {{$json.monitor.name}} 这种表达式里抽字段,多个字段就加多个 Set 节点或者用一次 Set 配多条表达式。

第三步:HTTP Request 节点推飞书

加一个 HTTP Request 节点,连到上面 Function 之后:

  • Method: POST
  • URL: 飞书机器人的 Webhook URL
  • Body Content Type: JSON
  • Body(用表达式把上一步字段拼进去):
{
"msg_type": "text",
"content": {
"text": "【告警】{{$json.name}}\n状态:{{$json.status}}\n信息:{{$json.msg}}\n时间:{{$json.time}}\n地址:{{$json.url}}"
}
}

如果飞书机器人开了「签名校验」,Body 里还要带 timestampsign 字段,计算方式见飞书官方文档(一般是 HMAC-SHA256 加 secret),可以在 n8n 里再加一个 Code 节点算完再传给 HTTP Request。

n8n 工作流全貌,从左到右依次是 Webhook 入口节点、Code 解析节点、HTTP Request 推飞书节点-5
📷 Bernd 📷 Dittrich / Unsplash License / 来源

#### 第四步(可选):再加一条分支推钉钉

钉钉的 message JSON 长得不一样,最简文本格式:

{
"msgtype": "text",
"text": {
"content": "【告警】{{$json.name}}\n状态:{{$json.status}}\n信息:{{$json.msg}}\n时间:{{$json.time}}\n地址:{{$json.url}}"
}
}

如果开了「加签」,URL 后面要拼接 &timestamp=xxx&sign=yyy,签名的算法见钉钉文档。做法是在 n8n 里加 Code 节点算签名,然后用 Set 或表达式改写 URL。

> 字段名(msgtypetext.content)和加签算法以 钉钉开放平台官方文档 为准,文档迭代频繁,看到的版本和本文示例不一致时以你那边文档为准。

### 在 Uptime Kuma 里挂上通知

回到 Uptime Kuma:

  1. 进「Settings」→「Notifications」→「Add Notification」。
  2. Type 选 Webhook
  3. Webhook URL 填刚才从 n8n Webhook 节点复制的那串地址。
  4. Method 默认 POST,Content Type 选 application/json,保持默认即可。
  5. 是否勾「Default enabled」和「Apply on all existing monitors」按需。
  6. 点 Test 试发一次。

如果一切正常,n8n 会收到这次测试请求,进而把消息推到飞书/钉钉群。

测试告警成功推送到飞书群的截图效果,消息中包含监控名、状态、地址和时间-8
📷 Lana Codes / Unsplash License / 来源

### 测试与验证

最稳妥的端到端测试流程:

  1. 在 Uptime Kuma 里加一个故意会失败的监控,比如监控 http://127.0.0.1:1,或者监控一个不存在但解析得到的域名。
  2. 等 Uptime Kuma 报警。
  3. 看飞书/钉钉群里是否收到消息。
  4. 在 n8n 的 Executions 里看工作流是否成功,每一步节点的输入输出都能点开看。

常见异常对应:

  • 群里没消息,n8n 也没收到:Webhook URL 错了或者 n8n 没监听(Web 节点要在 workflow 处于 Active 状态才会持续监听,Save & Activate 别忘)。
  • n8n 收到了但群里没消息:HTTP Request 节点返回非 2xx,钉钉/飞书一般会返回 errcodeerrmsg,看 Execution 里节点输出。
  • 群里只收到一半内容:很可能是消息体里的换行符或表情没被正确转义,Code 节点里手工 JSON.stringify 一次通常能解决。

 

常见坑

  1. n8n Webhook 监听是 workflow 级开关:右上角有 Active 切换,只保存不 Active 是不接请求的,调试时容易在这里栽跟头。
  2. Webhook URL 用 localhost:Uptime Kuma 跑在另一台机器或者另一个容器里,访问 localhost 是访问不到 n8n 的,必须填 n8n 的实际地址(域名/IP + 端口)。
  3. JSON 字段拼错:飞书是 msg_type + content.text,钉钉是 msgtype + text.content,两家很容易抄错。直接复制本文示例时记得对应改回你那边文档里的字段。
  4. 加签算法:钉钉加签是 SHA256,密钥在机器人安全设置里,飞书是 HmacSHA256 + secret 也是在安全设置里。两家算法都不难,但编码细节(base16/base64、大小写)容易错,记得 n8n Code 节点里输出最终字符串比对一下。
  5. 关键词过滤:飞书「自定义关键词」必须出现在 content.text 里,关键词没匹配也会被飞书静默丢弃。
  6. 超时与重试:HTTP Request 节点默认有重试,但群机器人服务端也可能临时 5xx,关键告警建议加一层去重和重试逻辑,避免告警风暴刷屏。

收尾与相关阅读

到这里一条「Uptime Kuma → n8n → 飞书/钉钉」的告警链路就跑通了。如果还想扩展,常见下一步:

  • 在 n8n 里加 Switch 节点,按状态分到不同的告警群(down 一组、up 一组)。
  • IF 节点做去重,比如同监控 10 分钟内只发一条。
  • SlackTelegram 节点把告警再同步一份到海外沟通群。
  • 把告警数据顺手写入数据库或飞书多维表格,做 SLA 报表。

如果你想了解 n8n 本身的能力与上手体验,可以看这篇 n8n 评测;Uptime Kuma 的部署细节与功能展开可以看这篇 Uptime Kuma 评测。从那两篇文章出发,再回到本文的链路搭建,会更顺。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。