Как запускать несколько Telegram-ботов, не оплачивая сервер каждому

«Один бот — один сервер» — привычка родом из мира VPS. Она держится ровно до того момента, пока ботов не станет три: сначала бот для себя, потом для друга, потом для клиента с другими формулировками. Дальше выясняется, что второй и третий бот не требуют второго и третьего сервера — достаточно, чтобы платформа давала нужное число проектов, а каждый бот жил в своём контейнере. Разбираем, как это устроено на Dockbox и как считать деньги, когда ботов пять.

Почему на своём сервере несколько ботов — это несколько проблем

На одной машине каждый новый бот — это отдельная история. Где-то не та версия Python, где-то конфликт библиотек, где-то забыт автозапуск. Через месяц вы получаете сервер, к которому страшно прикоснуться: непонятно, от чего зависит какой процесс и что сломается при очередном обновлении.

Что происходит на практике. Боты делят один и тот же набор системных пакетов. Один требует старую версию aiogram, второй — новую; обновление ради одного ломает соседа. Токены лежат где-то в файлах рядом, и рано или поздно два процесса стартуют с одним и тем же токеном.

Почему так выходит. VPS даёт вам машину, а не среду выполнения. Разделение ботов — целиком ваша задача, и решается она руками: отдельные виртуальные окружения, отдельные systemd-юниты, отдельные папки с данными. Каждая новая единица — ещё один повод что-нибудь забыть.

Тариф отвечает за одно, число проектов — за другое

Это два разных вопроса, и их стоит разделить сразу.

Как бот работает решает платформа, а не тариф. На Dockbox контейнеры работают постоянно — без остановки по времени и без простоя: бот живёт ровно столько, сколько вы держите его запущенным. При сбое процесс перезапускается автоматически, логи видны в панели.

Сколько ботов у вас есть — отдельная строка. Число проектов заложено в тариф: один на Starter, пять на Pro, безлимит на Team. То есть пять ботов — это не пять тарифов, а один тариф Pro с пятью проектами.

Сколько ботов влезает в тариф

  • Starter — 990 ₽/мес, 1 vCPU, 2 GB RAM, 1 проект. Первый месяц бесплатный — этого хватает, чтобы довести первого бота до работы;
  • Pro — 2 490 ₽/мес, 2 vCPU, 4 GB RAM и 5 проектов — базовый вариант для нескольких ботов;
  • Team — 4 990 ₽/мес — проектов без ограничения, если ботов становится больше пяти.

Посчитайте альтернативу: три бота на своих серверах — это три машины по 200–400 ₽, три окружения и три точки отказа. На Pro три бота — это один тариф и три проекта в одной панели, а сумма не растёт с каждым новым ботом. Полный список тарифов и лимитов — на Dockbox.

Каждый бот — отдельный контейнер, а не папка в общем проекте

Соблазн «положить всех ботов в один проект» понятен, но обходится дороже, чем экономит. Разделение даёт каждому боту три вещи:

  • свои логи — по падению сразу видно, какой именно бот и на какой строке;
  • своё постоянное хранилище — данные, которые бот накапливает, лежат отдельно и не путаются с данными соседа;
  • независимые обновления — правка одного бота не перезапускает остальных.

Держите структуру репозиториев простой: один бот — один репозиторий, который подключается как отдельный проект.

support-bot/
  main.py
  requirements.txt

Токен каждого бота живёт отдельно

У каждого бота свой токен от @BotFather. Хранится он в переменных окружения проекта — не в коде и не в архиве. В коде только чтение:

TOKEN = os.environ["BOT_TOKEN"]

А сами значения задаются в панели проекта или в файле переменных:

BOT_TOKEN=7123456789:AA...
BOT_NAME=support_bot

Токены не переходят из проекта в проект, поэтому запустить двух ботов на одном токене по ошибке не получится. Это важно и технически: Telegram не разрешает двум процессам работать с одним токеном — второй получит ошибку 409 Conflict и не запустится.

Если один бот упал, остальные продолжают работать

Разные контейнеры — разные процессы. Падение одного бота не тянет за собой остальных: у соседей своя память, свои зависимости, свой цикл перезапуска. Платформа поднимает упавший контейнер автоматически, а вы в это время спокойно отвечаете клиенту в другом боте.

На общем сервере такого не получается почти никогда: нехватка памяти или упавшее обновление системы уносит всех сразу, потому что процесс-то один — общий.

Как добавить второго бота

  • Заведите отдельный репозиторий под нового бота — с кодом, requirements.txt и командой запуска;
  • Создайте новый проект в панели и подключите к нему этот репозиторий;
  • Добавьте переменные окружения: BOT_TOKEN от BotFather и всё, что код читает через os.environ;
  • Дождитесь сборки Docker-образа и запуска контейнера;
  • Проверьте бота в Telegram: /start должен получить ответ, а в логах не должно быть ошибок.

Тот же порядок повторите для третьего и пятого бота. Если проект нужно посмотреть руками, контейнер можно запустить локально той же командой:

docker run -d --restart unless-stopped \
  --env-file .env \
  --name support-bot support-bot:latest

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

Нужен ли каждому боту отдельный сервер?

Нет. Отдельный сервер нужен ровно одному боту — если вы вообще хотите администрировать машину. На платформе каждый бот получает свой контейнер внутри одного тарифа: на Pro это 5 проектов, на Team — без ограничения.

Сколько ботов можно держать на одном тарифе?

На Starter — один проект, на Pro — пять, на Team — столько, сколько нужно. Второй и последующие боты не требуют второго тарифа: вы просто создаёте ещё один проект в панели.

Можно ли запустить несколько ботов внутри одного проекта?

Технически да, но это плохая идея. Отдельные проекты дают каждому боту свои логи, своё постоянное хранилище и независимые обновления: правка одного бота не перезапускает соседей, а падение одного не тянет за собой остальных.

Что будет, если один бот упадёт?

Упадёт только он. Контейнер перезапускается автоматически, а остальные боты продолжают работать, потому что живут в отдельных контейнерах со своими зависимостями и памятью.

Боты работают круглосуточно на младшем тарифе?

Да. Круглосуточная работа — это стандартный режим контейнера на Dockbox, а не отдельная функция плана. Он одинаково работает и на Starter, и на Pro, и на Team: контейнеры не останавливаются по времени и не уходят в простой.