Деплой aiogram-бота на хостинг. Подробная инструкция
Сегодня мы с вами рассмотрим способ деплоя Telegram-бота, написанного на библиотеке aiogram 3.
Для деплоя мы будем использовать сервис Amvera, так как он позволяет развернуть любое приложение через простой push в Git (а если не хотите работать с Git, можно перетянуть файлы в интерфейсе). Кроме того, этот сервис дает стартовый баланс, которого хватит на все эксперименты и первое время работы вашего приложения.
Ресурсы, которые вам понадобятся для работы с Amvera:
— Git
— Любая IDE. В моем случае это VS Code
У нас имеется код самого простого Telegram бота (main.py), который будет удалять все «запрещенные» слова, хранящиеся в списке.
import os
from aiogram import Bot, Dispatcher, types, F
import asyncio
bot = Bot(os.getenv("TOKEN"))
dp = Dispatcher()
forbidden_words = ['test1', 'test2']
@dp.message(F.text.in_(forbidden_words))
async def delete_msg(message: types.Message):
await message.delete()
async def main():
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
asyncio.run(main())
Хост поддерживает переменные окружения в своем интерфейсе, поэтому нам не придется создавать их вручную.
Создание нового проекта в Amvera
Для создания проекта нам нужно предварительно зарегистрироваться на сайте.
Прелесть хоста в том, что при регистрации вам выдается стартовый баланс, которого хватит на тесты и примерно на три недели работы проекта при минимальном тарифе.
На главной странице нажимаем кнопку «Создать».
Вам необходимо ввести название проекта и выбрать тарифный план.
После чего вам предлагается загрузить данные либо пропустить этот шаг.
Перед тем как задеплоить бота, я пропущу этот шаг и перейду к третьему: созданию конфигурации проекта.
Это нужно, поскольку если отправить файлы без создания конфигурационного файла, произойдет ошибка сборки.
Создание конфигурационного файла
В окне нам нужно выбрать окружение (в нашем случае Python) и инструмент (pip)
После выбора появятся еще несколько полей ввода, среди которых нужно изменить «scriptName» в разделе «run» на main.py (название вашего файла).
Нажимаем «Завершить». Теперь мы можем приступать к инициализации проекта.
Получившийся yaml (конфигурационный) файл будет выглядеть примерно так:
meta:
environment: python
toolchain:
name: pip
version: 3.8
build:
requirementsPath: requirements.txt
run:
scriptName: main.py
persistenceMount: /data
containerPort: 80
Создание файла с зависимостями
Файл зависимости — txt файл, в котором прописаны необходимые библиотеки, требуемые для запуска проекта (помимо предустановленных — если их прописать, в большинстве случаев, вы получите ошибку сборки).
Вы можете автоматически создать файл зависимости именно этого проекта с помощью инструмента pipreqs.
Для установки инструмента нужно прописать команду:
pip install pipreqs
После чего, перейдя в директорию проекта, прописать:
pipreqs
Этот способ не всегда работает точно, так что обязательно проверяйте файл перед тем, как отправлять его на сервер!
Создавшееся requirements.txt содержит данный текст:
aiogram==3.3.0
Метод инициализации проекта
Вы можете загрузить проект через интерфейс сайта, но мы пойдем другим путём — используем Git. Преимущество этого способа в том, что в дальнейшем вам будет легче обновлять код через push.
Инициализация бота
Для начала, в корневой папке, где лежит бот и txt файл requirements.txt, мы открываем консоль и прописываем команду, которая скопирует репозиторий вместе с файлом конфигурации, который был создан нами в интерфейсе сайта.
git clone https://git.amvera.ru/имя-пользователя/имя-проекта
2. Создалась папка с именем проекта, куда мы переходим с помощью команды cd
cd/имя-папки
Перекидываем файлы в эту папку и пишем следующие команды:
git add .
git commit -m "комментарий”
Отправляем изменения
git push
Мы не прописываем amvera master после команды, так как мы заранее выполнили git clone, что сделало репозиторий основным.
Автоматически начнется сборка проекта. Если вы все сделали по инструкции, ошибок при сборке не будет. Однако произойдет ошибка приложения, так как мы не добавили переменную окружения TOKEN.
Создание «секрета»
На странице проекта переходим в вкладку «Переменные» и нажимаем на кнопку «Создать секрет»
Далее просто прописываем данные секрета и нажимаем на кнопку принятия изменений.
Запускаем проект, и бот работает!
Немного полезных фич и возможные проблемы
Если у вас появилась ошибка сборки или приложения, вы можете просмотреть ее причину во вкладке «Лог сборки» и «Лог приложения».
На странице проекта выбираем вкладку нужного нам лога. На нижней панели нажимаем кнопку загрузки (где изображена закругленная стрелка) и ожидаем загрузки лога.
На этой же панели можно выбрать количество строк, скопировать лог или удалить его.
Если у вас появляются проблемы с git, то вы можете посмотреть причину ошибки в документации Amvera.
Лично я сталкивался с такой проблемой при обновлении (push обновлений) кода. Из-за того, что код не останавливается мгновенно при push, бот продолжает работать некоторое время даже тогда, когда уже отправлены изменения и код запустился заново.
Именно из-за этого появляется ошибка приложения:
Terminated by other getupdates request; make sure that only one bot instance is running.
Чтобы исправить эту ошибку, добавьте в самое начало кода это:
import time
time.sleep(7)
Этот код делает задержку запуска приложения, что дает время прошлому сеансу завершиться. Однако придется подождать 7 секунд.
Если все выполнено правильно — поздравляю, вы произвели деплой aiogram бота на хостинг, и теперь он будет работать 24/7.