Размещение телеграмм бота (Aiogram3) на VPS/VDS
Расскажу как просто задеплоить телеграмм бота на Aiogram 3 с webhook на VPS/VDS. Посмотреть видео версию, которую я выложил, можно на YouTube
Также покажу установку двух типов сертификатов SSL:
Бесплатный сертификат Let’s encrypt (3 месяца), через библиотеку acme-nginx, с автоматическим обновлением его. Этот сертификат будет использоваться для доменного имени в прокси сервере Nginx.
Самоподписанный SSL — для случая использования телеграмм бота без прокси сервера Nginx. Сертификат будем делать для IP адреса, т. е. для случаев когда, нет доменного имени у нас.
Зайдя на официальную страницу документации Aiogram 3.2.0, и пролистав вниз, видим два примера, шаблона «Examples» «Behind reverse proxy» и «Without reverse proxy (not recommended)». Взяв эти два примера, я «объединил» их в один файл «main.py», и добавил переменную SELF_SSL для выбора первого примера (значения False) либо второго (значение True) в случае использования самоподписанного сертификата.
Объединить, вернее скорректировать код было не сложно, т. к. во втором только добавляется моменты, касаемые SSL сертификата.
Чтобы нагляднее было понимание схемы работы и основных переменных, прикладываю картинку рис. 1.
рис. 1 Схема работы
Так как, у меня нет необходимости в постоянном VPS/VDS, я использую тарифы с почасовой оплатой площадки Timeweb (0,26 руб/час) или Reg.ru (0,58 руб/час). Очень удобно и недорого, минимум закинуть нужно 50 и 100 руб соответственно, когда надо включил, потестил, потом удалил.
По этой причине, пришлось написать простые скрипты (bash) для быстрого развертывания на чистый сервер. Весь процесс деплоя бота описан здесь https://github.com/Marat2010/Aiogram3 .
Суть заключается в подключении по ssh к своему VPS, скачиванию и запуску первого скрипта, который подтянет остальные скрипты (Git репозиторий скачивать целиком не надо). И далее нам останется поочередно запустить 2-ой, 3-ий и 4-ый скрипт. Только необходимо смотреть под кем запускать (user или root) и о необходимости перезайти под пользователем, т.к. в скриптах создаются переменные окружения, они вносятся в »/etc/environment», которые используются в следующем скрипте. Эти же переменные окружения копируются в файл окружения проекта ».env».
Скрипты очень простые и есть комментарии в них, что они делают.
Если в кратце, то ….
Первый скрипт начальный, создает пользователя под кем вы будете работать, закачивать свои файлы проекта по ftp в будущем.
2-ой скрипт, касается создания проекта, вирт. окружения, ввода данных, таких как токен телеграмм бота, IP адрес (94.241.168.236) , имя домена (bot3.rupyt.site) сервера и имя папки проекта (aio3). Также создания самоподписанных сертификатов, и запуска телеграмм бота как службу-сервис Aiogram3_bot.service через SYSTEMD.
3-ий скрипт — выполняет все что касается прокси сервера Nginx, установка настройка, подготовка тестовых страниц html, организация доступа к папке проекта для веба.
4-ый скрипт — формирование бесплатного SSL сертификата Let’s encrypt, через acme-nginx, установка диспетчера задач для автоматического обновления сертификата (crond).
Здесь есть важный момент, перед запуском 4-ого скрипта необходимо проверить доступность вашего сайта, потому что библиотека acme-nginx разместит файл у нас на веб-сервере, и попытается из вне к нему достучатся примерно по такому адресу: http://bot3.rupyt.site/.well-known/pki-validation/C7B53CFFA9F38169AA5203AAE43A0677.txt, это такая проверка, того что сайт ваш.
После запуска 4-ого скрипта , бот будет работать в режиме с Nginx.
Проверить в логах, можно командой: «sudo tail -f /var/log/nginx/access.log»
Проверку состояния ТГ вебхука можно по адресу: https://api.telegram.org/bot…BOT_TOKEN…/getWebhookInfo (вместо …BOT_TOKEN. вставить свой токен)
рис. 2 Проверка вебхука
Для использования самоподписанного сертификата без Nginx, необходимо в main.py установить SELF_SSL = True.
После остановить Nginx (чтобы порт 8443 освободить), и перезапустить службу Aiogram3_bot:
sudo systemctl stop nginx.service
systemctl daemon-reload
sudo systemctl restart Aiogram3_bot.service
Теперь можно проверить работу бота в режиме с самоподписанным сертификатом, также по адресу https://api.telegram.org/bot…BOT_TOKEN…/getWebhookInfo, но теперь в «URL» будет IP адрес, а параметр «has_custom_certificate» будет «True».
В логах увидим следующее (рис3.)
рис. 3 Логи
Немного затрону тему сертификатов.
Бесплатные SSL сетификаты на IP адреса Let’s encrypt вроде не выдает, потому я использовал самоподписанный сертификат и применил его во втором способе в самом телеграмм боте. Конечно в документации по Aiogram3 такой способ не рекомендуется, лучше через прокси сервер Nginx.
ZeroSSL вроде дает бесплатные сертификаты на IP, но на одну учетку не более трех (рис. 4), и я не смог через «acme» получить сертификат на IP.
рис. 4 Страница ZeroSSL
Все таки разумнее использовать Nginx и доменное имя, сейчас не так дорого, можно купить домен 2-ого уровня в зоне «ru» за ~100 руб на год, да и в придачу бесплатно дадут домен в какой нибудь зоне «site» …
А для телеграмм бота можно добавить поддомен 3-его уровня, добавив запись «A».
Как это делается показано на рис. 5, 6 для Timeweb и рис 7, 8 для Reg.ru
рис. 5 Timeweb
рис. 6 Timeweb
рис. 7 Reg.ru
рис. 8 Reg.ru
И еще один момент на Reg.ru бот , бот не будет работать в режиме с IP, будет выходить такая ошибка:
«OSError: [Errno 99] error while attempting to bind on address ('89.104.70.190', 8443): cannot assign requested address»
Видать это связано с реализацией VPS, вернее её сети. На рисунке, привожу пример как на Timeweb и Reg.ru (рис. 9):
рис. 9 Ошибка
Данная статья предполагает установку на вновь созданный сервер VPS, но я думаю скрипты помогут и тем , у кого есть работающие сервера. Ни что не мешает, команды из скриптов вводить вручную в терминале, но конечно осознанно понимая что они делают.
Скрипты были мной проверены на ОС серверов Timeweb, Рег.ру: Ubuntu 20.04, Ubuntu 22.04.
Надеюсь кому то поможет. Всем удачи!)