heroku как запустить приложение python

Развертывание Python бота для ВКонтакте на Heroku

DiSonDS

DiSonDS

Heroku

Порядок действий:

0. Скачиваем бота

В данном примере используем этого python бота: VBot (ранее LOLBOT)

1. Регистрируемся на Heroku

2. Скачиваем Heroku CLI, Git

Heroku CLI:

3. Логинимся через терминал/cmd

4. Создаём приложение с Python билдпаком

cd %directory% — перемещение в директорию где расположен бот
%app_name% — название вашего приложения

5. Настройка приложения

Создаем необходимые файлы конфигурации:

runtime.txt
requirements.txt //уже есть в проекте бота
Procfile //без расширения

runtime.txt:

python-2.7.13 or python-3.6.0 //выбрать одно, в нашем случае python-3.6.0

requirements.txt:

//указываем необходимые модули
//каждый модуль с новой строки

Procfile:

web: %app_name%.py //исполняемый файл*, который будет получать входящий трафик от роутеров heroku worker: python %not_web_app%.py //исполняемый файл, которому не требуется входящий трафик для работы

*Этими исполняемыми файлами являются: боты, работающие на основе вебхуков, веб серверы.
Следует пояснить по поводу файла процессов (Procfile): в бесплатной версии мы можем создавать до двух процессов, по 1 на каждый тип.

В нашем случае понадобится только:

worker: python %not_web_app%.py // vbot.py

6. Загружаем бота через git

7. Запускаем бота

heroku deployheroku deploy2

Готово.

Если бот не запустился — проверьте логи

Остались вопросы? Задавайте в комментариях.

Источник

Мега-Учебник Flask, Часть 18: Развертывание на Heroku Cloud

Это восемнадцатая статья в серии, где я описываю свой опыт написания веб-приложения на Python с использованием микрофреймворка Flask.

Цель данного руководства — разработать довольно функциональное приложение-микроблог, которое я за полным отсутствием оригинальности решил назвать microblog.

В предыдущей статье мы рассмотрели вариант традиционного хостинга. Мы видели два актуальных примера хостинга на Linux серверах, сначала на обычном сервере под управлением CentOS, а затем на миникомпьютере Raspberry Pi. Те из читателей, кто не занимался администрированием Linux систем ранее, возможно, решили что это требует слишком много усилий и могло бы быть реализовано как-то проще.

Сегодня мы посмотрим, является ли развертывание «в облако» решением проблемы излишней сложности процесса.

Но что это значит «развернуть в облако»?

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

Звучит слишком хорошо, чтобы быть правдой, не так ли?

Мы рассмотрим развертывание приложения на платформе Heroku, одной из самых популярных платформ облачного хостинга. Я выбрал Heroku не только по причине её популярности, но еще и потому, что она предоставляет бесплатный уровень сервиса, так что мы развернем наше приложение не потратив при этом ни цента. Если вы хотите больше узнать об этом типе услуг, и что предлагают другие провайдеры, вы можете ознакомиться со страницей Википедии, посвященной PaaS.

Хостинг на Heroku

Heroku была одной из первых платформ, предоставляющих услуги PaaS. В начале, она предлагала услуги размещения только Ruby приложений, но позднее была включена поддержка многих других языков таких как Java, Node.js и нашего фаворита, Python.

Вообще-то для развертывания приложения на Heroku требуется лишь загрузить приложение при помощи git (вы увидите как это работает уже совсем скоро). Heroku ищет файл Procfile в корневой папке приложения для получения инструкций как приложение должно выполняться. Для Python проектов Heroku также ожидает увидеть файл requirements.txt, содержащий список необходимых сторонних пакетов.

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

Готовы испытать Heroku? Давайте начнем!

Создание аккаунта Heroku

Прежде чем размещать приложение на Heroku, нужно там зарегистрироваться. Поэтому перейдите по ссылке и создайте аккаунт.

После авторизации вы попадете в панель управления, откуда вы сможете управлять всеми своими приложениями. Мы не будем интенсивно использовать панель управления, но она предоставляет неплохой обзор вашего аккаунта.

Установка клиента Heroku

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

Heroku предлагает утилиту «Heroku клиент», которой мы будем пользоваться для создания и управления нашим приложением. Эта утилита может быть запущена под управлением Windows, Mac OS X и Linux. Если для вашей платформы доступен набор инструментов Heroku, то это самый простой способ установить клиент Heroku.

Первое, что мы сделаем при помощи клиента — войдем в наш аккаунт:

Heroku запросит у вас email и пароль от вашего аккаунта. При первой авторизации, клиент отправит ваш ssh ключ на сервера Heroku.

Последующие команды можно будет выполнять без авторизации.

Настройка Git

git представляет собой основу разворачивания приложений на Heroku, поэтому он также должен быть установлен. Если вы установили набор инструментов Heroku, то git у вас уже установлен.

Для разворачивания приложения на Heroku, оно должно присутствовать в локальном репозитарии, поэтому выполните следующие команды в консоли:

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

Для создания нового приложения Heroku, достаточно вызвать команду create из корневой папки приложения:

В дополнение к установкам URL, эта команда добавляет нашему репозитарию удаленный репозитарий (git remote), который мы вскоре используем для загрузки кода приложения в облако.

Естественно, имя flask-microblog теперь занято мной, поэтому придумайте какое-нибудь другое имя своему приложению.

Исключаем локальное хранение файлов

Некоторые функции нашего приложения сохраняют информацию в виде файлов на диске.

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

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

Наша база полнотекстового поиска Whoosh также перестанет работать, т. к. она хранит свои данные в виде файлов.

Третий проблемный момент — наша система логирования. Мы сохраняли наш лог в папке /tmp и теперь, при работе на Heroku, это тоже перестанет работать.

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

Первую проблему мы решим миграцией на базу данных, предлагаемую Heroku, которая основана на PostgreSQL.

Для функционирования полнотекстового поиска у нас нет готовой доступной альтернативы. Нам придется реализовать полнотекстовой поиск, используя функциональность PostgreSQL, но это потребует внесения изменений в наше приложение. Безусловно жаль, но решение этой проблемы сейчас увело бы нас далеко в сторону от темы статьи, поэтому для размещения на Heroku, мы просто отключим полнотекстовой поиск.

И наконец, т. к. мы не можем писать наши логи, мы добавим наши логи к системе логирования, используемой Heroku, которая, кстати, весьма проста в использовании, т. к. отправляет в лог всё, что выводится в stdout.

Создание базы данных Heroku

Для создания базы данных мы используем клиент Heroku:

Заметьте, что мы используем базу данных разработки, т. к. это единственная бесплатная опция. Для боевого сервера понадобится выбрать другую опцию базы данных.

Запрещение полнотекстового поиска

Для отключения полнотекстового поиска, наше приложение должно уметь определять запущено ли оно на Heroku или нет. Для этого мы создадим пользовательскую переменную окружения, опять же при помощи клиента Heroku:

Теперь переменная окружения HEROKU, будет установлена в 1, когда наше приложение запущено на виртуальной площадке Heroku.

Теперь отключить полнотекстовой поиск довольно просто. Для начала, добавим переменную в конфигурационный файл (файл config.py):

Затем, отменим создание базы данных полнотекстового поиска (файл app/models.py):

Также добавим информацию о полнотекстовом поиске в g в нашем обработчике before_request, чтобы наши шаблоны видели её (файл app/views.py):

И, наконец, уберем поле поиска в базовом шаблоне (файл app/templates/base.html):

Исправляем логирование

Под управлением Heroku, всё что выводится в поток stdout, тут же попадает в лог приложения Heroku. Но логи, которые пишутся в файлы на диске, будут недоступны. Так что на этой платформе мы должны отключить логирование в файлы и использовать вместо этого логгер, пишуший ошибки прямо в stdout (файл app/__init__.py):

Веб сервер

Мы знаем, что сервер разработки Flask не подходит для работы в продакшне, т. к. он однопроцессный и однопоточный, поэтому нам необходимо решение получше. Руководство Heroku для приложений на Python рекомендует gunicorn, его мы и применим.

В наше локальное окружение, gunicorn устанавливается как обычный python модуль:

Для его запуска, мы должны передать один аргумент с именем Python модуля, определяющего приложение и сам объект приложения, разделенные двоеточием.

Давайте создадим отдельный Python модуль для Heroku (файл runp-heroku.py):

Теперь, например, если мы хотим запустить сервер gunicorn локально, при помощи этого модуля, мы должны выполнить следующую команду:

Файл requirements.txt

Уже совсем скоро мы загрузим наше приложение на Heroku, но прежде мы должны сообщить серверу, какие модули необходимы нашему приложению для запуска. На нашем локальном ПК, мы управляли зависимостями при помощи виртуального окружения, устанавливая в него модули при помощи pip.

Heroku поступает похожим образом. Если файл requirements.txt обнаруживается в корневой папке приложения, то Heroku устанавливает все модули перечисленные в нем при помощи pip.

Для создания файла requirements.txt мы должны использовать опцию freeze при вызове pip:

В список необходимо добавить сервер gunicorn, а также драйвер psycopg2, который необходим SQLAlchemy для подключения к базе данных PostgreSQL. Окончательный вид файла requirements.txt будет таким:

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

Procfile

Последнее требование состоит в том, чтобы сообщить Heroku как запустить приложение. Для этого Heroku требуется файл Procfile в корневой папке приложения.

Этот файл весьма прост, он просто определяет имена процессов и команды ассоциированные с ними (файл Procfile):

Метка web ассоциируется с веб сервером. Heroku требуется это задание для запуска нашего приложения.

Другие две задачи, именуемые init и upgrade это пользовательские задачи, которые мы будем использовать для работы с нашим приложением. Задание init инициализирует наше приложение созданием базы данных и компилированием языковых файлов. Задание upgrade подобно init, но вместо создания базы данных оно обновляет базу до последней миграции.

Развертывание приложения

Теперь мы приступаем к самой интересной части, в которой мы разместим приложение в нашем Heroku аккаунте. Это довольно просто, мы просто используем git для отправки приложения:

При первоначальной загрузке приложения на Heroku, нам нужно инициализировать базу данных и файлы перевода, а для этого мы должны выполнить задание init, которое мы включили в наш Procfile:

Верите вы или нет, но наше приложение уже доступно онлайн. В моем случае, приложение доступно по адресу flask-microblog.herokuapp.com. Вы вполне можете стать моим фоловером со страницы моего профиля. Я не знаю точно, как долго приложение будет доступно по этому адресу, но вам ничто не мешает проверить доступно оно или нет!

Обновление приложения

Рано или поздно, придет время обновить наше приложение. Это будет происходить подобно начальному развертыванию. Первым делом приложение будет залито на сервер при помощи git:

Затем, выполнен скрипт обновления:

Логирование

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

Чтобы просмотреть логи, используется клиент Heroku:

Приведенная команда выведет все логи, включая логи Heroku. Чтобы просмотреть логи только вашего приложения, запустите команду:

Вещи вроде стэка вызовов и другие ошибки приложения, все будут в этом логе.

Стоит ли?

Теперь мы имеем представление о развертывании приложения на облачную платформу, и поэтому можем сравнить этот вид хостинга с традиционным вариантом хостинга.

В вопросе простоты, победа за облаками. По крайней мере для Heroku, процесс развертывания приложения был очень прост. При развертывании на выделенный сервер или VPS, нужно было выполнить много подготовительной работы. Heroku же берет заботу об этом на себя и позволяет нам сосредоточиться на нашем приложении.

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

Конец?

Обновленное приложение доступно, как всегда, на github. Или же вы можете скачать его в виде zip архива по ссылке:

С разворачиванием нашего приложения всеми возможными способами, кажется, что наш экскурс подходит к концу.

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

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

В своем блоге я продолжу писать статьи, связанные с веб разработкой и программным обеспечением вообще, т.ч. я приглашаю вас следить за мной на Twitter или Facebook, если вы еще этого не сделали, и таким образом вы будете уведомлены о моих последующих статьях.

Спасибо вам, еще раз, за то, что были лояльным читателем.

Источник

Heroku как запустить приложение python

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

Почему еще и Heroku?

У бесплатных аккаунтов Heroku есть некоторое количество преимуществ перед аналогичными аккаунтами Pythonanywhere:

Подробнее про ограниченный доступ: на Pythonanywhere можно обращаться лишь к тем сайтам, которые входят в белый список разрешенных ресурсов. Т.е. например, наш сайт, который регулярно скачивает новости с hse.ru не будет работать на Pythonanywhere, потому что hse.ru не включен в белый список. На Heroku таких ограничений нет.

Подробнее про количество бесплатных приложений: на Heroku можно создавать несколько приложений бесплатно лишь до тех пор, пока у вас есть свободные Dyno (про это будет ниже).

Подготовка к выкладыванию

В директории с вашим фласк-приложением обязательно должны быть следующие три файла:

Обратите внимание, что в этот список НЕ НУЖНО писать setuptools и pip!

Для выкладывания приложений на Heroku используется git. Поэтому если в вашей директории с проектом еще нет git-репозитория, его нужно создать. Открываем терминал (Mac, Linux) или командную строку (Windows) и пишем:

Как выложить сайт на Heroku?

Открыть терминал (Mac, Linux) или командную строку (Windows) и выполнить команды:

A dyno is a lightweight Linux container that runs a single user-specified command.

То есть ваш сайт или бот будет работать на маленьком виртуальном Линукс-«сервере». Бесплатно вам доступно 550 или 1000 таких dyno.

Если по какой-то причине сайт не заработал, то нужно посмотреть логи:

Когда вы меняете что-то в вашей программе\директории, то изменения нужно отправить на Heroku:

Поскольку мы отправляем все файлы на Heroku через git, возникает небольшая проблема:

Для работы с секретами рекомендуется использовать переменные среды: ваши ключи будут храниться в текстовых переменных вашей системы и в вашем Heroku-приложении, но при этом они никогда не попадут в открытый git-репозиторий.

Вместо этого, можно установить переменную среды прямо в терминале\командной строке:

После этого и на вашем компьютере, и в облачном хостинге Heroku переменную среды можно прочитать с помощью питона:

То есть строчку from conf import * вам придется заменить на строчки вида:

Кроме того, старые вебхуки с адресом на pythonanywhere уже не действительны, и их надо заменить на адрес вашего приложения. В целом, код очень простого бота из первого конспекта по телеграму, адаптированный под Heroku, будет выглядеть вот так:

Как запустить что-то по расписанию?

Если вы делаете какой-то веб-сервис, который должен обновлять какие-то данные через определённые промежутки времени (например, каждый день в 12:00 или каждый четверг в 17:25), то вы можете настроить стандартную Unix-утилиту cron, которая умеет запускать на сервере какой-то нужный пользователю процесс в тот момент, когда это ему необходимо.

Есть и другой консольный редактор, nano, он проще и все команды, которые вы должны выполнить для тех или иных действий, постоянно показываются внизу экрана («крышечка» означает «Ctrl»):

nano editor window

Однако он не установлен по умолчанию во всех дистрибутивах, и, возможно, его придётся установить самостоятельно.

Примеры расписания в cron:

Обратите внимание, что к программам нужно писать полный путь, потому что cron ничего не знает про то, какую директорию вы считаете рабочей.

Тут можно найти ещё одно руководство по запуску бота на хероку.

Источник

Создание и развертывание ретранслятора Telegram каналов, используя Python и Heroku

В данной инструкции построим Python приложение для зеркалирования сообщений из Telegram каналов и развернем его на облачной платформе Heroku.

Идея проста — получить сообщение и тут же переотправить или переслать его.

Ввиду ограниченности Bot API, нет возможности добавить бота в канал, где вы не администратор. Поэтому будем использовать клиентский API, заходя на нужные каналы вручную (хотя и этот шаг можно автоматизировать).

По ходу действий нам понадобятся:

Для работы с клиентским API необходимо создать приложение Telegram. Сделать это можно по ссылке. Здесь нас интересуют два значения: api_id и api_hash.

Полученные значения api_id и api_hash занесем во вновь созданный файл переменных окружения .env:

Создадим папку проекта. Все последующие действия будем делать в ней.

Настроим виртуальное Python окружение для изоляции приложения от других глобальных зависимостей системы:

Активируем виртуальное окружение:

Последующая установка новых Python пакетов будет производиться в данном виртуальной окружении.

В качестве библиотеки для взаимодействия с Telegram API будем использовать Telethon:

Для загрузки значений переменных окружения установим пакет python-dotenv:

Создадим файл config.py, где будем хранить и загружать переменные окружения в память приложения:

Скрипт авторизации, целью которого является получение идентификатора сессии, выглядит следующим образом:

После ввода номера телефона и кода, пришедшего в приложение Telegram, получаем заветный идентификатор сессии, который добавим в файл .env.

Теперь, используя вновь полученный идентификатор сессии, авторизуемся для дальнейшего взаимодействия с Telegram API:

Присоединившись к каналу, серверы Telegram начинают слать нам соответствующие обновления (новые сообщения, отредактированные сообщения и др.). Остается лишь перенаправить их в наш канал.

Определим идентификаторы канала-источника (SOURCE_CHANNEL) и канала-приемника (TARGET_CHANNEL):

Следуя примеру из документации, добавим обработчик новых сообщений:

Для каждого нового сообщения в функцию handler_new_message приходит объект типа NewMessage, содержащий поле message с необходимой нам информацией. Т.к. нам необходимы обновления только от определенных каналов, при определении обработчика передадим ему параметр chats, содержащий идентификатор либо список идентификаторов каналов.

Для успешной отправки сообщений в Telegram канал необходимо, чтобы аккаунт, которым авторизовались в приложении, имел на это соответствующие права.

В случае переотправки пришедших сообщений (использование метода client.send_message), при отредактированном сообщении в канале-источнике, можем отредактировать его и в канале-приемнике.

Для реализации редактирования необходимо знать какое именно сообщение редактировать, поэтому при добавлении нового сообщения, нужно сохранить идентификаторы исходного и копии сообщения. В дальнейшем по идентификатору сообщения из источника сможем определить идентификатор сообщения в нашем канале.

Установим базу данных Postgres, если этого не было сделано ранее. Сама установка не должна вызвать сложностей:

Далее первоначальное взаимодействие с базой будем производить с помощью утилиты psql:

Для хранения соответствий идентификаторов определим простейшую таблицу BINDING_ID:

Создадим таблицу BINDING_ID в консоли утилиты psql командой:

Взаимодействие с базой данных будем производить с помощью пакета psycopg2:

В файл .env добавим строку подключения к базе данных вида:

В случае развертывания на Heroku и использования Postgresql дополнения, для приложения в облаке переменная окружения DATABASE_URL устанавливается автоматически. Поэтому при развертывании в облаке DATABASE_URL устанавливать не нужно.

Для работы с базой данных определим следующие базовые функции: добавление соответствия идентификаторов сообщений (insert) и поиск идентификатора сообщения-клона по идентификатору оригинального сообщения (find_by_id):

В функцию обработчика новых сообщений добавим сохранение идентификаторов сообщений в базе данных:

Тогда редактирование сообщений будет выглядеть следующим образом:

Ознакомиться с текущим вариантом проекта можно по ссылке ниже:

Для случая зеркалирования «один к одному» у нас все готово и можно переходить к развертыванию.

Когда каналов-источников и каналов, в которые необходимо пересылать сообщения, больше чем один, необходимо задать их взаимное соответствие.

Задавать карту соответствий прямо в коде — не вариант, поэтому для значения новой переменной окружения (CHANNELS_MAPPING) введем специальный формат записи:

Теперь вместо ранее заданных переменных SOURCE_CHANNEL и TARGET_CHANNEL имеем CHANNELS_MAPPING:

Для дальнейшей работы из строкового значения CHANNELS_MAPPING нужно получить представление в виде словаря (dict). Сделать это можно, разобрав строку по составляющим ее элементам с помощью регулярных выражений (модуль re) либо с помощью парсера грамматик (модуль pyparsing). В данном случае воспользуемся вторым вариантом.

Установим модуль pyparsing:

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

Подробнее о модуле pyparsing можно узнать в документации.

После составления грамматики, формируем результат разбора строки в виде словаря, где ключи — исходные каналы, значения — список целевых каналов (функция parse_string):

Инициализация переменной CHANNELS_MAPPING:

Расширим таблицу BINDING_ID двумя столбцами: идентификатор канала-зеркала (mirror_channel_id) и идентификатор канала-источника (channel_id):

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • heroes of might and magic 6 ошибка при запуске приложения 0xc0000906
  • heroes of might and magic 6 не удалось запустить приложение поскольку