VPS с самостоятельным администрированием

Запуск Telegram AI-бота через Docker Compose

Инструкция запускает приватного Telegram-бота через long polling и удалённый inference API. Входящий порт приложения и скачивание весов модели не нужны. Пример использует стандартную библиотеку Python 3.12, один рабочий процесс и SQLite. Сервер, обновления и резервные копии вы обслуживаете самостоятельно.

Подготовьте VPS и ключи

Нужен обычный Linux VPS с SSH; предлагаемую начальную конфигурацию разбирает руководство по выбору. Пройдите подключение по SSH и установку Docker. Ниже предполагается root-сеанс администратора Ubuntu; для другого пользователя добавляйте sudo там, где требуются права.

docker compose version
systemctl enable --now docker
apt-get update
apt-get install -y ca-certificates curl unzip nano

Создайте отдельного бота через подтверждённого @BotFather и сохраните токен приватно. В доступе к API CloudCompute создайте отдельный ключ, пополните баланс и скопируйте точный ID текстовой chat-модели из каталога. Она должна поддерживать Chat Completions и max_tokens; image/audio endpoints для этого кода не подходят. Аренда VPS и inference оплачиваются отдельно.

Скачайте пример в постоянный каталог

mkdir -p /opt/telegram-bot
cd /opt/telegram-bot
curl --fail --show-error --location \
  https://cloudcompute.ru/downloads/telegram-inference-bot-v1.zip \
  --output bot.zip
unzip bot.zip
cd telegram-inference-bot
cp .env.example .env
chmod 600 .env
nano .env

Первое извлечение делайте в пустой каталог. При обновлении сохраняйте имя проекта: иначе Compose может выбрать другой volume. До ввода ключей просмотрите README и исходники. В архиве лежит пример, а не готовый токен или заранее оплаченный API-аккаунт.

Заполните .env; не передавайте секреты аргументами команд:

TELEGRAM_BOT_TOKEN=replace_with_token_from_BotFather
ALLOWED_TELEGRAM_USER_IDS=0
INFERENCE_BASE_URL=https://app.cloudcompute.ru/api/v1
INFERENCE_API_KEY=replace_with_your_api_key
INFERENCE_MODEL=replace_with_exact_text_model_id
BOT_LANGUAGE=ru
MAX_REQUESTS_PER_DAY=20
MAX_INPUT_CHARS=2000
MAX_OUTPUT_TOKENS=512
HISTORY_TURNS=4

Начальное значение 0 запрещает все AI-запросы, но позволяет отправить /id в личном чате и узнать числовой Telegram ID. Username не заменяет этот ID.

Запустите, разрешите свой ID и проверьте

docker compose up -d --build
docker compose logs --tail=50 bot
# Send /id in the bot's private chat, then edit the allowlist.
nano .env
docker compose up -d --force-recreate

Замените 0 своим числом; ID нескольких приглашённых пользователей разделяйте запятыми. Пересоздание применяет изменения .env, обычный restart — нет. Группы, вложения и отредактированные сообщения не запускают inference. На один токен нужен один polling-процесс. При существующем webhook пример завершится с ошибкой, не удаляя чужую настройку.

Проверьте /start, затем отправьте короткий вопрос. Сообщите безобидный факт: «Мой проект называется Cedar», перезапустите контейнер и спросите название снова. Это практическая проверка сохранения контекста, а не обещание точной памяти модели. /reset очищает локальный контекст. Со второго аккаунта, не включённого в allowlist, проверьте запрет AI-ответов.

Что подтверждает успешный запуск

Работающий контейнер подтверждает наличие процесса. Успешный /id дополнительно проверяет связь с Telegram. Только настоящий вопрос проверяет выбранную модель и API-ключ, и такой запрос может быть платным. Автоматические тесты используют имитацию API и не доказывают работу на реальном VPS. Для архива не заявлен результат живого развёртывания.

Не помещайте .env в Git, публичные каталоги и скриншоты для поддержки. Развёрнутый вывод Compose и дамп окружения контейнера могут раскрыть ключи. Образ не включает .env, работает под UID 10001 и пишет состояние только в volume. Администратор хоста или провайдер всё равно могут иметь доступ к серверу; это не сквозное шифрование разговора с моделью.

Далее: постоянное состояние, бэкап и восстановление, расходы. Источник: поведение Compose restart.

Тарифы из текущего каталога

Сейчас не удалось загрузить планы. Смотрите актуальные тарифы на странице цен.