Расскажу как просто задеплоить телеграмм бота на 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.

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

Комментарии (8)


  1. theurus
    27.12.2023 07:06
    +1

    +1 сильно переусложненный мануал из которого понятно что ничего не понятно Ж(


    1. Marat2010 Автор
      27.12.2023 07:06

      Может Вы и правы, здесь я пытался только объяснить некоторые моменты, а сам мануал на https://github.com/Marat2010/Aiogram3 в котором показан поочередный запуск команд для развертывания, вроде ничего сложного. А если не понятно, что делается в скриптах, то там есть комментарии. И я предполагаю, если человек работает с сервером VPS, то думаю элементарные команды *nix систем он знает. )


  1. Rapira2388
    27.12.2023 07:06

    Хз я контейнер докер запулил со своим ботом , порты от балды прописал и все работает.


    1. Marat2010 Автор
      27.12.2023 07:06

      Докер это хорошо, но хотелось, показать без него, чтобы показать как все работает. И при докере надо тоже понимать как он работает, как ваша сеть будет работать )


      1. volatilization
        27.12.2023 07:06

        в main.py указаны WEB_SERFVER_HOST WEB_SERVER_PORT. зачем это? ngnix же наоборот должен реверснуть эту зависимость что бы при разработке и деплое об этом не думать.


        1. Marat2010 Автор
          27.12.2023 07:06

          WEB_SERFVER_HOST WEB_SERVER_PORT - это адрес и порт на котором непосредственно запускается асинхронный сервер aiohttp, именно через него работает уже aiogram.

          При первом способе, как раз Nginx принимает запрос от телеграмм сервера и перенаправляет на локально запущенный сервер aiohttp. Я конечно не совсем понял вопрос, при разработке, в данном случае ты и не думаешь у тебя вроде как и локально запускается. А вот webhook_url и webhook_path, отправляются телеграмм серверу , чтобы он знал, куда отправлять запросы, когда кто то напишет в вашем боте.

          Надеюсь смог объяснить? )


  1. DMaaxxx
    27.12.2023 07:06
    +1

    Как вариант, можно использовать сервисы, типа sslip.io. Превратить свой ip в вид 127-0-0-1.sslip.io и спокойно получить сертификат через certbot (я использовал именно его)


    1. Marat2010 Автор
      27.12.2023 07:06

      Класс решение sslip.io, даже крутое! ) Не знал, только что быстренько глянул. Возьму на заметку, А главное простое как три копейки! Спасибо!

      Certbot, acme - дело выбора каждого )