Перейти к содержанию
Innovialabs

Локальный Telegram Bot API сервер: зачем и как его запустить

Продвинутое4 мин

Коротко

Локальный Bot API сервер позволяет боту загружать файлы до 2 ГБ, читать скачанные файлы прямо с диска и принимать гораздо больше webhook-соединений; цена — сборку, обновления, защиту и мониторинг вы берёте на себя.

Что даёт локальный сервер

По умолчанию бот общается с Telegram через облачный Bot API на api.telegram.org. Этот сервер открыт — telegram-bot-api от команды TDLib — и его можно запустить у себя. Бот отправляет те же HTTP-запросы на ваш экземпляр, а тот общается с Telegram по MTProto.

С флагом --local сервер снимает ряд облачных ограничений:

  • Загрузка файлов до 2000 МБ и скачивание файлов без облачного лимита на размер.
  • Локальные пути: файл можно отправить по абсолютному пути или file:// URI, а getFile возвращает абсолютный путь на диске сервера вместо ссылки на скачивание.
  • Гибкие webhook: обычный HTTP, любой порт, любой локальный IP и max_webhook_connections до 100000.

Код бота почти не меняется — это тот же Bot API, только с другим базовым URL. Полный список отличий — в официальной документации Bot API.

Когда это оправдано

  • Бот работает с видео, архивами, бэкапами или большими документами.
  • При высокой нагрузке вы упираетесь в лимит параллельных webhook-соединений облачного API.
  • Бот и API-сервер в одной приватной сети, и публичный HTTPS-эндпоинт для webhook не нужен.

Для обычных ботов с текстом, кнопками и небольшими картинками облачный API проще и дешевле в поддержке.

Сборка и запуск в Docker

Понадобятся api_id и api_hash с my.telegram.org. Они идентифицируют ваше приложение, а не бота, поэтому храните их как секреты.

Multi-stage Dockerfile делает итоговый образ компактным. Учтите: компиляция TDLib требует много оперативной памяти — собирайте на машине с запасом или в CI.

FROM debian:bookworm-slim AS build
RUN apt-get update && apt-get install -y --no-install-recommends \
    git ca-certificates cmake g++ make gperf zlib1g-dev libssl-dev
RUN git clone --recursive https://github.com/tdlib/telegram-bot-api.git /src
WORKDIR /src/build
RUN cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=/opt/tba .. \
 && cmake --build . --target install

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends zlib1g libssl3 ca-certificates \
 && rm -rf /var/lib/apt/lists/*
COPY --from=build /opt/tba/bin/telegram-bot-api /usr/local/bin/
EXPOSE 8081
ENTRYPOINT ["telegram-bot-api", "--local", "--dir=/var/lib/telegram-bot-api"]

Сервер берёт TELEGRAM_API_ID и TELEGRAM_API_HASH из переменных окружения и по умолчанию слушает порт 8081:

docker build -t telegram-bot-api .
docker run -d --name tba --restart unless-stopped \
  --env-file tba.env \
  -v tba-data:/var/lib/telegram-bot-api \
  -p 127.0.0.1:8081:8081 \
  telegram-bot-api

Две важные детали:

  • getFile возвращает путь в файловой системе сервера, поэтому контейнер бота должен монтировать тот же volume по тому же пути, чтобы читать файлы.
  • Укажите библиотеке новый базовый URL, например в grammY: new Bot(token, { client: { apiRoot: "http://tba:8081" } }). В aiogram, python-telegram-bot и других есть аналогичная настройка.

Перенос бота: logOut и close

Перед запуском на локальном сервере бота нужно разлогинить в облачном — иначе доставка обновлений не гарантирована.

  1. Остановите процесс бота.
  2. Вызовите logOut на облачном сервере:
curl "https://api.telegram.org/bot$BOT_TOKEN/logOut"
  1. Запустите бота на локальном сервере и, если используете webhook, снова вызовите setWebhook — уже через локальный экземпляр.

После logOut залогиниться локально можно сразу, но вернуться на облачный сервер нельзя 10 минут. Планируйте переключение так, чтобы такое окно отката было приемлемым.

Чтобы перенести бота между двумя локальными серверами, сначала вызовите deleteWebhook, затем close на старом экземпляре. close возвращает ошибку 429 в первые 10 минут после запуска бота.

Компромиссы эксплуатации

ОбластьОблачный APIСвой сервер
ОбновленияНовые версии Bot API появляются самиПересборка и деплой ради новых методов
ДискНе ваша заботаФайлы копятся в рабочей директории, нужна очистка
БезопасностьHTTPS и изоляция уже естьНа HTTP-порту нет TLS и авторизации — держите в приватной сети
ДоступностьОтветственность TelegramПерезапуски, health checks, мониторинг и алерты — на вас
СекретыТолько токен ботаЕщё api_id и api_hash

Сервер принимает запросы с любым токеном бота, поэтому открытый наружу порт позволяет кому угодно пользоваться вашей инфраструктурой. Привязывайте его к localhost или внутренней сети и храните рабочую директорию на постоянном volume.

Частые вопросы

Нет. Один экземпляр обслуживает много ботов: каждый запрос несёт свой токен. Отдельные экземпляры имеют смысл только ради изоляции или разного профиля нагрузки.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.