webhookrelay/transponderWebhook Relay Server 是一个独立部署的轻量级 Webhook 转发服务,旨在解决跨网络环境下的 Webhook 通信问题。其核心功能是接收来自源端的 Webhook 请求,经过简单处理(如验证、过滤)后,转发至目标服务端点。
主要用途:
内网服务接收公网 Webhook
多源 Webhook 聚合
Webhook 安全加固
跨网络环境转发
通过 docker run 命令可快速部署单实例服务,示例如下:
bashdocker run -d \ --name webhook-relay \ -p 8080:8080 \ # 映射容器端口到主机 -e LISTEN_PORT=8080 \ # 容器内监听端口 -e TARGET_DEFAULT=[***] \ # 默认转发目标(必填) -e AUTH_TOKEN=your-relay-token-123 \ # 源端请求验证 Token(可选,建议配置) -e LOG_LEVEL=info \ # 日志级别(debug/info/warn/error,默认 info) webhook-relay-server:latest
对于多实例或需持久化配置的场景,推荐使用 docker-compose.yml 管理:
yamlversion: "3.8" services: webhook-relay: image: webhook-relay-server:latest container_name: webhook-relay restart: always # 异常退出自动重启 ports: - "8080:8080" # HTTP 端口 - "8443:8443" # HTTPS 端口(如需启用) environment: - LISTEN_PORT=8080 - LISTEN_SSL_PORT=8443 # 启用 HTTPS 时需配置 - TARGET_DEFAULT=[***] # 默认转发目标 - AUTH_TOKEN=your-relay-token-123 # 全局请求验证 Token - IP_WHITELIST=192.168.1.0/24,10.0.0.1 # 允许的请求源 IP 白名单(可选) - SSL_CERT_PATH=/etc/relay/cert.pem # SSL 证书路径(挂载外部证书) - SSL_KEY_PATH=/etc/relay/key.pem # SSL 私钥路径 volumes: - ./relay-config:/etc/relay # 挂载证书或自定义路由配置文件 networks: - backend-network # 接入后端服务所在网络(如需直接通信) networks: backend-network: external: true # 假设后端服务已在该网络中
| 参数名 | 说明 | 默认值 | 是否必填 |
|---|---|---|---|
LISTEN_PORT | 服务监听的 HTTP 端口 | 8080 | 否 |
LISTEN_SSL_PORT | 服务监听的 HTTPS 端口(未配置则不启用 HTTPS) | - | 否 |
TARGET_DEFAULT | 默认转发目标 URL(所有未匹配自定义路由的请求将转发至此) | - | 是 |
AUTH_TOKEN | 全局请求验证 Token(源端需在 Header 中携带 X-Relay-Token: <token>) | - | 否 |
IP_WHITELIST | 请求源 IP 白名单(逗号分隔,支持 CIDR 格式,如 192.168.1.0/24) | 允许所有 IP | 否 |
LOG_LEVEL | 日志级别(debug/info/warn/error) | info | 否 |
SSL_CERT_PATH | SSL 证书文件路径(需通过 volume 挂载,与 LISTEN_SSL_PORT 配合使用) | - | 否 |
SSL_KEY_PATH | SSL 私钥文件路径(同上) | - | 否 |
ROUTE_CONFIG_PATH | 自定义路由配置文件路径(JSON/YAML 格式,支持多路径路由) | - | 否 |
如需按请求路径转发至不同目标(如 /github 转发至 GitHub 处理服务,/slack 转发至 Slack 通知服务),可通过配置文件实现。
route.yaml):yamlroutes: - path: "/github" # 请求路径匹配(前缀匹配,如 `/github/webhook` 也会命中) target: "[***]" # 目标服务 URL auth_token: "github-specific-token" # 该路由独立的验证 Token(覆盖全局 AUTH_TOKEN) timeout: 5000 # 转发超时时间(毫秒),默认 3000 - path: "/slack" target: "[***]" ip_whitelist: "35.190.247.0/24" # 该路由独立的 IP 白名单(覆盖全局 IP_WHITELIST)
在 docker run 或 docker-compose 中添加挂载:
bash# Docker Run 示例 docker run -d \ -v ./route.yaml:/etc/relay/route.yaml \ # 挂载路由配置文件 -e ROUTE_CONFIG_PATH=/etc/relay/route.yaml \ # 指定配置文件路径 ...(其他参数同上)
X-Relay-Token: <token>,服务端验证与配置的 AUTH_TOKEN(或路由独立 auth_token)一致则允许转发。401 Unauthorized。IP_WHITELIST(或路由独立 ip_whitelist)中指定的 IP 地址/网段请求,其他来源返回 403 Forbidden。场景:本地 Jenkins 服务(内网 IP:192.168.1.100:8080)需接收 GitHub Webhook。
部署步骤:
bashdocker run -d \ --name github-relay \ -p 80:8080 \ # 公网 80 端口映射到容器 8080 -e TARGET_DEFAULT=[***] \ # 转发至内网 Jenkins -e AUTH_TOKEN=github-webhook-secret-xxx \ # 与 GitHub Webhook 配置的 Secret 一致 webhook-relay-server:latest
[***],Secret 为 github-webhook-secret-xxx。场景:需将 /github 转发至 A 服务,/slack 转发至 B 服务。
配置文件(route.yaml):
yamlroutes: - path: "/github" target: "[***]" auth_token: "token-for-a" - path: "/slack" target: "[***]" auth_token: "token-for-b"
启动命令:
bashdocker run -d \ -v ./route.yaml:/etc/relay/route.yaml \ -e ROUTE_CONFIG_PATH=/etc/relay/route.yaml \ -e LISTEN_PORT=8080 \ -p 8080:8080 \ webhook-relay-server:latest
600)。docker logs <容器名> 查看实时日志,debug 级别可输出详细请求/响应信息(生产环境建议使用 info)。AUTH_TOKEN 和 IP_WHITELIST,避免服务被***滥用。manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务