Telegram-бот с нейросетью выглядит как магия, пока не начнёшь его запускать. Сообщение приходит, уходит в модель, ответ возвращается в чат — и всё это работает только пока где-то живёт процесс. Внутри такой бот устроен как любой другой: та же логика получения и отправки сообщений, только с двумя поправками. Ответы идут секундами, а ключ к модели стоит денег и принадлежит третьей стороне. Ниже — по шагам, как довести такой бот до продакшена на Dockbox: без аренды сервера, без ручной возни с автозапуском и без ключа, забытого в репозитории.
Чем бот с нейросетью отличается от обычного
Снаружи магия, внутри — обычный цикл: приняли сообщение, отправили в API модели, дождались ответа, вернули пользователю. Отдельного «AI-режима» у бота не существует, поэтому и хостится он ровно так же, как любой другой Telegram-бот.
Сложность ровно одна: кто-то должен держать процесс живым круглосуточно. Классический путь — арендовать сервер, поставить Python, настроить автозапуск, следить, что процесс не умер, и отдельно переживать, что оплаченный ключ к модели не утечёт вместе с исходниками.
Dockbox закрывает это разом. Вы загружаете папку с кодом или подключаете Git-репозиторий, платформа определяет язык, ставит зависимости, собирает Docker-образ, запускает контейнер и перезапускает его после падения. Секреты запрашиваются отдельно и лежат зашифрованными.
И сразу проговорим главное: Dockbox не выдаёт доступ к моделям. Платформа не проксирует запросы и не раздаёт ключи. Ключ вы берёте у провайдера модели и платите ему за токены — Dockbox лишь обеспечивает работу вашего кода.
Шаг 1. Вынесите ключ модели из кода
Это самый важный шаг — и самый частый провал.
Ключ API модели — прямой доступ к вашему кошельку. Как только он оказывается в публичном репозитории или в архиве с исходниками, его находят в течение нескольких часов и тратят ваши токены. Публичные репозитории сканируются ботами непрерывно.
Правильный подход — читать ключ из переменной окружения, а само значение вписать в разделе секретов проекта на Dockbox. Платформа хранит его зашифрованным и передаёт боту при старте, так что в коде значения не будет.
import os
API_KEY = os.environ["MODEL_API_KEY"]
Перед публикацией пройдитесь по проекту поиском: длинная строка символов в кавычках или префикс вроде sk- — тревожный признак. Если ключ уже попал в историю Git, отзывайте его у провайдера и выпускайте новый: чистить коммиты бессмысленно, он уже считается утёкшим.
Шаг 2. Адрес API — в те же переменные окружения
Почти все клиентские библиотеки позволяют задать базовый адрес API через переменную окружения или параметр клиента. Это критично, если вы работаете не напрямую с OpenAI, а через совместимый шлюз или другого провайдера — например, с отечественной моделью, у которой есть OpenAI-совместимый интерфейс.
Держите адрес в такой же переменной-секрете, что и ключ. Тогда смена провайдера превращается из правки кода в правку одного значения в панели.
import os
BASE_URL = os.environ["MODEL_BASE_URL"]
Шаг 3. Поднимите таймауты и включайте статус «печатает»
Ответ модели — это секунды, а на длинном контексте — десятки секунд. Дефолтные таймауты HTTP-клиента такие запросы обрывают: запрос не доживает до ответа, бот молчит, пользователь решает, что бот сломан.
Увеличьте таймаут и на запросе к модели, и в HTTP-клиенте внутри Telegram-библиотеки. И сразу отправляйте статус «печатает» (send_chat_action), как только пришло сообщение. Скорость это не увеличит, но человек увидит, что бот жив, и не начнёт жать «отправить» пять раз подряд.
Шаг 4. Историю диалога — в постоянное хранилище
Чтобы бот помнил предыдущие сообщения, история должна где-то лежать. Обычный словарь в памяти процесса работает ровно до первого перезапуска, а перезапуски случаются при каждом обновлении кода и после падений. В итоге бот забывает всех.
Пишите историю в постоянную папку проекта /data — она переживает и обновление кода, и рестарт контейнера, а файлы оттуда видно в панели и можно скачать.
Если диалогов много и по ним нужен поиск, файлов уже мало. Готовой базы Dockbox не предлагает: поднимите свою рядом с приложением через docker-compose или подключите внешнюю.
Шаг 5. Загрузите код и получите работающего бота
Дальше всё коротко. Приносите проект ZIP-архивом или подключаете Git-репозиторий — приватный тоже. Dockbox определяет язык, ставит зависимости, спрашивает токен от BotFather и ключ модели, запускает бота и следит за ним после падений.
Логи стримятся в панель в реальном времени, поэтому ошибка вроде неверного ключа видна сразу, а не проявляется молчанием бота. Деплой из Git — в один клик: пушите в main и получаете новую версию контейнера.
Если бот родился из кода, который вам написал ChatGPT, сначала стоит привести проект в порядок — об этом отдельный разбор: как превратить код из ChatGPT в работающего бота.
Шаг 6. Считайте токены и помните про лимиты
Каждое сообщение пользователя — платный запрос к модели, и платите вы провайдеру напрямую. Токены не входят в стоимость хостинга, это два разных счёта.
Поставьте лимит расходов в панели провайдера и ограничьте, сколько истории уходит в модель с каждым запросом: длинный контекст дороже на каждом вызове. Рабочая практика — последние 10–20 сообщений, а всё, что раньше, сжимать в короткое саммари.
Что в итоге
Бот с нейросетью — обычный бот с двумя поправками: платный сторонний ключ, который не должен жить в коде, и медленные ответы, к которым нужно подготовить и свои таймауты, и пользователей. Остальное берёт на себя платформа: сборка, запуск, перезапуск после падения и постоянная папка для истории диалога. Актуальные тарифы и лимиты — на dockbox.host.
Частые вопросы
Dockbox даёт доступ к ChatGPT или другой модели?
Нет. Dockbox запускает ваш код, но не является прокси и не выдаёт ключи. Ключ вы получаете у провайдера модели и передаёте платформе как секрет, чтобы бот мог им пользоваться.
Что будет, если ключ модели попал в репозиторий?
Его почти наверняка найдут: публичные репозитории сканируются непрерывно, а утёкшие ключи начинают тратить в тот же день. Если это уже случилось — отзовите ключ у провайдера, выпустите новый и положите его в секреты проекта, а не в код.
Почему бот долго молчит после вопроса?
Скорее всего, он ждёт модель. Генерация занимает секунды, а на длинном контексте — больше. Отправляйте статус «печатает» сразу и поднимите таймауты, иначе запрос обрывается раньше ответа и пользователь не получает ничего.
Как сделать, чтобы бот помнил предыдущие сообщения?
Держите историю диалога в постоянной папке /data, а не в памяти процесса: в памяти она живёт до первого перезапуска. Если диалогов много — используйте базу. И ограничивайте число последних сообщений, которые отправляете модели: длинная история дороже на каждом запросе.
Сколько стоит сама модель и где хранить секреты?
Модель — отдельный счёт: вы платите провайдеру за токены по его тарифам, в стоимость хостинга это не входит. Токен от BotFather и ключ модели храните в разделе секретов проекта: значения шифруются, а видны только имена переменных.