Документация

WebhookLens — платформа webhook-инфраструктуры с открытым исходным кодом. Принимайте, инспектируйте, воспроизводите и пересылайте вебхуки с полной видимостью. Разворачивайте самостоятельно бесплатно или используйте управляемое облако.

Быстрый старт Запуск менее чем за 60 секунд с помощью Docker Compose. Кредитная карта для облачного пробного периода не требуется.
  1. Запустите стек
    docker compose up -d — запускает PostgreSQL, ClickHouse, Redis и WebhookLens.
  2. Откройте панель управления
    Перейдите по адресу http://localhost:3000. Зарегистрируйтесь, чтобы создать тенант.
  3. Создайте эндпоинт и отправьте тестовый вебхук
    Создайте эндпоинт в панели управления, затем: curl -X POST http://localhost:8080/wh/your-tenant/your-endpoint -H "Content-Type: application/json" -d '{"test": true}'

Требования

Docker (рекомендуется)

Единый бинарный файл


Установка — Docker Compose

Рекомендуемый способ запуска WebhookLens. Один файл поднимает весь стек: PostgreSQL, ClickHouse, Redis и сервер WebhookLens.

Загрузка и запуск

# Загрузить файл compose для сообщества
curl -fsSL https://raw.githubusercontent.com/webhooklens/webhooklens/main/deploy/docker-compose.community.yml \
  -o docker-compose.yml

# Запустить стек
docker compose up -d

Панель управления доступна по адресу http://localhost:3000, прокси вебхуков — по адресу http://localhost:8080.

Полный файл docker-compose.community.yml

# WebhookLens Community Edition — Docker Compose
# Usage: docker compose -f docker-compose.community.yml up -d
# Dashboard: http://localhost:3000
# Proxy:     http://localhost:8080

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: webhooklens
      POSTGRES_PASSWORD: webhooklens
      POSTGRES_DB: webhooklens
    volumes:
      - pg_data:/var/lib/postgresql/data
      - ./migrations/postgres:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U webhooklens"]
      interval: 5s
      retries: 5

  clickhouse:
    image: clickhouse/clickhouse-server:24-alpine
    volumes:
      - ch_data:/var/lib/clickhouse
      - ./migrations/clickhouse:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD", "clickhouse-client", "--query", "SELECT 1"]
      interval: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      retries: 5

  webhooklens:
    image: webhooklens/webhooklens:latest
    ports:
      - "3000:3000"
      - "8080:8080"
    environment:
      WHL_DATABASE__POSTGRES_URL: postgres://webhooklens:webhooklens@postgres:5432/webhooklens?sslmode=disable
      WHL_DATABASE__CLICKHOUSE_URL: clickhouse://clickhouse:9000/webhooklens
      WHL_DATABASE__REDIS_URL: redis://redis:6379
      WHL_AUTH__JWT_SECRET: change-me-in-production-use-64-chars-minimum
    depends_on:
      postgres: { condition: service_healthy }
      clickhouse: { condition: service_healthy }
      redis: { condition: service_healthy }
    restart: unless-stopped

volumes:
  pg_data:
  ch_data:
  redis_data:
Важно Замените WHL_AUTH__JWT_SECRET случайной строкой длиной не менее 32 символов в production-среде.

Установка — Единый бинарный файл

Загрузите предсобранный бинарный файл или скомпилируйте из исходников. Требует отдельно запущенных PostgreSQL, ClickHouse и Redis.

Предсобранный бинарный файл

# Загрузить последний релиз
curl -fsSL https://github.com/webhooklens/webhooklens/releases/latest/download/webhooklens-linux-amd64 \
  -o webhooklens
chmod +x webhooklens

# Запустить с файлом конфигурации
./webhooklens --config config.yaml

Сборка из исходников

git clone https://github.com/webhooklens/webhooklens.git
cd webhooklens
go build -o webhooklens ./cmd/server

./webhooklens --config config.yaml

Настройка

WebhookLens можно настроить через файл конфигурации YAML или переменные окружения. Переменные окружения используют префикс WHL_ с двойным подчёркиванием для вложенности.

Сервер

Ключ конфигурацииПеременная окруженияПо умолчаниюОписание
server.proxy_portWHL_SERVER__PROXY_PORT8080Порт для приёма вебхуков
server.api_portWHL_SERVER__API_PORT3000Порт для панели управления и API
server.debugWHL_SERVER__DEBUGfalseВключить отладочное логирование
server.cloud_domainWHL_SERVER__CLOUD_DOMAIN""Домен облачного режима (мультитенантный SaaS)

База данных

Ключ конфигурацииПеременная окруженияПо умолчаниюОписание
database.postgres_urlWHL_DATABASE__POSTGRES_URLСтрока подключения PostgreSQL
database.clickhouse_urlWHL_DATABASE__CLICKHOUSE_URLСтрока подключения ClickHouse
database.redis_urlWHL_DATABASE__REDIS_URLСтрока подключения Redis

Аутентификация

Ключ конфигурацииПеременная окруженияПо умолчаниюОписание
auth.jwt_secretWHL_AUTH__JWT_SECRETСекретный ключ JWT (минимум 32 символа)
auth.github_client_idWHL_AUTH__GITHUB_CLIENT_ID""Client ID GitHub OAuth
auth.github_secretWHL_AUTH__GITHUB_SECRET""Секрет GitHub OAuth
retention.events_daysWHL_RETENTION__EVENTS_DAYS30Автоудаление событий через N дней

Ограничение запросов

Ключ конфигурацииПеременная окруженияПо умолчаниюОписание
rate_limit.api_per_tenantWHL_RATE_LIMIT__API_PER_TENANT100Запросов к API в минуту на тенант
rate_limit.auth_per_ipWHL_RATE_LIMIT__AUTH_PER_IP10Запросов аутентификации в минуту на IP

Биллинг Stripe

Требуется только в облачном/SaaS-режиме с платными планами.

Ключ конфигурацииПеременная окруженияПо умолчаниюОписание
stripe.api_keyWHL_STRIPE__API_KEY""Секретный ключ Stripe
stripe.price_idWHL_STRIPE__PRICE_ID""ID тарифа Stripe для подписки
stripe.webhook_secretWHL_STRIPE__WEBHOOK_SECRET""Секрет подписи вебхука Stripe
stripe.base_urlWHL_STRIPE__BASE_URL""Базовый URL для редиректов Stripe Checkout

Email

Настройте отправку email для сброса пароля и уведомлений. Использует Resend.

Ключ конфигурацииПеременная окруженияПо умолчаниюОписание
email.resend_api_keyWHL_EMAIL__RESEND_API_KEY""API-ключ Resend
email.from_addressWHL_EMAIL__FROM_ADDRESSnoreply@...Адрес отправителя исходящих писем

Пример config.yaml

server:
  proxy_port: 8080
  api_port: 3000
  debug: false

database:
  postgres_url: "postgres://user:pass@localhost:5432/webhooklens?sslmode=disable"
  clickhouse_url: "clickhouse://localhost:9000/webhooklens"
  redis_url: "redis://localhost:6379"

auth:
  jwt_secret: "ваш-случайный-секрет-минимум-32-символа"

retention:
  events_days: 30

rate_limit:
  api_per_tenant: 100
  auth_per_ip: 10

Прокси Webhook

WebhookLens работает как обратный прокси для ваших вебхуков. Настройте провайдеров на URL прокси — и WebhookLens будет принимать, логировать, валидировать и пересылать каждый запрос на ваш реальный эндпоинт.

Приём вебхуков

URL прокси соответствует шаблону:

POST https://ваш-домен:8080/wh/{tenant-slug}/{endpoint-slug}

При поступлении вебхука WebhookLens:

  1. Принимает полный HTTP-запрос (метод, заголовки, тело, параметры запроса)
  2. Сохраняет событие в ClickHouse для аналитики и в PostgreSQL для инспекции
  3. Проверяет подпись (если провайдер настроен для эндпоинта)
  4. Применяет трансформации (если настроены)
  5. Пересылает запрос на настроенный целевой URL
  6. Записывает код ответа, задержку и возможные ошибки

Политика повторных попыток

Неудавшиеся доставки (ответы 5xx или таймауты) повторяются с экспоненциальной задержкой:

ПопыткаЗадержка
1-я попытка1 секунда
2-я попытка5 секунд
3-я попытка30 секунд
4-я попытка5 минут
5-я попытка30 минут

После 5 неудачных попыток событие помечается как failed. Вы можете воспроизвести его вручную из панели управления или через API в любое время.

Проверка подписи

Если для эндпоинта настроен провайдер, WebhookLens автоматически проверяет подпись вебхука с использованием алгоритма подписи провайдера. При неудаче проверки событие помечается флагом, но по-прежнему сохраняется и пересылается (если не включён строгий режим).

Пример: проверка подписи Stripe

# При создании эндпоинта укажите провайдера и секрет подписи
curl -X POST http://localhost:3000/api/endpoints \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "stripe-payments",
    "target_url": "https://api.example.com/webhooks/stripe",
    "provider": "stripe",
    "signing_secret": "whsec_..."
  }'

Поддерживаемые провайдеры

WebhookLens поддерживает автоматическую проверку подписи для следующих провайдеров:

ПровайдерЗаголовок подписиАлгоритм
StripeStripe-SignatureHMAC-SHA256 (timestamp + payload)
GitHubX-Hub-Signature-256HMAC-SHA256
ShopifyX-Shopify-Hmac-SHA256HMAC-SHA256 (Base64)
SlackX-Slack-SignatureHMAC-SHA256 (timestamp + body)
TwilioX-Twilio-SignatureHMAC-SHA1
SendGridX-Twilio-Email-Event-Webhook-SignatureECDSA
PaddlePaddle-SignatureHMAC-SHA256 (timestamp + payload)
LinearLinear-SignatureHMAC-SHA256
Svixsvix-signatureHMAC-SHA256 (msg-id + timestamp + body)
Clerksvix-signatureHMAC-SHA256 на основе Svix
IntercomX-Hub-SignatureHMAC-SHA1
TypeformTypeform-SignatureHMAC-SHA256
Универсальный HMACНастраиваемыйHMAC-SHA256

Панель управления

События & Инспектор

Страница событий отображает все входящие вебхуки в реальном времени с автообновлением. В каждой строке показано:

Нажмите на событие, чтобы открыть инспектор:

Эндпоинты

Эндпоинты — основная абстракция. Каждый эндпоинт содержит:

Аналитика

Панель аналитики предоставляет метрики в реальном времени на базе ClickHouse:

Оповещения

Настройте оповещения, чтобы быть в курсе проблем:

Уведомления могут отправляться в Slack (через входящий вебхук) или на произвольный URL вебхука.

# Создать оповещение
curl -X POST http://localhost:3000/api/alerts \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "High failure rate",
    "type": "failure_rate",
    "threshold": 10,
    "window_minutes": 5,
    "channel": "slack",
    "slack_webhook_url": "https://hooks.slack.com/services/..."
  }'

Трансформации & Маршрутизация

Трансформации payload

Трансформации позволяют изменять payload вебхуков перед их пересылкой на цель. Это удобно для обогащения данных, удаления чувствительных полей или адаптации payload к формату вашего API.

Типы трансформаций

ТипОписаниеПример
set_fieldУстановить или перезаписать JSON-полеДобавить source: "stripe" в тело
remove_fieldУдалить JSON-полеУдалить data.object.metadata
rename_fieldПереименовать JSON-полеПереименовать id в external_id
add_headerДобавить заголовок запросаДобавить X-Source: webhooklens
remove_headerУдалить заголовок запросаУдалить X-Internal-Token

Пример: добавить поле и заголовок

curl -X PATCH http://localhost:3000/api/endpoints/EP_ID \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "transforms": [
      {"type": "set_field", "path": "meta.source", "value": "stripe"},
      {"type": "add_header", "key": "X-Source", "value": "webhooklens"},
      {"type": "remove_field", "path": "data.object.metadata.internal"}
    ]
  }'

Тестирование без применения (dry-run)

Протестируйте трансформации без реальной пересылки:

curl -X POST http://localhost:3000/api/transforms/test \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "transforms": [
      {"type": "set_field", "path": "enriched", "value": true}
    ],
    "payload": {"event": "payment.completed", "amount": 4999}
  }'

# Ответ:
# {"event": "payment.completed", "amount": 4999, "enriched": true}

Умная маршрутизация

Направляйте один вебхук на несколько целей по условиям. Это обеспечивает веерную рассылку, условную обработку и резервные цели.

Условия маршрутизации

УсловиеОписание
allВсегда пересылать на эту цель (веерная рассылка)
on_successПересылать только если основная цель вернула 2xx
on_failureПересылать только если основная цель вернула не-2xx или произошёл таймаут

Пример: веерная рассылка на 3 цели

curl -X PATCH http://localhost:3000/api/endpoints/EP_ID \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "target_url": "https://primary.example.com/webhook",
    "routes": [
      {"url": "https://analytics.example.com/ingest", "condition": "all"},
      {"url": "https://backup.example.com/webhook", "condition": "all"},
      {"url": "https://alerts.example.com/failure", "condition": "on_failure"}
    ]
  }'

Справочник API

Все API-эндпоинты обслуживаются на порту API (по умолчанию :3000). Для аутентифицированных эндпоинтов требуется Bearer-токен, полученный при входе.

Аутентификация

POST /api/auth/signup

Создать новый аккаунт и тенант.

curl -X POST http://localhost:3000/api/auth/signup \
  -H "Content-Type: application/json" \
  -d '{
    "email": "вы@пример.com",
    "password": "надёжныйпароль",
    "tenant_name": "мой-проект"
  }'

# Ответ: {"token": "eyJhbG...", "tenant": {"id": "...", "slug": "мой-проект"}}
POST /api/auth/login

Аутентификация и получение JWT-токена.

curl -X POST http://localhost:3000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "вы@пример.com", "password": "надёжныйпароль"}'

# Ответ: {"token": "eyJhbG..."}

API Эндпоинтов

GET /api/endpoints

Получить список всех эндпоинтов текущего тенанта.

curl http://localhost:3000/api/endpoints \
  -H "Authorization: Bearer YOUR_TOKEN"

# Ответ: [{"id": "...", "slug": "stripe-prod", "target_url": "https://...", ...}]
POST /api/endpoints

Создать новый эндпоинт.

curl -X POST http://localhost:3000/api/endpoints \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "stripe-prod",
    "target_url": "https://api.example.com/webhooks/stripe",
    "provider": "stripe",
    "signing_secret": "whsec_..."
  }'
PATCH /api/endpoints/:id

Обновить эндпоинт (целевой URL, провайдер, трансформации, маршруты).

curl -X PATCH http://localhost:3000/api/endpoints/EP_ID \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"target_url": "https://новая-цель.example.com/hook"}'

API Событий

GET /api/events

Список событий с необязательными фильтрами. Поддерживает пагинацию.

# Список последних событий
curl "http://localhost:3000/api/events?limit=50&status=failed" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Фильтр по эндпоинту
curl "http://localhost:3000/api/events?endpoint_id=EP_ID&limit=20" \
  -H "Authorization: Bearer YOUR_TOKEN"
POST /api/events/:id/replay

Воспроизвести событие — повторно отправить исходный запрос на цель.

curl -X POST http://localhost:3000/api/events/EVT_ID/replay \
  -H "Authorization: Bearer YOUR_TOKEN"

# Ответ: {"status": "replayed", "response_code": 200, "latency_ms": 142}

API Аналитики

GET /api/analytics/overview

Получить агрегированную аналитику по тенанту.

curl "http://localhost:3000/api/analytics/overview?period=24h" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Ответ:
# {
#   "total_events": 12847,
#   "success_rate": 99.2,
#   "p50_ms": 45,
#   "p95_ms": 210,
#   "p99_ms": 890,
#   "by_provider": [{"provider": "stripe", "count": 8420}, ...],
#   "by_status": {"forwarded": 12744, "failed": 62, "replayed": 41}
# }

API Биллинга

Доступен только в облачном режиме.

GET /api/billing/quota

Получить текущее использование и квоту плана.

curl http://localhost:3000/api/billing/quota \
  -H "Authorization: Bearer YOUR_TOKEN"

# Ответ: {"plan": "starter", "events_used": 12847, "events_limit": 50000, ...}
POST /api/billing/checkout

Создать сессию Stripe Checkout для обновления плана.

curl -X POST http://localhost:3000/api/billing/checkout \
  -H "Authorization: Bearer YOUR_TOKEN"

# Ответ: {"checkout_url": "https://checkout.stripe.com/..."}
POST /api/billing/portal

Создать сессию Stripe Billing Portal для управления подписками.

curl -X POST http://localhost:3000/api/billing/portal \
  -H "Authorization: Bearer YOUR_TOKEN"

# Ответ: {"portal_url": "https://billing.stripe.com/..."}
POST /api/transforms/test

Протестировать набор трансформаций без применения на примере payload.


Справочник CLI

Установка

go install github.com/webhooklens/webhooklens/cmd/webhooklens-cli@latest

Команды

Вход

# Аутентификация на сервере WebhookLens
webhooklens-cli login --server https://app.webhooklens.cloud

# Для самостоятельно развёрнутого сервера
webhooklens-cli login --server http://localhost:3000

Прослушивание (локальный туннель)

# Пересылка вебхуков на локальный сервер разработки
webhooklens-cli listen --port 4000

# Указать конкретный эндпоинт
webhooklens-cli listen --port 4000 --endpoint stripe-prod

События

# Список последних событий
webhooklens-cli events list

# Показать детали события
webhooklens-cli events show EVT_ID

# Воспроизвести событие на другой URL
webhooklens-cli events replay EVT_ID --to http://localhost:4000/webhook
КомандаОписание
webhooklens-cli loginАутентификация на сервере
webhooklens-cli listenПересылка вебхуков на локальный порт (туннель для разработки)
webhooklens-cli events listСписок последних событий
webhooklens-cli events show <id>Полные детали события (заголовки, тело, ответ)
webhooklens-cli events replay <id>Воспроизвести событие, при необходимости на другой URL

Руководство по самостоятельному хостингу

Развёртывание в production

Для production-среды мы рекомендуем использовать Caddy для автоматического HTTPS и production-файл Docker Compose.

Чеклист Перед переходом в production убедитесь, что вы:

TLS с Caddy

Caddy автоматически выдаёт и обновляет TLS-сертификаты Let's Encrypt.

Caddyfile

# /etc/caddy/Caddyfile

webhooks.example.com {
    reverse_proxy localhost:3000
}

proxy.example.com {
    reverse_proxy localhost:8080
}
# Запустить Caddy
sudo caddy run --config /etc/caddy/Caddyfile

Резервное копирование & Восстановление

Регулярно создавайте резервные копии PostgreSQL (основные данные). Данные ClickHouse при необходимости можно восстановить из событий.

Скрипт резервного копирования

#!/bin/bash
# backup-webhooklens.sh

BACKUP_DIR="/backups/webhooklens"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# Резервная копия PostgreSQL
docker exec webhooklens-postgres-1 \
  pg_dump -U webhooklens webhooklens | \
  gzip > "${BACKUP_DIR}/pg_${TIMESTAMP}.sql.gz"

# Хранить последние 30 резервных копий
ls -t "${BACKUP_DIR}"/pg_*.sql.gz | tail -n +31 | xargs rm -f

echo "Backup completed: pg_${TIMESTAMP}.sql.gz"

Расписание cron

# Запускать ежедневно в 2:00
0 2 * * * /opt/webhooklens/backup-webhooklens.sh >> /var/log/webhooklens-backup.log 2>&1

Восстановление

# Восстановить из резервной копии
gunzip -c "/backups/webhooklens/pg_20260411_020000.sql.gz" | \
  docker exec -i webhooklens-postgres-1 \
    psql -U webhooklens webhooklens

Мониторинг

WebhookLens предоставляет эндпоинт проверки работоспособности для мониторинга доступности:

curl http://localhost:3000/healthz

# Ответ (работает нормально):
# {"status": "ok", "postgres": "ok", "clickhouse": "ok", "redis": "ok"}

# Ответ (деградация):
# {"status": "degraded", "postgres": "ok", "clickhouse": "error", "redis": "ok"}

Используйте этот эндпоинт со своей системой мониторинга (UptimeRobot, Datadog, Prometheus blackbox exporter и др.), чтобы получать оповещения при неработоспособности компонентов.

Метрики Prometheus WebhookLens также предоставляет совместимые с Prometheus метрики по адресу /metrics на порту API. Используйте их для детального мониторинга пропускной способности, задержки и частоты ошибок в Grafana.

Нужна помощь? Откройте задачу на GitHub или напишите нам на support@webhooklens.cloud.