Как задеплоить бота на хероку
Перейти к содержимому

Как задеплоить бота на хероку

  • автор:

 

How to Deploy a Python Script or Bot to Heroku in 5 Minutes

Hey, did you just build a telegram bot or a discord bot or just a python script which you will like to run and make accessible? Well, you are in the right place.

In this article, I will show you how to deploy or host your python bot or script on Heroku Cloud Server.

I have recently built a Telegram Bot called Adigun — Blockchain Tutor (Github), it was built with Python and was Deployed to Heroku for public Access and after figuring out how to make my bot work, I decided to write this guide to help other developers who will want to deploy their own bot to Heroku.

Why Heroku?

Well, Heroku has one of the best cloud hosting solutions in the industry, especially in the PaaS Niche and they have a FREE plan which is more than enough for a bot or any fun projects.

I will try to make the steps as simple as possible but I will assume you are familiar with Python & Git (I am assuming your project is a git repository).

Tip: You can activate git in your project folder by running the command git init in your terminal.

Let's Get Started:

Heroku Setup

Step 1 — Install the Heroku CLI on your Computer (You can find the procedure here for all OS https://devcenter.heroku.com/articles/heroku-cli)

You can skip this step if you already have Heroku installed on your computer.

Step 2 — Go to Heroku website (heroku.com), login and create a new App; choose a meaningful name for your App.

Step 3 — Now we need to add a python build path, head over to Settings>Add Build Path>Select the Python Option

Deploying Our Script

Before you can deploy an app to Heroku, you need to add Two Important Files which are the Procfile & requirements.txt file

Procfile Setup

Open your project in your favourite code Editor or Navigate to your project directory and create a file named Procfile

Next, using any code editor like VSCode or TextEdit, open the Profile, and replace any text already prevalent with:

Tip: The lines above are designating which python script you want to be able to execute through Heroku.

Note: There should be no suffix like “.txt” at the end of your Procfile name, it's just Procfile

Requirements.txt File Setup

The requirements.txt file makes it easier for Heroku to install the correct versions of the required Python libraries (or “packages”) to run your Python code.

We are going to tell Heroku packages to install using our requirements.txt

Open Your project folder On your Command Line Interface (CLI) inside your environment use the following command:

this should automatically generate a requirements.txt file for you with all dependencies and libraries used in your App listed in the file.

Note: At this point, you can save all files, commit your changes and push your project to your Github repository.

Deploying to Heroku

Now, it is time to deploy our python bot or script to Heroku.

To do this, Open Your project folder On your Command Line Interface (CLI) inside your environment use the following command:

Setup environment variables

If your bot uses a .env file or if it relies on variables found through Python’s os.environ, you must set them as well in order for your script to work.

Just use Heroku’s config:set

this will set my TOKEN environment variable to that value.

Running the App or bot on Heroku

This is the final step! Now in order to turn on/execute our script, we have to open up our app on the Heroku Website, go to Resources, and hit edit on our worker.

— Enable both the web and worker, then save.

Note: It can take up to two minutes for the script to start running!

If your app is still not working, on your Terminal, run:

Conclusion

If you followed the simple steps in this article, you should be able to successfully deploy your Python Bot or Script to Heroku using the Command-Line and the Heroku interface.

If you liked this article please share it with your network and don't forget to follow me for more great articles and tutorials.

Деплой бота на сервере Heroku

Может кто—нибудь дать инструкцию, как развернуть бота на сервере heroku (написанном на python )? Спасибо заранее.

Pavel Durmanov's user avatar

  • Первым делом создайте Git репозиторий в папке с ботом: git init
  • Войдите в аккаунт Heroku : heroku login
  • Создайте приложение: heroku create appname —region eu

Создайте файл Procfile с содержимым: bot: python main.py

  • Если бот на веб-хуках, замените bot на web . Но на бесплатном тарифе, бот будет засыпать каждые 30 минут если не будет подключений, по этому на Heroku free лучше держать ботов на лонг-поллинге. Но проблема с засыпанием веб приложения решается с помощью http://kaffeine.herokuapp.com/.

Теперь нужно упаковать все зависимости проекта: pip freeze > requirements.txt

  • Теперь наша папка выглядит приблизительно так: Procfile main.py requirements.txt

Коммитим изменения: git add . затем git commit -m ‘commit’

Пушим на Heroku : git push heroku master

Запускаем бота: heroku ps:scale bot=1

Смотрим логи: heroku logs -t

Pavel Durmanov's user avatar

В папке с проектом должны быть такие 3 файла:

Proc

requirements.txt

+ другие модули (сгенерировать этот файл можно так: pip freeze > requirements.txt )

runtime.txt

или другая версия python

Из папки, где находится проект, запускаете такие команды:

Дополнительно рекомендую установить токен как переменную: heroku config:set TOKEN=7593654323:AAlkjHjhDZiWUD7Th4Dl_uPlkjpdorpoHGhgdsPVjQ (также можно установить переменные и на сайте Хероку) и обращаться к ней из программы

Telegram-бот на вебхуках — Java+Spring, Redis, клавиатуры и деплой на Heroku — снова для самых маленьких

Это вторая статья в моей серии «для самых маленьких» — предыдущая была посвящена «классическому» Telegram-боту, наследуемому от TelegramLongPollingBot .

Для кого написано

Если вы ни разу не писали Telegram-ботов на Java с использованием вебхуков и только начинаете разбираться — эта статья для вас. В ней подробно и с пояснениями описано создание реального бота, автоматизирующего одну конкретную функцию. Можно использовать статью как мануал для создания скелета своего бота, а потом подключить его к своей бизнес-логике.

Я пытаюсь писать как для себя, а не сразу для умных — надеюсь, кому-нибудь это поможет быстрее въехать в тему.

Предыстория

Учить словарные слова — занятие довольно скучное, а если делать это в лоб, ещё и малоэффективное, поэтому я решил разработать для дочери задания такого вида:

Ребёнок сначала выбирает правильный вариант, а затем закрепляет его написанием. По ощущениям, запоминание идёт неплохо. Дело оставалось за малым — написать бота и составить словари неправильных написаний.

Что в статье есть, чего нет

В статье есть про:

  • создание бекенда Telegram-бота на вебхуках на Java 11 с использованием Spring;
  • использование базы данных Redis;
  • отправку пользователю текстовых сообщений и файлов;
  • подключение постоянных и временных клавиатур;
  • локальный запуск бота для дебага;
  • деплой и запуск бота на Heroku, включая подключение к проекту Heroku Redis.
  • использование функций ботов, не перечисленных выше;
  • работу с Apache POI — создание Word и Excel файлов;
  • общение с BotFather (создание бота, получение его токена и формирование списка команд подробно и понятно описано во многих источниках, вот первый попавшийся мануал;
  • создание и загрузку в БД словарей по умолчанию.

Бизнес-функции бота

  • создавать Word-файлы с заданиями из имеющихся словарей (стандартных или пользовательского);
  • скачивать имеющиеся словари в Excel-файлы (для корректировки и последующей загрузки в качестве пользовательского словаря);
  • загружать пользовательский словарь;
  • выводить справку.

Порядок разработки

  • разобраться с зависимостями;
  • сконфигурировать БД;
  • создать бота;
  • реализовать обработку сообщений, включая работу с клавиатурами;
  • раскурить приём и отправку файлов;
  • завести локально;
  • задеплоить на Heroku.

Зависимости

Для управления зависимостями используем Apache Maven. Нужные зависимости — собственно Telegram Spring Boot, Redis и Lombok, использовавшийся для упрощения кода (заменяет стандартные java-методы аннотациями).

Вот что вышло в

Конфигурируем базу данных Redis

Создадим модель — классы-сущности, объекты которых должны храниться в БД. В каждом из них должны быть ключ и значение — очень похоже на привычную Map<K,V> . В нашем случае сущности всего две — словарное слово

Для сохранения объектов в БД и обращения к ним нам нужны два конвертера, переводящие объект «Слово» в массив байт (да-да, Redis нужно скормить именно его) для сохранения

… и обратно для получения объектов из БД.

С использованием конвертеров создадим файл конфигурации.

Наконец, нужно создать репозиторий. Привыкшим к Postgre (как я) будет особенно приятно узнать, что работу с Redis поддерживает набивший оскомину CrudRepositoty<T, ID> . Поскольку мы используем только его стандартные методы, оставляем репозиторий без своих методов:

К классу Word напрямую я не обращаюсь, поэтому для него репозиторий не нужен.

 

Создаём бота

Начнём с добавления в application.yaml (или application.properties , если так привычнее) настроек:

  • telegram.api-url — тут всё просто, https://api.telegram.org/ ;
  • telegram.webhook-path — адрес вебхука, который должен быть зарегистрирован в Telegram (об этом ниже, в разделе «Запускаем локально»);
  • telegram.bot-name и telegram.bot-token — имя и токен бота, полученные от BotFather.

Далее, чтобы эти настройки можно было использовать в коде, создадим небольшой

Теперь создадим класс бота и унаследуем его от SpringWebhookBot —

MessageHandler и CallbackQueryHandler — обработчики (соответственно) сообщений и нажатий на кнопки инлайн-клавиатур (подробнее ниже, в разделе «Обрабатываем сигналы»).

Методы класса направляют получаемый от пользователей сигнал в необходимый класс-обработчик в зависимости от его типа (сообщение или нажатие на кнопку инлайн-клавиатуры).

Для создания бина бота нам нужна ещё одна конфигурация:

Поскольку наш бот — это веб-приложение, для доступа к нему нам нужен контроллер:

Ну и где-то должен быть метод main(), чтобы всё это запустилось. Создадим стандартный для Spring класс:

Бот готов, осталось научить его общаться с пользователем.

Обрабатываем сигналы

Как уже говорилось, наш бот получает от пользователя сигналы двух типов — сообщения и нажатия на кнопки инлайн-клавиатур. Эти сигналы обрабатываются в классах MessageHandler и CallbackQueryHandler , а маршрутизация между ними осуществляется в классе бота WriteReadBot (его код чуть выше, в разделе «Создаём бота»).

Классы-обработчики служат связующим звеном между ботом и бизнес-логикой решаемой задачи — в зависимости от конкретного полученного значения происходит обращение к нужного методу внешнего сервиса. Код этих классов можно посмотреть в этом пакете на Github, а в статье рассмотрим только две ключевых детали — создание клавиатур и работу с файлами.

Постоянная клавиатура

Чтобы сразу было понятно, вот это она:

image

Постоянная клавиатура — это основное меню бота. Она создаётся в отдельном классе путём создания отдельных кнопок, затем их рядов и, в завершении, присвоения клавиатуре нужных признаков:

Для удобства названия кнопок можно вынести в отдельный ButtonNameEnum (на GitHub), но это необязательно — можно прописать их текстом прямо в классе.

Инициализируется клавиатура в рамках обработки команды /start (то есть при первом обращении пользователя к боту) в классе-обработчике сообщений MessageHandler . Необходимо:

Кроме того, в классе MessageHandler надо не забыть обработать текстовые сообщения, отличные от названий кнопок — наш бот в этом случае призывает пользователя воспользоваться клавиатурой.

Инлайн-клавиатуры

image

В нашем боте инлайн-клавиатуры используются для выбора пользователем словаря и отображаются в ответ на команды основного меню «Создать файл с заданиями» и «Скачать словарь». Состав кнопок отличается всего на одну позицию — при обработке команды «Скачать словарь» добавляется кнопка «Шаблон». Кроме того, если пользователь загрузил в базу данных свой словарь, при обработке обеих команд в клавиатуру добавляется кнопка «Ваш словарь».

Также, как и постоянная клавиатура, инлайн-версия формируется в отдельном классе:

В отличие от кнопок постоянных клавиатур, инлайн-кнопкам можно добавлять не только название (которое видит пользователь), но и ответное значение, которое будет отправлено при нажатие на неё.

Инициализация инлайн-клавиатуры происходит:

Отправка и получение файлов

Наш бот умеет как отправлять пользователю готовые файлы заданий и словарей, так и получать от него пользовательский словарь для загрузки в базу данных.

Отправка и загрузка файлов происходит в отдельном классе, в котором реализовано REST-взаимодействие с сервисами Telegram:

Методы этого класса используются в классах-обработчиках MessageHandler и CallbackQueryHandler .

Для отправки файла пользователю необходимо перевести его в объект класса ByteArrayResource и отправить POST-запрос на адрес вида:

https://api.telegram.org/bot<токен бота>/sendDocument?chat_id=<id чата>

При загрузке пользовательского файла в составе объекта Document приходит идентификатор файла. Чтобы скачать файл, необходимо отправить GET-запрос на адрес вида:

https://api.telegram.org/bot<токен бота>/getFile?file_id=<id файла>

Следует обратить внимание, что скачивается объект File из пакета org.telegram.telegrambots.meta.api.objects , и для последующего использования мы переводим его в привычный java.io.File .

Подключаем Heroku Redis для локального запуска

Идём на Heroku и выполняем алгоритм:

  • Зарегистрироваться (если нет аккаунта)
  • Создать проект — нажать «New»/«Create new app» в правой части экрана
  • Перейти на вкладку «Resources»
  • В разделе «Add-ons» ввести в поисковую строку «Heroku Redis», выбрать её в результатах поиска
  • Подтвердить подключение БД к проекту
  • В правом верхнем углу нажать на иконку в виде квадрата из синих точек, выбрать пункт Data, в открывшемся списке баз нажать на только что созданную. Первые несколько минут после подключения может тормозить и показывать ошибку
  • Перейти на вкладку «Settings»
  • Нажать на кнопку «View credentials» в правой части экрана
  • Вуаля, перед Вами настройки подключения к БД

spring.redis.database: 0
spring.redis.host: <хост БД Redis, копируем с Heroku>
spring.redis.port: <порт БД Redis, копируем с Heroku>
spring.redis.password: <пароль БД Redis, копируем с Heroku>
spring.redis.ssl: true

Полный application.yaml можно посмотреть ниже, в разделе «Запускаем локально».

Запускаем локально

Нам осталось сделать вебхук и зарегистрировать его в Telegram.

Для получения внешнего адреса при локальном запуске используем утилиту ngrok по вот этой инструкции. Не забываем добавить в application.yaml настройки telegram.webhook-path (выдаст ngrok) и server.port (передаётся ngrok в качестве параметра)

Вот так выглядит итоговый (для локального запуска с использованием БД Redis на Heroku)

Регистрируем вебхук в Telegram, формируя в строке браузера запрос вида:

https://api.telegram.org/bot<токен бота>/setWebhook?url=<URL, полученный от ngrok>
… видим ответ:

Деплоим на Heroku

Если используется версия Java, отличная от 8, необходимо в корне проекта создать файл system.properties , содержащий одну строку:

java.runtime.version=<версия Java, в нашем случае 11>

Ещё один специфический для Heroku файл Procfile в данном случае можно не добавлять, он будет сгенерирован автоматически на основе pom.xml .

Сначала нужно обязательно удалить/закомментировать в application.yaml настройки подключения к БД — она подцепится автоматически, поскольку подключена к проекту на Heroku. Если оставить эти настройки, ничего не заведётся, они нужны только для внешнего подключения к этой БД.

Также нужно изменить настройку webhook-path — это адрес веб-приложения на Heroku. Чтобы его получить, надо нажать на кнопку «Open app» в интерфейсе Heroku, убедиться, что приложение запустилось (должна отображаться надпись «Whitelabel Error Page» — значит, успех) и скопировать содержимое адресной строки.

Вот так должен выглядеть готовый к деплою на Heroku

  • в консоли heroku create <имя приложения> (либо heroku git:remote -a <название проекта> , если приложение на Heroku уже было создано ранее)
  • в интерфейсе Heroku создать в проекте БД Heroku Redis (если ранее это не было сделано — алгоритм выше, в разделе «Запускаем локально»)
  • в консоли mvn clean install
  • в консоли git push heroku master
  • в консоли heroku ps:scale web=1 — установить количество используемых контейнеров (dynos) для типа процесса web
  • открыть приложение — нажать на кнопку «Open app» в интерфейсе Heroku, убедиться, что оно запустилось (должна отображаться надпись «Whitelabel Error Page» — значит, успех)
  • зарегистрировать вебхук в Telegram (алгоритм выше, в разделе «Запускаем локально»), используя URL из адресной строки предыдущего пункта

При необходимости в интерфейсе Heroku на вкладке «Deploy» можно переключить деплой на GitHub-репозиторий (по запросу или автоматически).

Что можно доделать

Как известно, Heroku гасит веб-приложения, которые не используются какое-то время, поэтому на первое сообщение бот может отвечать порядка 8-10 секунд — он ждёт, когда приложение развернётся с нуля. Это позволяет на бесплатном тарифе хостить много редко используемых веб-приложений — в тарифе учитывается только время аптайма.

Чтобы заставить приложение работать постоянно, можно добавить в проект пинг по расписанию условного Google, но нужно понимать, что в этом случае бот будет съедать львиную долю бесплатного тарифа. Я жадный, я так делать не буду.

Деплоймент бота на Heroku

Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть Heroku. Сегодня я расскажу, как легко и быстро развернуть простенького бота на данной платформе.

heroku logo

Почему именно Heroku? Она была одной из первых платформ, предоставляющих услуги типа PaaS (Platform as a Service) и есть лидером в этой сфере. Используя такие облачные сервисы, разработчик должен предоставить только приложение. Обо всем остальном – серверное железо, операционная система, интерпретатор языка и база данных, позаботится сервис.

PaaS

По умолчанию, Heroku предлагает до 5 приложений на аккаунт и дает 550 бесплатных дино-часов в месяц. Если же подключить к аккаунту банковскую карту, их к-во расширится до 1000. Подробнее о фри дино-часах можно почитать здесь.

Регистрация и установка клиента Heroku

Прежде всего, для использования Heroku, нужно авторизироваться. Если у вас нет аккаунта, создайте его, перейдя по этой ссылке. Затем нужно установить Heroku Toolbelt. Эта утилита на данный момент поддерживает основные ОС: Windows, macOS и Linux.

Скачать и установить Heroku CLI на Windows или macOS можно прямо отсюда. На Ubuntu/Debian платформах вам понадобится ввести данную комманду:

После установки, чтобы убедиться, что все установилось, откройте консоль и введите heroku :

code

Если все работает, логинимся, используя данные, введенные при регистрации:

Создание приложения

Сегодня мы будем деплоить бота, написанного во второй части. Для начала создадим наше приложение под названием momentumbots :

code

Вывод команды показывает, что приложение было успешно создано и доступно на https://momentumbots.herokuapp.com .

code

Имя momentumbots уже занято мной, так что придумайте свое ��

Если же не указывать название приложения, то будет сгенерировано рандомное название:

code

Ставим Вебхуки

В прошлых частях мы писали ботов, использующих Long Polling. Суть его в том, что на сервера Телеграмма периодически приходят запросы на получение обновлений. Это ненадежно, т.к. сервера Telegram могут возвращать ошибку 504, вырубая бота. Используя же вебхуки, мы устанаваливаем URL, на который будут приходить обновления автоматически, таким образом избавляясь от этой проблемы. Вебхуки в тг работают только по HTTPS. Благо, Heroku предоставляет доступ к приложению через HTTPS и SSL-сертификат, освободжая нас от заботы о создании сертификатов.

В качестве веб-сервера будем использовать Flask, однако вам не составит труда разобраться с другими фреймворками. На Github-странице pyTelegramBotAPI, помимо Flask’а, есть примеры для aiohttp, CherryPy, CPython и Tornado.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *