Show HN: Outpost – 用于出站 Webhooks 和事件目的地的 OSS 基础设施
hookdeck/outpost
Open Source Outbound Webhooks and Event Destinations Infrastructure
Outpost 是一个自托管的开源基础设施,使事件生产者能够向其平台添加出站 webhooks 和 Event Destinations,支持 Webhooks、Hookdeck Event Gateway、Amazon EventBridge、AWS SQS、AWS SNS、GCP Pub/Sub、RabbitMQ 和 Kafka 等目标类型。
Outpost 运行时具有最少的依赖(Redis、PostgreSQL 或 Clickhouse,以及支持的消息队列之一),与您现有的 webhooks 实现 100% 向后兼容,并针对高吞吐量、低成本运行进行了优化。
Outpost 由 Hookdeck 构建和维护。它用 Go 编写,并以二进制文件和 Docker 容器的形式在 Apache-2.0 许可下分发。
阅读 Outpost Concepts 以了解有关 Outpost 架构和设计的更多信息。
功能特性
- 事件主题和基于主题的订阅:支持通用的发布和订阅模式,以便轻松采用和集成到现有系统中。
- 通过 API 或队列发布事件:使用 Outpost API 发布事件,或配置 Outpost 以从发布队列读取事件。
- 至少一次交付保证:保证消息至少被传递一次,并且永远不会丢失。
- 事件扇出:发送到某个主题的消息被复制并发送到多个端点。这允许并行处理和异步事件通知。
- 自动和手动重试:为事件目的地配置重试策略,并通过 API 或用户门户手动触发事件传递重试。
- 多租户支持:在单个 Outpost 部署上创建多个租户。
- 用户门户:允许客户查看指标、管理、调试和观察其事件目的地。
- 传递失败警报:管理事件传递失败警报。
- OpenTelemetry:OTel 标准化追踪、指标和日志。
- 事件目的地类型:开箱即用地支持 Webhooks、Hookdeck Event Gateway、Amazon EventBridge、AWS SQS、AWS SNS、GCP Pub/Sub、RabbitMQ 和 Kafka。
- Webhook 最佳实践:选择退出 webhook 最佳实践,例如幂等性、时间戳和签名以及签名轮换的标头。
- SDKs 和 MCP server:提供 Go, Python 和 TypeScript SDK。 Outpost 还附带 MCP server。所有都由 Speakeasy 生成。
有关更多信息,请参阅 Outpost Features。
文档
Outpost 文档是使用 Zudoku documentation framework 构建的。
快速入门
确保你安装了 Docker。
克隆 Outpost 仓库:
git clone https://github.com/hookdeck/outpost.git
导航到 outpost/examples/docker-compose/
:
cd outpost/examples/docker-compose/
从示例创建一个 .env
文件:
cp .env.example .env
更新新 .env
文件中的 $API_KEY
值。
启动 Outpost 依赖项和服务:
docker-compose -f compose.yml -f compose-rabbitmq.yml -f compose-postgres.yml up
检查服务是否正在运行:
curl localhost:3333/api/v1/healthz
等待直到收到 OK%
响应。
使用以下命令创建一个租户,将 $TENANT_ID
替换为唯一的标识符(例如 "your_org_name"),并将 $API_KEY
替换为你设置在 .env
中的值:
提示:可以使用 shell 变量存储租户 ID 和 API 密钥,以便在以下命令中更轻松地使用:
TENANT_ID=your_org_name
API_KEY=your_api_key
URL=your_webhook_url
curl --location --request PUT "localhost:3333/api/v1/$TENANT_ID" \
--header "Authorization: Bearer $API_KEY"
运行通过 localtunnel 暴露的本地服务器,或使用托管服务(例如 Hookdeck Console)来捕获 webhook 事件。
创建一个 webhook 目的地,事件将传递到以下命令。同样,替换 $TENANT_ID
和 $API_KEY
。此外,将 $URL
替换为 webhook 目的地的 URL:
curl --location "localhost:3333/api/v1/$TENANT_ID/destinations" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_KEY" \
--data '{
"type": "webhook",
"topics": ["*"],
"config": {
"url": "'"$URL"'"
}
}'
发布一个事件,记住要替换 $API_KEY
和 $TENANT_ID
:
curl --location "localhost:3333/api/v1/publish" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_KEY" \
--data '{
"tenant_id": "'"$TENANT_ID"'",
"topic": "user.created",
"eligible_for_retry": true,
"metadata": {
"meta": "data"
},
"data": {
"user_id": "userid"
}
}'
检查服务器或 webhook 捕获工具上的日志以获取已传递的事件。
获取租户的 Outpost 门户链接:
curl "localhost:3333/api/v1/$TENANT_ID/portal" \
--header "Authorization: Bearer $API_KEY"
响应将类似于以下内容:
{ "redirect_url": "http://localhost:3333?token=$TOKEN" }
token
值是 API 生成的 JWT。
打开 redirect_url
链接以查看 Outpost 门户。
继续使用 Outpost API 或 Outpost 门户添加和测试更多目的地。
贡献
请参见 CONTRIBUTING。
许可证
此存储库包含 Outpost,受 Apache License 2.0 保护,除非另有说明(任何 Outpost 徽标或商标均不受 Apache License 保护,应由 LICENSE 文件明确注明。)