Хостинг aiogram-бота: как запустить и сколько это стоит

Бот на aiogram начинает жизнь в терминале: python main.py, пара команд, всё отвечает. Но стоит закрыть ноутбук — и бот замолкает, потому что процесс живёт на вашей машине. Дальше обычно начинается аренда VPS, установка Python, настройка systemd и слежение за тем, чтобы сервис не упал. Для проекта на aiogram ничего этого не нужно: это обычный Python-проект с зависимостями и токеном. Разберём по шагам, как его собрать и запустить на Dockbox, чтобы бот отвечал без вашего компьютера.

Что должно быть готово до публикации

Файл зависимостей. Обычно это requirements.txt в корне проекта: в нём aiogram и всё, что бот импортирует. Папку venv с уже установленными библиотеками в архив класть не нужно — Dockbox соберёт окружение сам по этому списку.

Токен отдельно от кода. Строка от BotFather не должна лежать в исходниках: код вы почти наверняка будете показывать, кому-то отдавать или заливать в Git. Токен в коде — это токен в чужих руках, а вместе с ним доступ к боту и к переписке.

Одна команда запуска. Бот должен стартовать одной командой — python main.py или python bot.py — и не требовать ручных шагов после старта. Если точка входа называется иначе, команду можно указать при настройке проекта.

Режим приёма сообщений. По умолчанию aiogram сам забирает обновления у Telegram (long polling). Переписывать бота под webhook не требуется.

Файл зависимостей: requirements.txt

Если файла нет, соберите его в папке проекта:

pip freeze > requirements.txt

Для типичного бота хватит минимального набора:

aiogram==3.15.0
python-dotenv==1.0.1

Почему версию стоит зафиксировать. Синтаксис aiogram 2 и aiogram 3 различается заметно. Без явного == сборка поставит последний релиз, и код, написанный под вторую версию, упадёт уже на первом импорте.

Токен — в переменные окружения

Плохой вариант, который часто встречается в примерах:

BOT_TOKEN = "7123456789:AA..."
bot = Bot(token=BOT_TOKEN)

Правильный — читать значение из окружения:

import os
from aiogram import Bot
BOT_TOKEN = os.getenv("BOT_TOKEN")
if not BOT_TOKEN:
    raise RuntimeError("BOT_TOKEN не задан")
bot = Bot(token=BOT_TOKEN)

Где взять значение. В Telegram у @BotFather: отправьте /newbot, придумайте имя и username. В Dockbox токен указывается как секрет — значение подставляется в процесс отдельно от кода, в базе лежит зашифрованным, а в панели видны только имена переменных.

Загрузите бота в Dockbox

Порядок такой:

  • подключить Git-репозиторий (приватный тоже подойдёт) или загрузить архив с проектом;
  • указать команду запуска, если имя файла отличается от ожидаемого;
  • добавить секреты — BOT_TOKEN и всё остальное, что код читает через os.environ.

Dockerfile писать не нужно, и версию Python выбирать вручную тоже: Dockbox распознаёт проект по requirements.txt, устанавливает зависимости и запускает процесс. Именно на шаге с переменными ошибаются чаще всего: код загружен, а токен забыт — и бот падает при старте с сообщением, что переменная не найдена.

Long polling менять не нужно

Бот, который сам опрашивает Telegram, работает на Dockbox без переделок. Webhook имеет смысл, когда у бота высокая нагрузка или уже есть веб-часть; для обычного проекта разницы не будет.

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

Проверка: бот отвечает, логи видны

После деплоя откройте бота в Telegram и отправьте /start. Затем посмотрите логи:

  • зависимости установились без ошибок;
  • в логах есть строка о старте polling;
  • на команды приходят ответы.

Если ответа нет, причина обычно в трёх местах: неверный токен, библиотека, которой не оказалось в requirements.txt, или второй запущенный экземпляр — тогда Telegram отдаёт 409 Conflict. Логи показывают это прямым текстом, гадать не нужно.

Сколько стоит бот круглосуточно

Starter — 990 ₽/мес. 1 vCPU, 2 ГБ RAM, 20 ГБ SSD, один проект. Первый месяц бесплатно. Контейнер работает постоянно: лимита по времени и «засыпания» у Dockbox нет, поэтому бот на aiogram ждёт сообщения круглосуточно и не отключается через несколько часов. Этого тарифа одному боту достаточно.

Pro — 2 490 ₽/мес. 2 vCPU, 4 ГБ RAM, до пяти проектов и свой домен.

Team — 4 990 ₽/мес. Больше ресурсов и проектов, SLA.

Автоперезапуск при сбое работает на всех тарифах: если процесс упал, платформа поднимает его сама. Отдельно за трафик, сборки и логи платить не нужно.

Данные и обновления кода

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

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

Сколько стоит хостинг для бота на aiogram?

Starter — 990 ₽/мес, первый месяц бесплатный, и этого боту достаточно: 1 vCPU, 2 ГБ RAM, 20 ГБ SSD, автодеплой и SSL. Контейнер работает постоянно, без лимита по времени. Если проектов несколько или не хватает ресурсов, есть Pro (2 490 ₽/мес) и Team (4 990 ₽/мес) — актуальные цены смотрите на странице тарифов.

Нужно ли переписывать бота под webhook?

Нет. Long polling, который aiogram использует по умолчанию, на Dockbox работает как есть. Webhook нужен при высокой нагрузке или если у бота уже есть веб-часть, но для обычного проекта разницы вы не заметите.

Какую версию aiogram использовать и как её зафиксировать?

Актуальную третью, но зафиксируйте её явно в requirements.txt, например aiogram==3.15.0. Без этого сборка поставит последний релиз, и код под aiogram 2 упадёт на первом импорте.

Где боту хранить базу данных?

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

Почему бот отвечает только через сообщение?

Почти всегда запущены две копии с одним токеном — например, на вашем компьютере и на платформе. Telegram отдаёт обновления одному получателю за раз, поэтому ответы чередуются. Остановите лишний экземпляр.