Расскажу как просто задеплоить телеграмм бота на 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.
Так как, у меня нет необходимости в постоянном 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.. вставить свой токен)
Для использования самоподписанного сертификата без 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.)
Немного затрону тему сертификатов.
Бесплатные SSL сетификаты на IP адреса Let's encrypt вроде не выдает, потому я использовал самоподписанный сертификат и применил его во втором способе в самом телеграмм боте. Конечно в документации по Aiogram3 такой способ не рекомендуется, лучше через прокси сервер Nginx.
ZeroSSL вроде дает бесплатные сертификаты на IP, но на одну учетку не более трех (рис.4), и я не смог через «acme» получить сертификат на IP.
Все таки разумнее использовать Nginx и доменное имя, сейчас не так дорого, можно купить домен 2-ого уровня в зоне «ru» за ~100 руб на год, да и в придачу бесплатно дадут домен в какой нибудь зоне «site» …
А для телеграмм бота можно добавить поддомен 3-его уровня, добавив запись «A».
Как это делается показано на рис. 5, 6 для Timeweb и рис 7, 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):
Данная статья предполагает установку на вновь созданный сервер VPS, но я думаю скрипты помогут и тем , у кого есть работающие сервера. Ни что не мешает, команды из скриптов вводить вручную в терминале, но конечно осознанно понимая что они делают.
Скрипты были мной проверены на ОС серверов Timeweb, Рег.ру: Ubuntu 20.04, Ubuntu 22.04.
Надеюсь кому то поможет. Всем удачи! )
Комментарии (8)
Rapira2388
27.12.2023 07:06Хз я контейнер докер запулил со своим ботом , порты от балды прописал и все работает.
Marat2010 Автор
27.12.2023 07:06Докер это хорошо, но хотелось, показать без него, чтобы показать как все работает. И при докере надо тоже понимать как он работает, как ваша сеть будет работать )
volatilization
27.12.2023 07:06в main.py указаны WEB_SERFVER_HOST WEB_SERVER_PORT. зачем это? ngnix же наоборот должен реверснуть эту зависимость что бы при разработке и деплое об этом не думать.
Marat2010 Автор
27.12.2023 07:06WEB_SERFVER_HOST WEB_SERVER_PORT - это адрес и порт на котором непосредственно запускается асинхронный сервер aiohttp, именно через него работает уже aiogram.
При первом способе, как раз Nginx принимает запрос от телеграмм сервера и перенаправляет на локально запущенный сервер aiohttp. Я конечно не совсем понял вопрос, при разработке, в данном случае ты и не думаешь у тебя вроде как и локально запускается. А вот webhook_url и webhook_path, отправляются телеграмм серверу , чтобы он знал, куда отправлять запросы, когда кто то напишет в вашем боте.
Надеюсь смог объяснить? )
DMaaxxx
27.12.2023 07:06+1Как вариант, можно использовать сервисы, типа sslip.io. Превратить свой ip в вид 127-0-0-1.sslip.io и спокойно получить сертификат через certbot (я использовал именно его)
theurus
+1 сильно переусложненный мануал из которого понятно что ничего не понятно Ж(
Marat2010 Автор
Может Вы и правы, здесь я пытался только объяснить некоторые моменты, а сам мануал на https://github.com/Marat2010/Aiogram3 в котором показан поочередный запуск команд для развертывания, вроде ничего сложного. А если не понятно, что делается в скриптах, то там есть комментарии. И я предполагаю, если человек работает с сервером VPS, то думаю элементарные команды *nix систем он знает. )