Ваш Python-бот готов: команды отвечают, aiogram крутится, на локальной машине всё работает. Но стоит закрыть ноутбук — и бот замолкает, потому что он живёт именно на вашем компьютере. Чтобы отвечать круглосуточно, ему нужна машина, которая не выключается. Обычно это означает арендовать VPS, поставить туда Python, настроить автозапуск через systemd и следить, чтобы процесс не падал. Для бота на aiogram или pyTelegramBotAPI всего этого можно избежать. Разберём по шагам, как подготовить проект и запустить его на Dockbox, где бот работает без вашего компьютера и без ручной настройки сервера.
Что должно быть в проекте перед деплоем
Список зависимостей. Файл requirements.txt в корне проекта — иначе сервер не узнает, какие библиотеки ставить. Папку с уже установленными библиотеками (venv) в архив класть не нужно: платформа соберёт окружение сама по этому списку.
Токен отдельно от кода. Строка, которую выдал BotFather, не должна лежать прямо в исходниках и тем более попадать в публичный репозиторий — иначе бота может увести любой, кто увидит файл.
Одна команда запуска. Бот должен стартовать одной командой, например python bot.py, и не требовать ручных шагов после старта. Если точка входа называется иначе, Dockbox предложит указать команду запуска при настройке проекта.
Режим приёма сообщений. Для простого бота достаточно long polling — бот сам спрашивает у Telegram новые сообщения.
Соберите зависимости в requirements.txt
Создайте requirements.txt в корне и перечислите всё, что бот реально импортирует. Для типичного проекта на aiogram достаточно такого набора:
aiogram==3.15.0
python-dotenv==1.0.1
Если бот ходит в базу или работает с картинками, добавьте sqlalchemy, Pillow, httpx — по факту импортов в коде. Проверить просто: пройдитесь по всем строкам import и убедитесь, что каждая библиотека попала в список. Версии лучше фиксировать, чтобы сборка на сервере не отличалась от локальной.
Вынесите токен в переменные окружения
Так делать не стоит — токен утекает вместе с кодом:
TOKEN = "7123456789:AA..."
bot = Bot(token=TOKEN)
Правильный вариант — читать значение из окружения:
import os
from aiogram import Bot, Dispatcher
TOKEN = os.environ["BOT_TOKEN"]
bot = Bot(token=TOKEN)
dp = Dispatcher()
Почему это важно. Код вы наверняка будете кому-то показывать, отдавать на ревью или заливать в Git. Токен в коде — это токен в чужих руках, а вместе с ним и доступ к боту, и возможность читать переписку. При настройке проекта в Dockbox вы указываете BOT_TOKEN как секрет: значение подставляется в процесс отдельно от кода, в базе хранится зашифрованным, а в панели видны только имена переменных.
Long polling вместо webhook
Для простого бота самый беспроблемный путь — остаться в режиме long polling, когда бот сам запрашивает у Telegram новые сообщения. Тогда не нужно поднимать веб-сервер, настраивать webhook и открывать порт. И aiogram, и pyTelegramBotAPI работают в этом режиме из коробки, так что менять в коде почти ничего не придётся.
Webhook нужен в случаях, когда на бота идёт большая нагрузка или нужен мгновенный отклик на веб-запросы от Telegram. Для бота-инструмента, который отвечает десяткам пользователей, long polling с головой покрывает задачу.
Загрузите проект в Dockbox
Код можно привезти двумя способами: загрузить ZIP-архив или подключить репозиторий — приватный тоже подойдёт. Дальше Dockbox сам определит, что перед ним Python, распознает проект как бота и соберёт окружение. Выбирать сервер, версию Python и способ запуска вручную не нужно — это остаётся на стороне платформы.
Ключевой момент — переменные окружения. Именно тут ошибаются чаще всего: код загружен, а BOT_TOKEN забыли, и бот падает при старте с сообщением, что токен не найден. Добавьте в секреты всё, что код читает через os.environ.
Запуск и проверка бота
Когда сборка завершится, бот стартует и начнёт отвечать в Telegram. Дальше проверьте три вещи: отправьте боту /start и дождитесь ответа, посмотрите логи в панели (там должно быть что-то вроде Start polling без ошибок) и убедитесь, что данные сохраняются, если бот что-то помнит.
Логи видны в реальном времени. Если бот не отвечает, причина почти всегда написана прямым текстом. Три типичные ситуации: неверный токен, отсутствующая зависимость или не проброшенная переменная, и второй запущенный экземпляр с тем же токеном — тогда Telegram отдаёт 409 Conflict.
Бесплатный тариф: сколько живёт бот
Базовый тариф Starter стоит 990 ₽/мес (первый месяц бесплатно!) и включает 1 vCPU, 2 ГБ RAM и 20 ГБ SSD: бот работает постоянно, пока запущен его контейнер, а платформа перезапускает процесс при сбое. Никакого лимита по времени работы у Dockbox нет — ни у ботов, ни у сайтов. Для большего числа проектов и ресурсов есть Pro (2490 ₽/мес) и Team (4990 ₽/мес) — актуальные цены смотрите на странице тарифов в панели.
Почему тариф зависит от ресурсов, а не от типа проекта. И сайт, и бот занимают выделенные vCPU и память, и оба работают постоянно, пока запущен их контейнер, — лимита по времени нет ни у кого. Разница лишь во внешнем виде: у сайта есть публичная ссылка, а у бота её нет, потому что он сам обращается к Telegram, а не наоборот. На режим работы это не влияет: бот так же отвечает круглосуточно.
Что дальше
Когда бот отвечает, стоит подумать о состоянии: если он хранит пользователей, заказы или настройки, это должно лежать в постоянном хранилище, а не во временной папке, которая очищается при пересборке. Иначе при первом же обновлении данные потеряются. Второй шаг — регулярные резервные копии и разумное логирование: логи помогут разобраться, когда бот начнёт вести себя странно.
Частые вопросы
Где можно бесплатно разместить Python-бота?
Разместите его на Dockbox: Starter даёт 1 vCPU, 2 ГБ RAM и 20 ГБ SSD, а первый месяц бесплатный. Бот работает постоянно, пока запущен его контейнер, а платформа перезапускает процесс при сбое — никакого ограничения по времени ни у ботов, ни у сайтов. Для большего числа проектов и ресурсов есть Pro и Team — цены смотрите на странице тарифов в панели.
Это работает и с aiogram, и с pyTelegramBotAPI?
Да. Dockbox распознаёт, что перед ним Python-проект, и запускает бота независимо от библиотеки. Главное — собрать зависимости в requirements.txt, вынести токен в переменную окружения и остаться в режиме long polling.
Нужен ли webhook и веб-сервер?
Нет. Для простого бота достаточно long polling: сообщения бот забирает у Telegram сам. Поднимать веб-сервер, настраивать webhook и открывать порт не нужно.
Бот продолжит работать, когда компьютер выключен?
Да. После деплоя бот живёт на серверах Dockbox, а не на вашей машине, поэтому отвечает независимо от того, включён ноутбук или нет.
Безопасно ли хранить токен бота?
Да, если держать его в переменной окружения и указать как секрет при настройке. Тогда токена нет ни в коде, ни в репозитории, а в базе Dockbox значение хранится зашифрованным.