Простой способ развернуть телеграмм бота с Aiogram + Webhook на хостинг
_________________________________________________________
Пункт 1. Сохранить пример к себе, регистрация на хостинге.
Идем на страницу официальной документации Aiogram:
https://docs.aiogram.dev/en/latest/examples/webhook_example.html
Копируем содержимое webhook_example.py к себе в файл webhook.py и сохраняем.

Регистрируемся на хостинге: https://www.alwaysdata.com/ на бесплатном тарифе «Free for life».

После регистрации, в панели управления, жмем слева в разделе «WEB» → «Sites». Справа увидим наш сайт с доменным именем 3-его уровня.
У меня «rupyt.alwaysdata.net», где rupyt — имя которое я давал при регистрации, у Вас будет своё.
прим. Везде где будет написано «rupyt», меняем на своё имя.

Пункт 2. Через FTP поместить наш файл бота на хостинге.
Подключаемся по FTP к хостингу любым вашим FTP-клиентом.
Строка для подключения ftp://rupyt@ftp-rupyt.alwaysdata.net для меня.

Еще раз напомню, вместо rupyt, ставим свое имя, которое вы указывали при регистрации.
Адрес хоста для подключения можно посмотреть, если нажать в панели управления хостингом, слева «Remote access» → «FTP»:

После подключения попадаем в домашнюю папку.
В ней имеется папка «www» для веб-сайтов.
Заходим в нее, создаём папку «bot»
Копируем наш пример webhook.py на хостинг в эту папку:

Пункт 3. Через SSH установить библиотеку aiogram.
Для подключения по SSH, необходимо настроить доступ для него.
Идем в панель управления «Remote access» → «SSH», жмем на «шестеренку» справа, для редактирования:

Ставим галку на «Enable password login» для входа по паролю. Сохраняемся, жмем «Submit»:

Подключиться можно двумя способами.
Первый способ через терминал введя: «ssh rupyt@ssh-rupyt.alwaysdata.net».

Второй способ прямо в браузере, нажав на «(also Web accessible)».

Вводим логин (у меня rupyt) и пароль.
Здесь можно посмотреть домашний каталог (команда pwd), перейти в каталог «www/bot» и файл «webhook.py», который мы скопировали по FTP.
Установим «Aiogram», набрав «pip install aiogram».
Посмотреть установленные библиотеки можно командой «pip freeze».

Пункт 4. Настроить сервис бота на хостинге.
Идем в панель управления «Advanced» → «Services», жмем на «+Add a service»:

Попадаем в настройки.
1. SSH user — не трогаем.
2. В «Command» пишем команду запуска файла бота нашего примера «webhook.py»:
«python /home/rupyt/www/bot/webhook.py»
3. В «Environment» запишем токен телеграм бота, без кавычек TG_TOKEN=62671….
4. В «Working directory» укажем путь где лежит наш файл «webhook.py»:
«/home/rupyt/www/bot/»
5. В «Annotation» дадим любое названия для сервиса, я дал «Aiogram Webhook service».

6. Сохраняемся, жмем «Submit»
Пункт 5. Настроить сайт на переадресацию всех запросов на сервис бота.
Идем в панель управления «Web» → «Sites», жмем на шестеренку «Edit» для редактирования нашего сайта:

1. Попадаем в настройки «CONFIGURATION».

2. «Addresses» - не трогаем, это и есть Ваш адрес веб-сайта. У меня «rupyt.alwaysdata.net».
3. В «Configuration» «Type*» выбираем «Redirect».
4. В «Destination URL*» прописываем адрес на котором работает наш сервис бота.
У меня «http://services-rupyt.alwaysdata.net:8350».
Где «services» - означает, что это сервис, «rupyt» - мое имя, «8350» - порт который необходимо выбрать из диапазона 8300-8499, как сказано в документации.
Формат записи можно увидеть в документации https://help.alwaysdata.com/en/services/:

5. В «Forwarding type*» выбираем тип: «transparent(reverse proxy)».
6. Ставим галочку на «Append request path» для того, что бы пути передавались в адрес назначения, то есть в сервис бота.
7. В «Annotation» дадим любое описания, я дал «Redirect For Bot».
8. Идем во вкладку «SSL» и ставим галочку для HTTPS «Force HTTPS usage»:

Сохраняемся, жмем «Submit»
Пункт 6. Отредактировать файл запуска бота с учетом наших настроек.
На хостинге через FTP, откроем наш скопированный файл «webhook.py» и отредактируем.

1. Импортируем модуль «OS» для загрузки токена через окружения.
2. Укажем загрузку токена через окружения «API_TOKEN = os.environ['TG_TOKEN']», который мы сохраняли в настройках сервиса , смотри Рис.13.
3. Для WEBHOOK_HOST укажем наш адрес вебсайта:
« WEBHOOK_HOST = 'https://rupyt.alwaysdata.net/' »
4. Путь я указал «WEBHOOK_PATH = '/bot/'», можно оставить пустым в кавычках ''.
5. WEBAPP_HOST = '::' , указываем два двоеточия, как сказано в документации (Смотри Рис. 15.), что сервис может быть запущен, только на IP версии 6.
6. WEBAPP_PORT = 8350 , выбрали из диапазона 8300-8499, указали в настройках «Sites» смотри Рис. 16.
Сохраним наш файл.
Пункт 7. Перезапуск сервиса бота, проверка бота. Просмотр логов.
Идем в панель управления «Advanced» → «Services», жмем на «Restart»:

Запускаем телеграмм клиента, и введем что-нибудь. Видим что бот отвечает «эхом». Ура!
Можно посмотреть логи для сайта или сервиса.
Для сервиса идем в панель управления «Advanced» → «Services», жмем на «Logs»:

В логах видим:
- запуск сервиса на IPv6 «::» и порту 8350
- команду запуска, которую указали для сервиса.
- имя бота и удачный запуск его.
- POST запрос по path «/bot/», c удачным status_code = 200.
Настройка закончена !!!
Для перевода своего бота с polling-ом на вебхук, достаточно скопировать хендлеры функции в наш файл webhook.py на хостинге:

Надеюсь кому-то поможет. Всем удачи! )
Источник: https://habr.com/ru/articles/730310/