Расскажу самый простой и бесплатный способ развернуть на хостинге телеграмм бота, написанного на aiogram и перевести на webhook. Посмотреть видео версию, которую я выложил, можно на YouTube.

Бот будет работать 24/7 пожизненно.

Без использования VPS, веб-фреймворка django, flask, fastapi,.., pythonanywhere и heroku.

Краткое содержание действий:

Пункт 1. Сохранить пример к себе, регистрация на хостинге.

Пункт 2. Через FTP поместить наш файл бота на хостинге.

Пункт 3. Через SSH установить библиотеку aiogram.

Пункт 4. Настроить сервис бота на хостинге.

Пункт 5. Настроить веб-сайт на переадресацию всех запросов на сервис бота.

Пункт 6. Отредактировать файл запуска бота с учетом наших настроек.

Пункт 7. Перезапуск сервиса бота, проверка бота. Просмотр логов.

_________________________________________________________

Пункт 1. Сохранить пример к себе, регистрация на хостинге.

Идем на страницу официальной документации Aiogram:

https://docs.aiogram.dev/en/latest/examples/webhook_example.html

Копируем содержимое webhook_example.py к себе в файл webhook.py и сохраняем.

рис.. 1
рис.. 1

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

рис. 2
рис. 2

После регистрации, в панели управления, жмем слева в разделе «WEB» → «Sites». Справа увидим наш сайт с доменным именем 3-его уровня.

У меня «rupyt.alwaysdata.net», где rupyt — имя которое я давал при регистрации, у Вас будет своё.

прим. Везде где будет написано «rupyt», меняем на своё имя.

рис. 3
рис. 3

Пункт 2. Через FTP поместить наш файл бота на хостинге.

Подключаемся по FTP к хостингу любым вашим FTP-клиентом.

Строка для подключения ftp://rupyt@ftp-rupyt.alwaysdata.net для меня.

рис. 4
рис. 4

Еще раз напомню, вместо rupyt, ставим свое имя, которое вы указывали при регистрации.

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

рис. 5
рис. 5

После подключения попадаем в домашнюю папку.

В ней имеется папка «www» для веб-сайтов.

Заходим в нее, создаём папку «bot»

Копируем наш пример webhook.py на хостинг в эту папку:

рис. 6
рис. 6

Пункт 3. Через SSH установить библиотеку aiogram.

Для подключения по SSH, необходимо настроить доступ для него.

Идем в панель управления «Remote access» → «SSH», жмем на «шестеренку» справа, для редактирования:

рис. 7
рис. 7

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

рис. 8
рис. 8

Подключиться можно двумя способами.

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

рис. 9
рис. 9

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

рис. 10
рис. 10

Вводим логин (у меня rupyt) и пароль.

Здесь можно посмотреть домашний каталог (команда pwd), перейти в каталог «www/bot» и файл «webhook.py», который мы скопировали по FTP.

Установим «Aiogram», набрав «pip install aiogram».

Посмотреть установленные библиотеки можно командой «pip freeze».

рис. 11
рис. 11

Пункт 4. Настроить сервис бота на хостинге.

Идем в панель управления «Advanced» → «Services», жмем на «+Add a service»:

рис. 12
рис. 12

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

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».

рис. 13
рис. 13

6. Сохраняемся, жмем «Submit»

Пункт 5. Настроить сайт на переадресацию всех запросов на сервис бота.

Идем в панель управления «Web» → «Sites», жмем на шестеренку «Edit» для редактирования нашего сайта:

рис. 14
рис. 14

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

рис. 16
рис. 16

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/:

рис. 15
рис. 15

5. В «Forwarding type*» выбираем тип: «transparent(reverse proxy)».

6. Ставим галочку на «Append request path» для того, что бы пути передавались в адрес назначения, то есть в сервис бота.

7. В «Annotation» дадим любое описания, я дал «Redirect For Bot».

8. Идем во вкладку «SSL» и ставим галочку для HTTPS «Force HTTPS usage»:

рис. 17
рис. 17

Сохраняемся, жмем «Submit»

Пункт 6. Отредактировать файл запуска бота с учетом наших настроек.

На хостинге через FTP, откроем наш скопированный файл «webhook.py» и отредактируем.

рис. 18
рис. 18

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»:

рис. 19
рис. 19

Запускаем телеграмм клиента, и введем что-нибудь. Видим что бот отвечает «эхом». Ура!

Можно посмотреть логи для сайта или сервиса.

Для сервиса идем в панель управления «Advanced» → «Services», жмем на «Logs»:

рис. 20
рис. 20

В логах видим:

- запуск сервиса на IPv6 «::» и порту 8350

- команду запуска, которую указали для сервиса.

- имя бота и удачный запуск его.

- POST запрос по path «/bot/», c удачным status_code = 200.

Настройка закончена !!!

Для перевода своего бота с polling-ом на вебхук, достаточно скопировать хендлеры функции в наш файл webhook.py на хостинге:

рис. 21
рис. 21

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

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


  1. siailya
    20.04.2023 08:03
    +1

    Бот будет работать 24/7 пожизненно

    Но с кучей ограничений (типа квоты 100Мб). И не пожизненно, а пока хостер не решит, что содержать орду бесплатных клиентов - как-то дороговато

    Без использования VPS

    По итогу VPS и получили :)

    Сама инструкция неплохая, всё наглядно, спасибо. Но с привязкой к этому хостеру и его бесплатному тарифу годится разве что для пет-проектов и тестовых стендов


    1. Marat2010 Автор
      20.04.2023 08:03

      Все верно, для небольших своих проектов. "Пожизненно" - я написал это, только потому, что сам провайдер так это позиционирует ). Мы и про хероку думали, что бесплатно и пожизненно ). VPS? можно и так сказать, но только без рута, а то бы, запуск бота поместил через systemd. Инструкция больше сделана для быстрого развертывания, и тестов, чтобы не мучатся со сложными настройками в других системах.


  1. UMenyaNeudobnieVoprosiki
    20.04.2023 08:03

    Есть нормальный SSH... Через FTP поместить наш файл... ¯\(°_o)/¯


    1. Marat2010 Автор
      20.04.2023 08:03

      "Есть нормальный SSH..." - имеется в виду что, putty,..? терминальный клиент, разницы нет какой, у меня в linux встроенный. Два способа ... хотел сказать, что можно и через браузер зайти. По поводу "Через FTP ..." наверно Вы правы, надо было сказать "По FTP ..." ) .


  1. aleksanderL
    20.04.2023 08:03

    Проще бота на Яндекс облако в клауд функции бесплатно закинуть.

    Вот как их же базу данных порубить yql, нигде нормальной инструкции нет. ????


  1. Maxim_Q
    20.04.2023 08:03

    Если кто-то раньше использовал хостин что описан в сатье https://www.alwaysdata.com/en/ скажите как у них дела с UpTime, сервера надежные или лежит по полдня?