Интеграция с Telegram через один управляемый Hub
Отправляйте сообщения от нескольких ботов, принимайте Telegram update через единый публичный адрес и пересылайте их в нужные приложения с журналом в SQLite.
getWebhookInfo.Первая двусторонняя отправка
Нужны 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',
]);
bot_token имеет приоритет над именем channel.
Callback URL, HMAC secret и закрытый входящий путь сохраняются между перезапусками.
Для этого публичный адрес Hub должен начинаться с https://.
Ответ содержит результат Telegram и служебный блок callback.
Автоматические обратные webhook
Маршрут связывается с bot token. Callback можно передать отдельным полем или привычным вызовом setWebhook; Telegram в обоих случаях получает только уникальный адрес Hub.
| Поле | Назначение | Хранение |
|---|---|---|
callback_url | Endpoint приложения для Telegram update | SQLite |
callback_secret | Ключ подписи X-Hub-Signature | SQLite |
callback_delivery_mode | sync или надёжная очередь durable | SQLite |
webhook_url во входном JSON | Алиас поля callback_url | SQLite |
callback.webhook_url в ответе | Закрытый входящий URL конкретного бота в Hub | SQLite |
telegram_secret | Проверка запроса от Telegram | SQLite |
Если приложение вызывает setWebhook
Передайте вызов в POST /telegram/call. Значение params.url останется конечным адресом приложения, но в Telegram Hub зарегистрирует собственный уникальный URL.
{
"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"
}
params.url сохраняется как получатель приложения. В callback.webhook_url ответа находится URL Hub, который фактически зарегистрирован в Telegram.secret_token заменяется внутренним, а URL приложения никогда не передаётся Telegram напрямую.Проверка перед каждой отправкой
Если callback не передан, Hub ищет его по bot_token или channel.
getWebhookInfo должен вернуть внутренний webhook URL текущего Hub.
При пустом или чужом URL Hub повторяет setWebhook с сохранённым secret.
В SQLite и панели сохраняются ok, registered, repaired или failed.
telegram_secret.Авторизация
Исходящий API принимает Bearer token или X-API-Key. Панель и admin API используют отдельные логин и пароль.
Authorization: Bearer <HUB_API_KEY>
# либо
X-API-Key: <HUB_API_KEY>
| Поверхность | Защита |
|---|---|
/send, /telegram/*, /channels | Bearer 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 | Повтор |
|---|---|---|
sync | 200 после ответа callback 2xx | Telegram повторяет update после ошибки Hub |
durable | 200 после записи в SQLite | Воркеры Hub, exponential backoff и статус dead |
| Заголовок | Значение |
|---|---|
X-Hub-Bot | Стабильное имя маршрута |
X-Hub-Event-Id | ID события в SQLite и панели |
X-Telegram-Update-Id | Исходный update ID, если он присутствует |
X-Hub-Signature | sha256=<HMAC> от точного тела запроса |
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}. В журнале администратора доступны диагноз, сырой ответ и ручной повтор неуспешной операции.
HTTP API
Справочник ниже формируется из текущей схемы запущенного Hub. Для ручных запросов доступен Swagger UI, исходная схема — в OpenAPI JSON.
Коды ошибок
| Код | Когда возвращается |
|---|---|
| 401 | API 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 остаётся совместимым.
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_seconds | HTTP, callback и Telegram latency |
Полные alert rules находятся в MONITORING.md. В разделе «Система» администратор может скачать согласованный дамп SQLite, созданный Online Backup API.
Официальные клиенты
# Python
python -m pip install ./sdk/python
# TypeScript
cd sdk/typescript && pnpm install && pnpm run build
Оба SDK поддерживают отправку, callback-настройки, readiness и чтение состояния исходящей операции. Подробности: SDK.md.
Развёртывание на домене
Telegram принимает webhook только по публичному HTTPS. Установщик автоматически использует активный Nginx и Certbot либо запускает Caddy, не затрагивая другие сайты.
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
80, TCP/UDP 443. Активный Nginx определяется автоматически; для полностью ручного proxy используйте -x.