Размещение телеграмм бота (Aiogram3) на VPS/VDS

Расскажу как просто задеплоить телеграмм бота на Aiogram 3 с webhook на VPS/VDS. Посмотреть видео версию, которую я выложил,  можно на YouTube

Также покажу установку двух типов сертификатов SSL:

  1. Бесплатный сертификат Let’s encrypt (3 месяца), через библиотеку acme-nginx, с автоматическим обновлением его. Этот сертификат будет использоваться для доменного имени в прокси сервере Nginx.

  2. Самоподписанный 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 Схема работы

рис. 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 Проверка вебхука

рис. 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 Логи

рис. 3 Логи

Немного затрону тему сертификатов.

Бесплатные SSL сетификаты на IP адреса Let’s encrypt вроде не выдает, потому я использовал самоподписанный сертификат и применил его во втором способе в самом телеграмм боте. Конечно в документации по Aiogram3 такой способ не рекомендуется, лучше через прокси сервер Nginx.

ZeroSSL вроде дает бесплатные сертификаты на IP, но на одну учетку не более трех (рис. 4), и я не смог через «acme» получить сертификат на IP.

рис.4 Страница ZeroSSL

рис. 4 Страница ZeroSSL

Все таки разумнее использовать Nginx и доменное имя, сейчас не так дорого, можно купить домен 2-ого уровня в зоне «ru» за ~100 руб на год, да и в придачу бесплатно дадут домен в какой нибудь зоне «site» …

А для телеграмм бота можно добавить поддомен 3-его уровня, добавив запись «A».

Как это делается показано на рис. 5, 6 для Timeweb и рис 7, 8 для Reg.ru

рис.5 Timeweb

рис. 5 Timeweb

рис.6 Timeweb

рис. 6 Timeweb

рис.7 Reg.ru

рис. 7 Reg.ru

рис.8 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 Ошибка

рис. 9 Ошибка

Данная статья предполагает установку на вновь созданный сервер VPS, но я думаю скрипты помогут и тем , у кого есть работающие сервера. Ни что не мешает, команды из скриптов вводить вручную в терминале, но конечно осознанно понимая что они делают.

Скрипты были мной проверены на ОС серверов Timeweb, Рег.ру: Ubuntu 20.04, Ubuntu 22.04.

Надеюсь кому то поможет. Всем удачи!)

© Habrahabr.ru