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

环境准备
需要一台 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。

部署 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-kumavolume。--restart=always:保证容器异常退出后自动拉起。
镜像 tag(这里是 :1)建议以 Uptime Kuma 官方仓库 的最新稳定版为准。启动后访问 http://:3001,第一次会让你设置管理员账号密码。
> 同样的:Uptime Kuma 和 n8n 如果不在同一台机器或者走反代,端口和域名要自己对应改一下。
配置飞书/钉钉群机器人
飞书
- 打开飞书群聊右上角「设置」→「群机器人」→「添加机器人」→「自定义机器人」。
- 填一个机器人名字,比如「告警小助手」。
- 安全设置建议至少勾「自定义关键词」,关键词就用「告警」这种词,n8n 拼 JSON 时带上就行。需要更严的可以勾「签名校验」,那就得在 n8n 那边按时间戳 + secret 算签名再一起 POST。
- 复制机器人的 Webhook URL,形如
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx。
钉钉
- 群聊右上角「群设置」→「智能群助手」→「添加机器人」→「自定义」(旧版叫「自定义机器人」)。
- 安全设置里有三种:自定义关键词、加签、IP 白名单。生产环境强烈建议「加签」,n8n 那边按钉钉文档算签名后再发请求。
- 复制 Webhook URL,形如
https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx。
> 两家的消息 JSON 格式差异较大,而且官方会不定期更新字段。本文的格式示例以 飞书自定义机器人文档 和 钉钉自定义机器人文档 为准,遇到对不上的字段以你看到的最新版文档为准。

### 在 n8n 里搭工作流
回到 n8n 编辑器,新建一个 workflow。这里设计成「一个 Webhook 入口 + 一条分支到飞书/钉钉」,先做飞书,钉钉同构。
第一步:添加 Webhook 节点
- 画布上点
+,搜「Webhook」并添加。 - 节点的 HTTP Method 选 POST(Uptime Kuma 默认推 POST)。
- Path 写一个辨识度高的字符串,比如
uptime-alert-feishu,最终触发地址会是http:///webhook/uptime-alert-feishu。 - Authentication 这里先用 None,生产环境建议改 Header Auth,加一个密钥字段,让 Uptime Kuma 在请求头里带过来,n8n 校验不通过就丢弃。
- 点「Listen for test event」或「Execute node」,先让节点进入监听状态。
把这个完整 URL 复制出来,下一步要填到 Uptime Kuma 里。

#### 第二步:加 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 里还要带 timestamp 和 sign 字段,计算方式见飞书官方文档(一般是 HMAC-SHA256 加 secret),可以在 n8n 里再加一个 Code 节点算完再传给 HTTP Request。

#### 第四步(可选):再加一条分支推钉钉
钉钉的 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。
> 字段名(msgtype、text.content)和加签算法以 钉钉开放平台官方文档 为准,文档迭代频繁,看到的版本和本文示例不一致时以你那边文档为准。
### 在 Uptime Kuma 里挂上通知
回到 Uptime Kuma:
- 进「Settings」→「Notifications」→「Add Notification」。
- Type 选 Webhook。
- Webhook URL 填刚才从 n8n Webhook 节点复制的那串地址。
- Method 默认 POST,Content Type 选
application/json,保持默认即可。 - 是否勾「Default enabled」和「Apply on all existing monitors」按需。
- 点 Test 试发一次。
如果一切正常,n8n 会收到这次测试请求,进而把消息推到飞书/钉钉群。

### 测试与验证
最稳妥的端到端测试流程:
- 在 Uptime Kuma 里加一个故意会失败的监控,比如监控
http://127.0.0.1:1,或者监控一个不存在但解析得到的域名。 - 等 Uptime Kuma 报警。
- 看飞书/钉钉群里是否收到消息。
- 在 n8n 的 Executions 里看工作流是否成功,每一步节点的输入输出都能点开看。
常见异常对应:
- 群里没消息,n8n 也没收到:Webhook URL 错了或者 n8n 没监听(Web 节点要在 workflow 处于 Active 状态才会持续监听,Save & Activate 别忘)。
- n8n 收到了但群里没消息:HTTP Request 节点返回非 2xx,钉钉/飞书一般会返回
errcode、errmsg,看 Execution 里节点输出。 - 群里只收到一半内容:很可能是消息体里的换行符或表情没被正确转义,Code 节点里手工
JSON.stringify一次通常能解决。
常见坑
- n8n Webhook 监听是 workflow 级开关:右上角有 Active 切换,只保存不 Active 是不接请求的,调试时容易在这里栽跟头。
- Webhook URL 用 localhost:Uptime Kuma 跑在另一台机器或者另一个容器里,访问
localhost是访问不到 n8n 的,必须填 n8n 的实际地址(域名/IP + 端口)。 - JSON 字段拼错:飞书是
msg_type+content.text,钉钉是msgtype+text.content,两家很容易抄错。直接复制本文示例时记得对应改回你那边文档里的字段。 - 加签算法:钉钉加签是 SHA256,密钥在机器人安全设置里,飞书是 HmacSHA256 + secret 也是在安全设置里。两家算法都不难,但编码细节(base16/base64、大小写)容易错,记得 n8n Code 节点里输出最终字符串比对一下。
- 关键词过滤:飞书「自定义关键词」必须出现在
content.text里,关键词没匹配也会被飞书静默丢弃。 - 超时与重试:HTTP Request 节点默认有重试,但群机器人服务端也可能临时 5xx,关键告警建议加一层去重和重试逻辑,避免告警风暴刷屏。
收尾与相关阅读
到这里一条「Uptime Kuma → n8n → 飞书/钉钉」的告警链路就跑通了。如果还想扩展,常见下一步:
- 在 n8n 里加 Switch 节点,按状态分到不同的告警群(down 一组、up 一组)。
- 加 IF 节点做去重,比如同监控 10 分钟内只发一条。
- 用 Slack 或 Telegram 节点把告警再同步一份到海外沟通群。
- 把告警数据顺手写入数据库或飞书多维表格,做 SLA 报表。
如果你想了解 n8n 本身的能力与上手体验,可以看这篇 n8n 评测;Uptime Kuma 的部署细节与功能展开可以看这篇 Uptime Kuma 评测。从那两篇文章出发,再回到本文的链路搭建,会更顺。

评论(0)