НОВОЕ 📢 Ограниченное стартовое предложение: скидка до 70% на первый месяц для любой игры!Посмотреть тарифы

Как запустить бота на aiogram 24/7: тариф для ботов или VPS

Хостинг Telegram-ботовUpdated Nov 6, 202610 min read

Чтобы запустить бота на aiogram 24/7, держите его не на своём компьютере, а на машине, которая всегда включена: на Linux VPS с сервисом systemd, который перезапускает бота после сбоя или перезагрузки, либо на тарифе для ботов PlayNHost (от US$1.99 в месяц, см. хостинг Telegram-ботов), где вы загружаете код, вставляете токен и нажимаете «Запустить». В нашем тесте бот на aiogram 3.31.0 занимал около 173 МБ памяти в покое; у самого маленького тарифа для ботов, STARTER, их 0,5 ГБ. Оба способа используют long polling: dp.start_polling(bot) сам запрашивает у Telegram новые сообщения, поэтому публичный адрес боту не нужен. Шаги на PlayNHost:

  1. В Telegram отправьте /newbot боту @BotFather и скопируйте выданный токен.
  2. На странице хостинг Telegram-ботов нажмите Создать сервер у нужного тарифа. В окне заказа на вопрос Для какой платформы ваш бот? ответьте Telegram и выберите Python.
  3. Откройте свой сервер в панели. Карточка Настройка бота на вкладке Обзор открывается на шаге Подключение к Telegram; на первом шаге, Что запускается, должно быть написано Этот бот запускает Python Bot.
  4. На шаге Подключение к Telegram вставьте токен и нажмите Подключение. Проверьте показанное имя бота и нажмите Да, продолжить.
  5. На шаге Ваш код нажмите Загрузить файлы, чтобы открыть Files, и загрузите bot.py и requirements.txt, либо нажмите Подключить Git.
  6. На странице Бот, в блоке Код, убедитесь, что Файл запуска указывает на файл, который выполняет asyncio.run(main()) (по умолчанию это bot.py).
  7. Нажмите Запустить бота, откройте Console и дождитесь строки aiogram Run polling for bot @your_bot. Метка на вкладке Обзор сменится на Онлайн в Telegram. Отправьте боту /start.

Первый запуск идёт дольше, потому что pip устанавливает aiogram и его зависимости. Дальше установка повторяется только при изменении файла с зависимостями, дополнительных пакетов или версии Python, а также раз в сутки. Пошаговая инструкция со скриншотами: Как запустить Telegram-бота на хостинге.

Что мы замерили

Мы запустили три Python-библиотеки для Telegram на одном из наших серверов, в одноразовых контейнерах, настроенных так же, как панель запускает бота на Python: Python 3.12 (Среда выполнения с пометкой «рекомендуется»), пакеты, установленные той же командой pip, лимит памяти 1 ГБ и одно ядро процессора.

БиблиотекаВерсияПамять в покоеОт запуска до ответа TelegramРазмер после установки, с зависимостями
aiogram3.31.0173 МБ4,3 с33,9 МБ
python-telegram-bot22.844 МБ0,9 с12,3 МБ
pyTelegramBotAPI4.37.140 МБ0,7 с21,9 МБ
Один Python 3.129 МБ

Каждый бот загружал библиотеку и с поддельным токеном спрашивал у Telegram, кто он такой (в aiogram: bot.get_me()). Память это то, что занимали процессы бота через 15 секунд после того, как Telegram отклонил токен; время запуска отсчитывается от старта Python до момента, когда библиотека сообщает этот ответ, так что в него входит один обмен с Telegram. Оба значения это медиана трёх прогонов после одного прогрева.

Эти цифры показывают минимум библиотеки: никаких чатов, никаких работающих обработчиков, пустой кэш. Ваш собственный код, данные, которые он держит в памяти (например, состояния диалогов в MemoryStorage aiogram), и число обслуживаемых чатов добавляются сверху, поэтому выбирайте тариф по тому, что делает ваш бот. Наша прежняя страница python-telegram-bot или aiogram на PlayNHost измеряла другую конфигурацию (Python 3.13, собранный и готовый к запуску бот), поэтому её цифры нельзя сравнивать с этими.

Минимальный бот на aiogram

Он отвечает на /start, читает токен, который выдаёт панель, и пишет в лог строку о готовности. Добавьте библиотеку в requirements.txt:

aiogram>=3,<4

А код положите в bot.py:

import asyncio
import logging
import os
import sys

from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message

dp = Dispatcher()


@dp.message(CommandStart())
async def start(message: Message) -> None:
    await message.answer("Hello! I am running on PlayNHost.")


async def main() -> None:
    bot = Bot(os.environ["BOT_TOKEN"])
    async with bot.context():
        await bot.delete_webhook()
        await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

Бот читает BOT_TOKEN, то есть имя, которое используют собственные примеры aiogram; панель передаёт токен вашему коду под этим именем, а также под именами TELEGRAM_BOT_TOKEN, TOKEN и TELEGRAM_TOKEN. Логирование на уровне INFO заставляет aiogram вывести строку, которая начинается с INFO:aiogram.dispatcher:Run polling for bot @your_bot, как только Telegram принял токен, а панель по этой строке показывает Онлайн в Telegram, так что собственный print не нужен. delete_webhook() перед началом polling удаляет вебхук, оставшийся от другого хостинга. async with bot.context() закрывает соединение бота с Telegram, когда main() завершается, в том числе с ошибкой.

Если токен неверный

В нашем тесте с токеном, который Telegram отклоняет, тестовый бот вывел:

TelegramUnauthorizedError: Telegram server says - Unauthorized

В полном traceback класс называется aiogram.exceptions.TelegramUnauthorizedError. Первый же вызов Telegram завершается ошибкой (в боте выше это delete_webhook(); без него это getMe, который делает start_polling), поэтому бот сразу останавливается с кодом выхода 1. На PlayNHost панель показывает над консолью сообщение Telegram не принял токен вашего бота с кнопкой Заменить токен.

Чтобы исправить, скопируйте токен заново: в @BotFather отправьте /mybots, выберите бота, затем API Token. Вставьте его на странице Бот, в блоке Telegram, в поле Токен, и снова запустите бота.

Ещё два случая выглядят иначе. Токен с пробелом или без номера бота и двоеточия перед секретной частью отклоняется до любого запроса: Bot() проверяет формат и выбрасывает TokenValidationError с сообщением, которое начинается с Token is invalid!. Токен, отозванный, когда бот уже работает в polling, бота не останавливает: aiogram пишет Failed to fetch updates - TelegramUnauthorizedError и повторяет попытку каждые несколько секунд, так что процесс выглядит запущенным, а на сообщения никто не отвечает. Заметить это помогает баннер в панели.

Что хостингу нужно знать об aiogram

  • Имена пакета и импорта: оба aiogram. Вместе с ним ставятся aiohttp, pydantic, magic-filter, aiofiles и certifi.
  • Версия Python: aiogram 3.31 требует Python с 3.10 по 3.14. Среда выполнения в блоке Код предлагает ровно версии с 3.10 по 3.14, и 3.12 помечена как рекомендуемая.
  • Код на aiogram 2 не работает на aiogram 3: Executor удалён, поэтому executor.start_polling(dp) превращается в await dp.start_polling(bot). Если в requirements.txt туториала закреплена версия 2.x, например aiogram==2.25.2, это код для версии 2; см. вопрос ниже.
  • Вебхук, оставшийся от другого хостинга: start_polling его не удаляет, а пока вебхук установлен, Telegram отказывает в polling, поэтому aiogram пишет TelegramConflictError и повторяет попытки. Оставьте await bot.delete_webhook(), как выше, или нажмите Удалить вебхук на странице Бот, в блоке Telegram.
  • Логирование: без logging.basicConfig строки aiogram уровня INFO, в том числе строка о готовности, не выводятся. На уровне INFO он также пишет по строке на каждое обновление (Update id=... is handled); в нагруженном боте добавьте logging.getLogger("aiogram.event").setLevel(logging.WARNING), строка о готовности при этом сохранится.
  • Какие обновления приходят: если не передать allowed_updates, start_polling запрашивает у Telegram только те типы обновлений, для которых у вас есть обработчики.
  • Вторая копия: если другая копия работает в polling с тем же токеном, Telegram отвечает 409 Conflict, а aiogram повторяет попытки, пока работает. Панель показывает Ваш бот работает ещё и в другом месте. См. Как исправить ошибку 409 Conflict у Telegram-бота.

Свой Linux VPS

В Debian или Ubuntu установите Python, создайте пользователя для бота и поставьте aiogram в виртуальное окружение. Убедитесь, что python3 --version показывает версию с 3.10 по 3.14.

sudo apt update
sudo apt install -y python3 python3-venv
sudo useradd --system --create-home --home-dir /opt/tgbot --shell /usr/sbin/nologin tgbot
sudo cp bot.py requirements.txt /opt/tgbot/
sudo -u tgbot python3 -m venv /opt/tgbot/venv
sudo -u tgbot /opt/tgbot/venv/bin/pip install -r /opt/tgbot/requirements.txt

Положите токен в файл, который может читать только root. Откройте его командой sudo nano /etc/tgbot.env, напишите одну строку, сохраните и выполните sudo chmod 600 /etc/tgbot.env:

BOT_TOKEN=123456789:your-token-from-botfather

Создайте /etc/systemd/system/tgbot.service:

[Unit]
Description=Telegram bot (aiogram)
Wants=network-online.target
After=network-online.target

[Service]
User=tgbot
WorkingDirectory=/opt/tgbot
EnvironmentFile=/etc/tgbot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/tgbot/venv/bin/python /opt/tgbot/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Запустите сервис сейчас и при каждой загрузке, затем следите за выводом:

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f

Строки логирования попадают в журнал сразу; PYTHONUNBUFFERED=1 даёт то же для любого добавленного вами print(), который иначе Python держит в буфере, если пишет не в терминал. systemctl stop tgbot отправляет SIGTERM, а start_polling обрабатывает его: останавливает polling и закрывает сессию бота. После изменения кода выполните sudo systemctl restart tgbot. Сначала остановите все копии на своём компьютере, иначе Telegram ответит 409 Conflict.

Свой сервер или тариф для ботов

  • На VPS, которым вы управляете сами: обновления системы, версия Python, виртуальное окружение, переустановка пакетов, файл юнита, чтение журнала и контроль того, что бот перестал отвечать. Взамен у вас есть root, и вы можете использовать режим вебхуков aiogram, если добавите домен и HTTPS.
  • На тарифе для ботов это делает панель: устанавливает requirements.txt, когда он меняется, перезапускает бота после сбоя, проверяет токен в Telegram перед сохранением, передаёт его вашему коду под пятью именами, читает консоль и называет причину, когда бот перестаёт отвечать (отклонённый токен, вторая копия, вебхук), с кнопкой для токена и вебхука. На наших тарифах для ботов пока нет публичного HTTPS-адреса, поэтому боты там работают через long polling, а именно это и делает start_polling.

См. также Как использовать базу данных MySQL с ботом aiogram (aiomysql).

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

Можно ли запустить бота на aiogram 2?

Если получится, перенесите его на aiogram 3: в руководстве по миграции aiogram перечислены изменения, начиная с удалённого Executor. Последний выпуск aiogram 2, версия 2.25.2, вышел 6 октября 2023 года. В нём заявлена поддержка Python с 3.7 по 3.10, и ему нужен aiohttp старше 3.9, который PyPI предлагает в виде готовых пакетов только до Python 3.11. Если старый код нужно запустить до переноса, закрепите aiogram==2.25.2 в requirements.txt и выберите в Среде выполнения Python 3.10, самую новую из заявленных версий.

Почему бот на aiogram выглядит запущенным, но не отвечает?

После старта polling aiogram продолжает повторять попытки: если токен отозван в @BotFather, если с тем же токеном работает другая копия или если на боте остался вебхук. Найдите строки, которые начинаются с Failed to fetch updates, в Console; панель превращает каждый из этих трёх случаев в баннер с названием причины и кнопкой для токена и вебхука.

Где хранятся состояния FSM в aiogram?

При хранилище в памяти, которое используется по умолчанию, они живут в процессе бота: при перезапуске бота, например после изменения кода, они теряются. Чтобы их сохранить, используйте хранилище вне процесса, например Redis-хранилище aiogram с доступным вам сервером Redis.

Нужен ли вебхук, чтобы бот на aiogram оставался онлайн?

Нет. start_polling постоянно запрашивает у Telegram новые сообщения, поэтому бот отвечает, пока работает процесс. Если вы переносите бота, который работал через вебхук: Как перенести Telegram-бота на PlayNHost.

aiogram работает на любом тарифе для ботов PlayNHost, начиная со STARTER (0,5 ГБ). Сравните тарифы и нажмите Создать сервер на странице хостинг Telegram-ботов.

Ваш бот уже у другого хостинга? Перенесите его к нам

ПОСЛЕДНИЕ БЛОГИ