Расскажу самый простой и бесплатный способ развернуть на хостинге телеграмм бота, написанного на 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 и сохраняем.
Регистрируемся на хостинге: 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 на хостинге:
Надеюсь кому-то поможет. Всем удачи! )
Комментарии (6)
UMenyaNeudobnieVoprosiki
20.04.2023 08:03Есть нормальный SSH... Через FTP поместить наш файл... ¯\(°_o)/¯
Marat2010 Автор
20.04.2023 08:03"Есть нормальный SSH..." - имеется в виду что, putty,..? терминальный клиент, разницы нет какой, у меня в linux встроенный. Два способа ... хотел сказать, что можно и через браузер зайти. По поводу "Через FTP ..." наверно Вы правы, надо было сказать "По FTP ..." ) .
aleksanderL
20.04.2023 08:03Проще бота на Яндекс облако в клауд функции бесплатно закинуть.
Вот как их же базу данных порубить yql, нигде нормальной инструкции нет. ????
Maxim_Q
20.04.2023 08:03Если кто-то раньше использовал хостин что описан в сатье https://www.alwaysdata.com/en/ скажите как у них дела с UpTime, сервера надежные или лежит по полдня?
siailya
Но с кучей ограничений (типа квоты 100Мб). И не пожизненно, а пока хостер не решит, что содержать орду бесплатных клиентов - как-то дороговато
По итогу VPS и получили :)
Сама инструкция неплохая, всё наглядно, спасибо. Но с привязкой к этому хостеру и его бесплатному тарифу годится разве что для пет-проектов и тестовых стендов
Marat2010 Автор
Все верно, для небольших своих проектов. "Пожизненно" - я написал это, только потому, что сам провайдер так это позиционирует ). Мы и про хероку думали, что бесплатно и пожизненно ). VPS? можно и так сказать, но только без рута, а то бы, запуск бота поместил через systemd. Инструкция больше сделана для быстрого развертывания, и тестов, чтобы не мучатся со сложными настройками в других системах.