
OneUptime Discord 集成指南从 Webhook 创建到工作流自动化推送事故通知【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime导读本文基于 OneUptime 官方西班牙语文档integrations/discord.md整理完整介绍如何在 OneUptime 中将事故Incident通知实时推送到 Discord 频道包括 Discord 入站 Webhook 的创建、OneUptime 全局变量的安全保存、Workflow工作流组件的搭建以及使用通用 API 组件发送富文本 Embed 的替代方案。读完本文你将掌握 OneUptime 与 Discord 这一**出站型outgoing**集成的完整配置链路并能结合仓库源码理解其底层的 Webhook 域名白名单SSRF 防护机制。OneUptime 内置了名为Discord的工作流组件因此这是 OneUptime 中最容易配置的集成之一。数据流非常简单OneUptime Incident → On Create ──► Discord component ──► message in your channel一、集成模式出站型 Webhook 推送本集成属于出站outgoing/saliente模式由 OneUptime 通过 Discord 的入站 Webhook URLIncoming Webhook主动向目标频道推送消息而非在 OneUptime 中接收 Discord 发来的请求。这类集成在整个 OneUptime 集成体系中是通用模式完整的出站集成清单可参见 集成总览文档原文链接为/docs/integrations/index对应仓库路径如上。同为出站模式、配置思路完全一致的还有 Telegram 集成。二、Paso 1 — 在 Discord 创建入站 Webhook打开 Discord进入目标频道的编辑频道Edit Channel→ 集成Integrations→ Webhooks。点击新建 WebhookNew Webhook为它命名例如OneUptime选择要推送的目标频道然后复制 Webhook URL。得到的 URL 形如https://discord.com/api/webhooks/1234567890/XXXXXXXXXXXXXXXXXXXXXXXX注意从 OneUptime 组件元数据Discord.ts可以看到该字段的占位示例正是https://discord.com/api/webhooks/1234567890/XXXXXXXXXXXXXXXXXXXXXXXX组件会要求输入一个标准的 Discord 入站 Webhook 地址。三、Paso 2 — 将 Webhook URL 保存为全局变量可选但推荐在 OneUptime 中进入Flujos de trabajo工作流→ Variables Globales全局变量→ Crear创建。将变量命名为DISCORD_WEBHOOK_URL粘贴 Webhook URL并打开Is Secret保密开关。为什么推荐这样做复用同一 URL 可在多个工作流中引用无需重复粘贴统一轮换Webhook 泄漏或需要更换时只需在一个位置更新所有引用它的工作流立即生效安全标记为 Secret 的变量不会在工作流执行日志中明文展示。在搭建工作流时通过模板语法{{variable.DISCORD_WEBHOOK_URL}}引用该变量。四、Paso 3 — 构建工作流打开Flujos de trabajo工作流→ Crear flujo de trabajo创建工作流命名如Incidents → Discord然后进入Constructor构造器/可视化编辑器。添加一个Incident触发器将其事件配置为On Create创建时并重命名为Incident。添加一个Discord组件连接到触发器并配置两个参数URL del webhookWebhook URL{{variable.DISCORD_WEBHOOK_URL}}或直接粘贴 Webhook URLMensaje消息 New incident: {{Incident.title}}\n{{Incident.description}}点击Guardar保存并启用该工作流然后创建一个测试事故。稍后消息就会出现在你的 Discord 频道中。组件参数详解基于源码在 OneUptime 工作流组件系统中Discord 组件的元数据定义于 Discord.ts其实际执行逻辑位于 SendMessageToChannel.ts。该组件声明了如下参数参数 ID名称类型必填说明webhook-urlDiscord Incoming Webhook URLURL✅Discord 入站 Webhook 地址标注为敏感字段isSensitive: truetextMessage TextLongText✅要发送到 Discord 的消息文本支持模板变量组件暴露的**返回值returnValues**只有一个返回值 ID名称说明errorError发送失败时输出的错误信息可选组件还定义了两个出端口outPorts供工作流做分支处理Success消息成功发布后执行Error发生错误时执行。这意味着你可以在 Discord 组件之后继续串联成功/失败分支例如失败时通知值班人员或写入审计日志。底层调用链POST 到 Webhook从执行实现SendMessageToChannel.ts可以看到组件运行时会调用API.post请求体为{ content: text 参数的内容 }这正是 Discord Webhook 执行接口Execute Webhook所要求的content字段。请求发送时强制关闭了重定向跟随doNotFollowRedirects: true以降低被重定向到恶意主机的风险。五、替代方案使用通用 API 组件如果你不想使用专用的 Discord 组件一个API块可以实现同样效果Method方法POSTURL地址{{variable.DISCORD_WEBHOOK_URL}}Headers请求头Content-Type: application/jsonBody请求体{ content: New incident: {{Incident.title}} }这个方案的优势在于可以充分利用 Discord 更丰富的 Embed 消息只要在请求体中追加一个embeds数组即可例如{ content: New incident: {{Incident.title}}, embeds: [ { title: {{Incident.title}}, description: {{Incident.description}}, color: 16711680, timestamp: {{Incident.createdAt}} } ] }这样便能在频道中渲染出带标题、描述、颜色条和时间戳的富卡片消息。六、实战技巧Consejos按严重级别过滤使用Condiciones条件组件在进入 Discord 块之前基于{{Incident.incidentSeverity.name}}分支实现只在指定严重级别如 Critical / Major时推送避免高噪音。覆盖整个事故生命周期在Incident → On Update上再添加工作流把已确认acknowledged已解决resolved等状态更新推送到同一频道让团队在 Discord 内即可跟踪事故进展。七、原理纵深Webhook 域名白名单与 SSRF 防护自托管 OneUptime 中工作流组件是在API 服务进程内向 Webhook URL 发起 POST 请求的。由于webhook-url是可被项目成员自由填写、甚至可以从触发器数据模板化的自由文本它天然构成了一个 SSRF服务端请求伪造风险面——历史上 GitHub AdvisoryGHSA-v5xh-rw9h-77fv就报告过针对 API 组件的同类问题。Discord 组件的防护策略在 IncomingWebhookUtils.ts 中实现核心是域名白名单pin而非黑名单export const DISCORD_WEBHOOK_DOMAINS: Arraystring [ discord.com, discordapp.com, ];getPinnedWebhookUrl会校验webhook-url参数必须是discord.com或discordapp.com域名下的 HTTPS 地址否则通过options.onError中止工作流并给出可操作的错误提示校验的是原始字符串若先经URL.fromString解析再校验未识别的协议会被默认补成https从而让gopher://...之类的非 HTTP 地址伪装成合法地址通过检查所以必须先校验原始值白名单pin方案优于黑名单DNS 重绑定DNS rebinding、备用 IP 记法、重定向等绕过手段都无法绕过只允许固定厂商域名的强约束而重定向已在请求层被doNotFollowRedirects: true关闭。该逻辑在 ChatWebhookComponents.test.ts 中有完整的测试覆盖其中包括拒绝元数据端点http://169.254.169.254/latest/meta-data/、回环地址、localhost、RFC-1918 内网地址等不安全目标且断言 API 从未被调用拒绝域名只出现在 query / fragment / path 里evil-discord.com相似后缀discord.com.evil.tld攻击者子域厂商域名上使用明文 http等绕过形态正常放行https://discord.com/api/webhooks/123/abcdef且断言请求以doNotFollowRedirects: true发出兼容discordapp.com这一别名域名缺少webhook-url参数时Discord、Slack、Microsoft Teams 三个聊天组件均会抛错。因此你在配置时必须使用discord.com或discordapp.com下的官方 Webhook 地址任何其他域名即使看起来相似都会被组件拒绝。八、安全提示与最佳实践始终使用 Secret 全局变量保存 Webhook URL避免在多个工作流中明文重复也便于集中轮换不要向 Discord 之外的地方发送组件强制域名白名单切勿尝试填写内网地址或自定义域名利用 Error 端口做失败补偿当 Discord 发送失败时可接到通知组件如邮件、短信提醒管理员避免事故通知静默丢失最小权限Webhook 只绑定发送所需的目标频道避免使用拥有管理权限的机器人令牌。九、延伸阅读集成总览 —— 出站集成模式说明Telegram 集成 —— 相同的思路用于 Telegram工作流组件参考Discord 章节 —— 组件字段的完整参考文档Discord 组件元数据Discord.tsDiscord 组件实现SendMessageToChannel.tsSSRF 防护工具IncomingWebhookUtils.ts测试用例ChatWebhookComponents.test.ts说明以上链接均基于仓库实际文件路径整理原文文档中的/docs/...绝对链接在当前仓库中对应 packages/App/FeatureSet/Docs/Content/es/ 目录下的同名页面可按需查阅对应语言版本。【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考