Sparrow icon

Sparrow

Sparrow 是开源、自托管的 Webhook 投递服务器,基于 PostgreSQL 持久化事件并分发至匹配订阅,发送带签名的 HTTP 请求并执行分类重试,适合构建和运维自有事件与 Webhook 基础设施。

Sparrow

通过持久化事件处理实现自托管 Webhook 投递

Sparrow 是面向需要向多个 HTTP 使用者发布事件的系统的开源、自托管 Webhook 投递服务器。应用可以注册事件类型和 Webhook,通过 REST API 推送事件发生信息,然后由 Sparrow 将其分发至匹配的订阅。

服务器会在开始投递前将事件持久化到 PostgreSQL,签名出站请求,记录投递结果,并通过退避机制执行分类重试。它将投递服务、工作进程流水线、内嵌仪表板和 API 文档整合在一个 Go 二进制文件中,并以 PostgreSQL 作为必需数据库。

核心能力

持久化事件投递

事件会在开始分发前写入 PostgreSQL,然后以至少一次的方式投递。操作人员可以手动重试失败的投递,并重放完整事件。

分类重试

Sparrow 会将可重试的失败(包括 5xx 响应、超时、429 响应和连接被拒绝)与永久性失败(例如许多 4xx 错误、DNS 错误和 TLS 错误)区分开来。

带签名的 Webhook

每次投递都使用 Standard Webhooks 约定进行签名。默认使用 HMAC-SHA256;单个 Webhook 可以改用 Ed25519。密钥在静态存储时使用 AES-256-GCM 进行信封加密。

订阅控制与投递记录

投递流水线支持按订阅配置的 Go 模板转换、按 Webhook 配置的速率限制、Webhook 健康状态跟踪,以及投递尝试的审计记录。

运维可见性

OpenTelemetry 跟踪会贯穿队列任务,结构化日志和指标可以通过 OTLP 导出。内嵌仪表板显示投递日志和每个 Webhook 的健康状态。

简洁的自托管架构

服务器以单个 Go 二进制文件分发,内嵌 UI,并以 PostgreSQL 作为唯一的核心数据库依赖。River 工作进程使用同一数据库,迁移会在启动时自动运行。

实际使用场景

  • 应用事件分发

    产品或后端可以发布一次 `order.created` 或 `invoice.created` 等事件,然后由 Sparrow 将其分发给所有匹配的使用者 Webhook,无需实现单独的投递队列。

  • 由使用者管理 Webhook 接入

    团队可以公开一个作用域受限且会过期的使用者门户链接,让单个使用者注册端点、浏览事件目录,并查看或重试自己的投递日志,而无需获得管理员 API 密钥。

  • 故障调查与恢复

    操作人员可以利用投递记录、错误类别、Webhook 健康状态、跟踪信息以及重放或重试控制,诊断不可用或配置错误的接收方并恢复投递。

  • 超越 HTTP 的事件路由

    来源可以发布经过验证的 Stripe 或 GitHub Webhook,而 recipe 和 sink satellite 可以将事件连接到 Slack、Discord、PagerDuty、ntfy、ClickHouse、SMTP、S3/MinIO 或 OTLP 日志等目标。

  • 本地开发与工作流测试

    开发者可以在集成开发过程中运行 CLI 监听器或 webhook.site,检查带签名的信封,在浏览器中预览 recipe 转换,并使用 REST API 或内嵌文档测试工作流。

Pros and Cons

Pros

  • 事件会在分发前持久化,并支持至少一次投递、重放和手动重试。
  • 重试行为会根据失败类型分类,而不是以相同方式处理所有投递错误。
  • 出站请求支持 HMAC-SHA256 或 Ed25519 签名,Webhook 密钥在静态存储时会加密。
  • 核心部署无需 Redis、Kafka 或旁路队列:只使用一个 Go 二进制文件和 PostgreSQL。
  • OpenTelemetry 跟踪、OTLP 导出、结构化日志、指标和内嵌投递仪表板有助于运维排障。

Cons

  • Sparrow 采用自托管方式,因此团队必须自行运营服务器和 PostgreSQL 数据库,而不是使用供应商托管的服务。
  • 文档所述的生产环境设置要求配置数据库访问权限和加密密钥;不含密钥的 Compose 配置用于本地评估。
  • 默认会阻止私有网络和元数据网络目标,因此向本地或内部目标投递需要显式修改配置。

FAQ

如何安装 Sparrow?

文档记录的本地设置使用 Docker Compose。下载 Compose 文件,运行 `docker compose up -d`,然后在 `http://localhost:8080` 打开 Web UI。Compose 设置包含 PostgreSQL,并会在启动时自动运行迁移。对于生产环境,安装文档说明应配置真实的加密密钥和数据库,而不是使用本地评估默认值。

Sparrow 的基本工作流程是什么?

注册事件类型,使用一个或多个事件名称注册 Webhook,然后将事件 POST 到相应的使用者端点。Sparrow 会持久化事件、匹配订阅、创建投递任务,并在后台发送带签名的 HTTP POST 请求。可以通过 API 或内嵌 UI 查看投递状态。

Sparrow 如何处理投递失败?

Sparrow 至少投递一次事件。失败的投递会被分类为服务器错误、超时、速率限制、连接被拒绝、DNS 错误和 TLS 错误等类别。可重试的失败使用指数退避,而永久性失败会停止;操作人员也可以手动重试投递并重放事件。

Webhook 投递如何进行身份验证?

默认情况下,投递使用每个 Webhook 的密钥和 Standard Webhooks 标头进行 HMAC-SHA256 身份验证。Webhook 也可以改用 Ed25519,由接收方使用公钥进行验证。Webhook 密钥在静态存储时使用 AES-256-GCM 进行信封加密。

Sparrow 能否向本地或私有网络端点投递?

Sparrow 默认会阻止私有 IP 地址和元数据 IP 地址,以防范 SSRF。进行本地评估时,可以通过 `SPARROW_ALLOW_PRIVATE_NETWORKS=true` 启用向私有网络投递;文档还指出,评估用 Compose 文件已启用此设置。

Quick Facts

类别
开发者工具 / Webhook 基础设施
部署方式
使用 PostgreSQL 的自托管 Go 服务器
许可证
MIT
运行环境
Go 1.27+;从源代码构建时需要 PostgreSQL 15+
投递模式
由后台工作进程执行的至少一次投递
API 规范
OpenAPI 3.1