Telegram Hub
Документация https://hub.vitmp.ru
Панель
Документация / v2

Интеграция с Telegram через один управляемый Hub

Отправляйте сообщения от нескольких ботов, принимайте Telegram update через единый публичный адрес и пересылайте их в нужные приложения с журналом в SQLite.

Сервис
Проверяем...
Версия API
Загрузка...
Хранилище
SQLite + WAL
Один callback достаточно передать один разHub сохранит маршрут и перед каждой следующей отправкой проверит Telegram webhook через getWebhookInfo.
01 / requestВаше приложениеПередаёт сообщение и callback URL в Hub.
02 / routingTelegram HubПроверяет маршрут, отправляет и журналирует.
03 / deliveryTelegram APIВозвращает update через webhook нужного бота.
Начало работы

Первая двусторонняя отправка

Нужны API key Hub, токен Telegram-бота и HTTPS endpoint вашего приложения, принимающий JSON.

curl -X POST "https://hub.vitmp.ru/send" \
  -H "Authorization: Bearer $HUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "bot_token": "123456:ABC...",
    "chat_id": "123456789",
    "text": "Новая заявка",
    "parse_mode": "HTML",
    "callback_url": "https://app.example.com/hooks/telegram",
    "callback_secret": "shared-hmac-secret",
    "callback_delivery_mode": "durable"
  }'
$hub = new HubTelegramClient([
    'url' => env('TELEGRAM_HUB_URL'),
    'api_key' => env('TELEGRAM_HUB_API_KEY'),
    'callback_url' => route('hooks.telegram'),
    'callback_secret' => env('TELEGRAM_HUB_CALLBACK_SECRET'),
]);

$hub->send($chatId, 'Новая заявка', [
    'parse_mode' => 'HTML',
]);
Hub определит бота

bot_token имеет приоритет над именем channel.

Создаст маршрут в SQLite

Callback URL, HMAC secret и закрытый входящий путь сохраняются между перезапусками.

Подключит Telegram webhook

Для этого публичный адрес Hub должен начинаться с https://.

Отправит сообщение

Ответ содержит результат Telegram и служебный блок callback.

Маршрутизация

Автоматические обратные webhook

Маршрут связывается с bot token. Callback можно передать отдельным полем или привычным вызовом setWebhook; Telegram в обоих случаях получает только уникальный адрес Hub.

ПолеНазначениеХранение
callback_urlEndpoint приложения для Telegram updateSQLite
callback_secretКлюч подписи X-Hub-SignatureSQLite
callback_delivery_modesync или надёжная очередь durableSQLite
webhook_url во входном JSONАлиас поля callback_urlSQLite
callback.webhook_url в ответеЗакрытый входящий URL конкретного бота в HubSQLite
telegram_secretПроверка запроса от TelegramSQLite

Если приложение вызывает setWebhook

Передайте вызов в POST /telegram/call. Значение params.url останется конечным адресом приложения, но в Telegram Hub зарегистрирует собственный уникальный URL.

POST /telegram/call
{
  "bot_token": "123456:ABC...",
  "method": "setWebhook",
  "params": {
    "url": "https://app.example.com/hooks/telegram",
    "allowed_updates": ["message", "callback_query"]
  },
  "callback_secret": "shared-hmac-secret",
  "callback_delivery_mode": "durable"
}
Два URL, две ролиparams.url сохраняется как получатель приложения. В callback.webhook_url ответа находится URL Hub, который фактически зарегистрирован в Telegram.
Обход Hub заблокированКлиентский secret_token заменяется внутренним, а URL приложения никогда не передаётся Telegram напрямую.

Проверка перед каждой отправкой

Загрузка сохранённого маршрута

Если callback не передан, Hub ищет его по bot_token или channel.

Сверка с Telegram

getWebhookInfo должен вернуть внутренний webhook URL текущего Hub.

Самовосстановление

При пустом или чужом URL Hub повторяет setWebhook с сохранённым secret.

Фиксация результата

В SQLite и панели сохраняются ok, registered, repaired или failed.

Telegram не возвращает secret tokenУдалённо проверяется URL. При восстановлении Hub повторно передаёт ранее сохранённый telegram_secret.
Безопасность

Авторизация

Исходящий API принимает Bearer token или X-API-Key. Панель и admin API используют отдельные логин и пароль.

HTTP headers
Authorization: Bearer <HUB_API_KEY>
# либо
X-API-Key: <HUB_API_KEY>
ПоверхностьЗащита
/send, /telegram/*, /channelsBearer API key или X-API-Key
/admin, /admin/api/*Admin session или HTTP Basic
/webhooks/telegram/*X-Telegram-Bot-Api-Secret-Token
/health, /ready, /metrics, /docsПублично
Входящий поток

Доставка Telegram update

Hub загружает маршрут из SQLite, сохраняет исходный payload и доставляет точный JSON в совместимом синхронном режиме либо через надёжную очередь.

РежимОтвет TelegramПовтор
sync200 после ответа callback 2xxTelegram повторяет update после ошибки Hub
durable200 после записи в SQLiteВоркеры Hub, exponential backoff и статус dead
ЗаголовокЗначение
X-Hub-BotСтабильное имя маршрута
X-Hub-Event-IdID события в SQLite и панели
X-Telegram-Update-IdИсходный update ID, если он присутствует
X-Hub-Signaturesha256=<HMAC> от точного тела запроса
At least once в durable-режимеПолучатель должен дедуплицировать запросы по X-Hub-Event-Id. Состояния queued, retrying, forwarding и dead видны в панели.

Исходящие запросы в Telegram

Каждый вызов отправки сначала сохраняется в outbound_jobs, а завершённые попытки — в outbound_attempts. Успешный JSON остаётся совместимым, а заголовок X-Hub-Outbound-Job-Id содержит ID операции. Timeout, Telegram 429 и 5xx повторяются фоновыми воркерами; состояние и история возвращаются через GET /outbound/{id}. В журнале администратора доступны диагноз, сырой ответ и ручной повтор неуспешной операции.

Исходящая доставка тоже at least onceПосле сетевого timeout Telegram мог уже принять сообщение. Учитывайте возможный дубль при проектировании бизнес-операции.
OpenAPI reference

HTTP API

Справочник ниже формируется из текущей схемы запущенного Hub. Для ручных запросов доступен Swagger UI, исходная схема — в OpenAPI JSON.

Загрузка схемы...
По этому запросу endpoints не найдены.
Диагностика

Коды ошибок

КодКогда возвращается
401API key отсутствует или неверен
403Не совпал Telegram webhook secret
404Маршрут, событие или admin-объект не найден
409Конфликт имени, token или состояния retry
422Некорректные поля, неизвестный channel или нет HTTPS URL
502Ошибка Telegram API либо callback-получателя
503Сервис или административная авторизация не готовы

Каждый ответ содержит X-Request-ID. Используйте его для поиска связанной записи в журнале сервиса.

Операции

CLI управления

Глобальная команда hub работает из любого каталога. Запустите hub -h, hub bot -h или hub event -h для подробной справки. Старый hubctl.sh остаётся совместимым.

hub CLI
sudo hub creds
sudo hub doctor
sudo hub bot list
sudo hub bot add orders \
  --token '123456:ABC...' \
  --callback-url 'https://app.example.com/hooks/telegram' \
  --secret 'shared-secret' \
  --delivery-mode durable \
  --register
sudo hub event list --limit 20
sudo hub backup
Эксплуатация и интеграция

Мониторинг, дамп и SDK

/ready проверяет SQLite и оба пула воркеров, а /metrics отдаёт Prometheus-метрики без payload и секретов.

СигналЧто контролирует
hub_webhook_queue_jobsРазмер и состояния callback-очереди
hub_outbound_queue_jobsИсходящие задания Telegram
hub_callback_routes_unavailableМаршруты с ошибкой проверки или доставки
hub_*_duration_secondsHTTP, callback и Telegram latency

Полные alert rules находятся в MONITORING.md. В разделе «Система» администратор может скачать согласованный дамп SQLite, созданный Online Backup API.

Официальные клиенты

Python / TypeScript
# Python
python -m pip install ./sdk/python

# TypeScript
cd sdk/typescript && pnpm install && pnpm run build

Оба SDK поддерживают отправку, callback-настройки, readiness и чтение состояния исходящей операции. Подробности: SDK.md.

Production

Развёртывание на домене

Telegram принимает webhook только по публичному HTTPS. Установщик автоматически использует активный Nginx и Certbot либо запускает Caddy, не затрагивая другие сайты.

Linux server
curl -fsSL https://gitlab.com/valvic/hub/-/raw/main/install.sh \
  | sudo bash -s -- -d hub.example.com

# Обновление
curl -fsSL https://gitlab.com/valvic/hub/-/raw/main/install.sh \
  | sudo bash -s -- -u
Перед запускомНаправьте DNS-запись домена на сервер и откройте TCP 80, TCP/UDP 443. Активный Nginx определяется автоматически; для полностью ручного proxy используйте -x.