как запустить код на питоне с гитхаба на хероку
Мега-Учебник Flask, Часть XVIII: Развертывание на Heroku
(издание 2018)
Miguel Grinberg
Туда Сюда
Это восемнадцатая часть серии Мега-учебников Flask, в которой я собираюсь развернуть микроблог на облачной платформе Heroku.
Под спойлером приведен список всех статей этой серии 2018 года.
Примечание 1: Если вы ищете старые версии данного курса, это здесь.
Примечание 2: Если вдруг Вы захотели бы выступить в поддержку моей(Мигеля) работы, или просто не имеете терпения дожидаться статьи неделю, я (Мигель Гринберг)предлагаю полную версию данного руководства(на английском языке) в виде электронной книги или видео. Для получения более подробной информации посетите learn.miguelgrinberg.com.
В предыдущей статье я показал вам «традиционный» способ размещения приложения Python, и представил вам два реальных примера развертывания на Linux-серверах. Если вы не на «ТЫ» системой Linux, то вероятно вам показалось, что объем затраченных усилий на такое развертывание был слегка больше ожидаемого, и, безусловно, должен быть более простой способ.
В этой главе я покажу вам совершенно другой подход, в котором вы полагаетесь на стороннего провайдера облачного хостинга при выполнении большинства задач администрирования, что позволяет вам больше времени работать над самим приложением.
Многие облачные хостинг-провайдеры предлагают управляемую платформу, на которой можно запускать веб-приложения. Все, что вам нужно предоставить, чтобы ваше приложение было развернуто на этих платформах, — это фактическое приложение, потому что аппаратное обеспечение, операционная система, интерпретаторы языка сценариев, база данных и т.д. управляются службой. Этот тип сервиса называется Platform as a Service или PaaS.
Звучит слишком хорошо, чтобы быть правдой, не так ли?
Я буду развертывать Microblog на Heroku, популярном облачном сервисе, который также очень удобен для приложений Python. Я выбрал Heroku не только потому, что он популярен, но и потому, что у него есть бесплатный уровень обслуживания, который позволит вам следовать за мной и выполнять полное развертывание, не тратя никаких денег.
Хостинг на Heroku
Heroku, одна из первых облачных платформ, которая появилась в июне 2007 года и изначально поддерживала только язык программирования Ruby, но на данный момент список поддерживаемых языков также включает в себя Java, Node.js, Scala, Clojure, Go, PHP и конечно Python.
Heroku предлагает вам выбрать уровень обслуживания исходя из необходимой вычислительной мощности и времени требуемой вашему приложению, так как ваша база пользователей растет вам нужно будет купить больше единиц вычислительных, которые Heroku называет «dynos».
Готовы попробовать Heroku? Давайте начнем!
Создание учетной записи Heroku
Прежде чем вы сможете завершить развертывание в Heroku, вам нужно получить учетную запись. Поэтому посетите сайт heroku.com и создайте бесплатную учетную запись. После того, как зарегестрируетесь и войдёте в Heroku, вы получите доступ к панели мониторинга, где будут перечислены все ваши приложения.
Установка Heroku CLI
Heroku предоставляет командную строку для взаимодействия с службой под названием Heroku CLI, доступной для Windows, Mac OS X и Linux. Документация содержит инструкции по установке для всех поддерживаемых платформ. Установите его в своей системе, если вы планируете развертывать приложение для тестирования службы.
Первое, что вы должны сделать после установки CLI, это войти в ваш Heroku аккаунт:
Heroku CLI попросит вас ввести свой адрес электронной почты и пароль учетной записи. Ваш аутентифицированный статус будет сохранен в последующих командах.
Настройка Git
Инструмент git является основой для развертывания приложений в Heroku, поэтому вы должны установить его в своей системе, если у вас его еще нет. Если у вас нет пакета, доступного для вашей операционной системы, вы можете посетить сайт git для загрузки установщика.
Команда git checkout выбирает конкретную точку фиксации приложения в его истории, соответствующей этой главе.
Создание приложения Heroku
Чтобы зарегистрировать новое приложение в Heroku, используйте команду apps:create из корневого каталога, передавая имя приложения в качестве единственного аргумента:
Эфемерная файловая система
Платформа Heroku отличается от других платформ развертывания тем, что в ней реализована ephemeral файловая система, работающая на виртуальной платформе. Что это значит? Это означает, что в любое время Heroku может сбросить виртуальный сервер, что приведет к возврату вашего сервера в чистое состояние. Нельзя предположить, что любые данные, которые вы сохраняете в файловой системе, будут сохраняться, и на самом деле, Heroku очень часто перерабатывает серверы.
Работа в этих условиях создает некоторые проблемы для моего приложения, которое использует несколько файлов:
В следующих разделах будут рассмотрены эти три направления.
Работа с базой данных Heroku Postgres
Чтобы решить первую проблему, я перейду на другой механизм базы данных. В главе 17 вы видели, как я использую базу данных MySQL, чтобы повысить надежность развертывания Ubuntu. У Heroku есть собственное предложение базы данных, основанное на Postgres, поэтому я собираюсь переключиться на него, чтобы избежать проблемы хранения SQLite на основе файлов.
Базы данных для приложений Heroku снабжаются одним и тем же CLI Heroku. В этом случае я собираюсь создать базу данных на бесплатном(free) уровне:
URL-адрес вновь созданной базы данных хранится в переменной среды DATABASE_UR L, которая будет доступна при запуске приложения. Это очень удобно, так как приложение уже ищет URL базы данных в этой переменной.
Ведение журнала в stdout
config.py: Опция ведения журнала в stdout.
Затем в функции фабрики приложений я могу проверить эту конфигурацию, чтобы понять, как настроить средство ведения журнала приложения:
app/__init__.py : Журнал в stdout или в файл.
Скомпилированные переводы
Третьим аспектом микроблога, основанного на локальных файлах, является скомпилированный языковой перевод файлов. Самый простой вариант, чтобы гарантировать, что эти файлы никогда не исчезнут из эфемерной файловой системы, — это добавить скомпилированные языковые файлы в репозиторий Git, чтобы они стали частью начального состояния приложения после его развертывания в Heroku.
Более элегантный вариант, на мой взгляд, заключается в том, чтобы включить команду flask translate compile в команду start up, предоставленную Heroku, так что каждый раз, когда сервер перезапустится эти файлы скомпилируются снова. Я собираюсь пойти этим путём, так как я знаю, что моя процедура запуска будет требовать более одной команды в любом случае, так как мне ещё нужно запустить миграцию базы данных. Поэтому сейчас я отложу эту проблему в сторону и вернусь к ней позже, когда напишу Procfile.
Хостинг Elasticsearch
Elasticsearch является одним из многих сервисов, которые могут быть добавлены к проекту Heroku, но в отличие от Postgres, это не услуга, предоставляемая Heroku, а третья сторона, которая сотрудничают с Heroku, чтобы обеспечить дополнения. На сегодняшний день(когда я пишу эти строки) есть три разных провайдеров комплексной службы elasticsearch.
Прежде чем настраивать Elasticsearch, имейте в виду, что Heroku требует, чтобы ваша учетная запись имела привязанную кредитную карту до установки любого стороннего дополнения, даже если вы остаетесь в пределах их бесплатных уровней. Если вы предпочитаете не предоставлять данные своей кредитки Heroku, пропустите этот раздел. Вы сможете развернуть приложение, но функция поиска не будет работать.
Из вариантов Elasticsearch, которые доступны в качестве дополнений, я решил попробовать SearchBox, который поставляется с бесплатным стартовым планом. Чтобы добавить SearchBox в свою учетную запись, вы должны выполнить следующую команду во время входа в Heroku:
Обновление Requirements
Heroku ожидает, что зависимости будут в файле requirements.txt, точно так же, как я определил в главе 15. Но для запуска приложения на Heroku мне нужно добавить две новые зависимости к этому файлу.
И gunicorn и psycopg2 нужно быть добавленным в файл requirements.txt.
Профайл
Здесь я определил команду для запуска веб-приложения как последовательность трёх команд. Сначала я запускаю обновление миграции базы данных, затем компилирую переводы языков и, наконец, запускаю сервер.
Развертывание приложения
Если вы всё же работаете с собственным репозиторием, то ваш код уже, скорее всего, находится в главной ветви, поэтому вам сначала нужно убедиться, что ваши изменения пофиксены:
После чего можно запустить развертывание следующим образом:
Независимо от того, как вы отправляете ветку, вы должны увидеть следующий вывод из Heroku:
И вот теперь приложение должно быть развернуто по URL-адресу, указанному в выходных данных команды, создавшей приложение. В моем случае URL был https://flask-microblog.herokuapp.com, так что это то, что мне нужно ввести, чтобы получить доступ к приложению.
Развертывание обновлений приложений
Чтобы развернуть новую версию приложения, вам просто нужно выполнить команду git push с новым кодом. Это повторит процесс развертывания, отключит старое развертывание и заменит его новым кодом. Команды в Procfile будут запускаться снова как часть нового развертывания, поэтому любые новые миграции или переводы базы данных будут обновляться во время процесса.
Туда Сюда
Создание и хостинг телеграм бота. От А до Я
Привет, хабрчане! Какой бы заезженной не была тема создания телеграм бота на python3, я не нашёл инструкций, где показан путь от первой строчки кода до деплоинга бота (по крайней мере все методы, что я видел, немного устарели). В этой статье я хочу показать процесс создания бота от написания BotFather-у до деплоинга бота на Heroku.
Статья получилась длинной, советую пробежаться глазами по содержанию и кликнуть по интересующему вас пункту.
P.S. Пишите если нужна статья по созданию более сложного бота, т.е. с вебхуками, БД с настройками юзеров и т.д.
BotFather
Для начала нам надо зарегистрировать нашего бота в Telegram. Для этого:
В поиске вбиваем @BotFather и переходим в диалог с Отцом Ботов.
Пишем /newbot. Указываем имя бота (то, что отображается в диалогах). Указываем его логин, по которому его можно булет найти.
P.S. Оно должно заканчиваться на Bot/bot
Вот. Нам дали API ключ и ссылку на бота. Желательно сохранить API ключ и перейти в диалог с ботом, чтобы потом не копаться в переписке с BotFather
Дальше добавим ему пару команд: пропишем /setcommands и одним сообщением, т.к. /setcommands не добавляет команды, а задаёт их с нуля, пошлём ему команды.
На этом работа с BotFather закончилась, перейдём к следующей части.
Установка и настройка pipenv. Первый запуск.
Для начала создадим файл, в котором будет основной код бота bot.py. Если бот большой, то сразу создавайте файлы, куда вы вынесете функции, классы и т.д, иначе читаемость кода стремится к нулю. Я добавлю parser.py
Установим pipenv, если его конечно ещё нет.
Установим pipenv в папку проекта.
Установим интересующие нас библиотеки. Я буду работать с PyTelegramBotAPI. Также для парсинга добавим BeautifulSoup4.
Начинаем писать код!
Открываем bot.py, импортируем библиотеки и создаём главные переменные.
Запустим бота. Посмотри наличие ошибок.
Если ошибок не появилось, то продолжим.
Хэндлеры. Отвечаем на команды и сообщения
Пришло время научить бота отвечать нам. Возможно даже сделать его ответы полезными.
Основы взаимодействия. Ответ на команды
Для взаимодействия с пользователем, т.е. для ответа на его команды и сообщения используются хэндлеры.
Начнём с самого простого: ответим на команды /start и /go
Сейчас разберёмся что это и как это работает. Передаём в message_handler параметр commands равный массиву со строками — командами, на которые он будет отвечать описанным ниже образом. (На все эти команды он ответит одинаково). Далее используем send_message, в него записываем id чата (его можно достать из message.chat.id), в который отправить сообщение и, собственно, само сообщение. Нельзя забыть написать bot.polling() в конце кода, иначе бот сразу же выключиться. Почему так мы узнаем позже.
Теперь можно запустить бота и написать ему /start или /go и он ответит.
P.S. Сообщение может быть не только строкой, а, в принципе, чем угодно.
Это json объект, хранящий информацию об отправителе, чате, и самом сообщении.
Основы взаимодействия. Ответ на текстовые сообщения.
Теперь обработаем текстовые сообщения бота. Самое важное что нам нужно знать это то, что текст сообщения храниться в message.text и то, что, чтобы обрабатывать текст в message_handler нужно передавать content_types=[‘text’].
Добавим вот такой код.
Тут мы довабили пару переменных: вынесли текст сообщения (в нижнем регистре, чтобы не было лишних проблем с теми кто пишет капсом, заборчиком и т.д.) в переменную text, вынесли message.chat.id в отдельную переменную, чтобы каждый раз не обращаться к message. Также мы построили небольшое ветвление, для ответа на определённые сообщения, а также ответ на случай непонятного боту сообщения.
Основы взаимодействия. Ответ на картинки, документы, аудио и прочие.
Для ответа на картинки, стикеры, документы, аудио и т.д. нужно всего лишь поменять content_types=[‘text’].
Рассмотрим пример с картинкой, добавив этот код.
text, audio, document, photo, sticker, video, video_note, voice, location, contact, new_chat_members, left_chat_member, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, supergroup_chat_created, channel_chat_created, migrate_to_chat_id, migrate_from_chat_id, pinned_message
Строим цепочку ответов.
Пришло время закончить с элементарными действиями и начать что-то серьёзное. Попробуем построить цепочку ответов. Для этого нам понадобиться register_next_step_handler(). Создадим простой пример, на котором и разберёмся как работает register_next_step_handler().
И так, в первой функции добавился bot.register_next_step_handler(msg, askAge), в него мы передаём сообщение, которые хотим послать, и следующий щаг, к которому перейти после ответа пользователя.
Во второй функции всё поинтересней, здесь идёт проверка ввёл ли пользователь число, и, если нет, то функция рекурсивно вызывает сама себя, с сообщением «Возраст должен быть числом, введите ещё раз.». Если пользователь ввёл всё верно, то он получает ответ.
Но, есть тут проблема. Можно повторно вызвать команду /go или /start, и начнётся бардак.
Пофиксить это несложно, добавим переменную для проверки состояния выполнения скрипта.
С построением простых цепочек мы разобрались, пойдём дальше.
Добавляем парсер в цепочку.
Для начала нужен сам парсер. Обратим внимание на то, что во вкладках «Лучшее» и «Всё подряд» есть дополнительные фильтры: сутки, неделя, месяц и ≥10, ≥25, ≥50, ≥100 соответственно.
Парсер конечно можно написать и в 1 функцию, но я разобью на 2, так будет проще читать код.
По итогу парсер возвращает нам строку с заголовками статей, основываясь на наших запросах.
Пробуем, используя полученные знания, написать бота связанного с парсером. Я решил создать отдельный класс (это скорее всего неправильный метод, но это уже относится к питону, а не к основной теме статьи), и в объекте этого класса хранить изменяемые данные.
Теория. Методы взаимодействия с ботом.
Мы используем long polling для получения данных о сообщениях от бота.
Есть же вариант использовать в корне другой метод — вебхуки. Так бот сам будет отправлять нам данные о получении сообщения и т.д. Но этот метод сложнее в настройке, и, для простого показательного бота я решил его не использовать.
Также в дополнительных материалах будут ссылки на всё, что использовалось и о чём говорилось.
Маркапы. Добавляем клавиатуры для быстрого ответа.
Наконец основной код дописан. Теперь можно передохнуть и написать маркапы. Я думаю вы неоднократно видели их, но всё же, приложу скриншот. [SCREENSHOT]
Я выведу маркапы в отдельный файл — markups.py.
В параметры маркапа указываем ширину строки и изменение размеров кнопок, иначе они огромны.
Применим полученные знания к нашему боту.
Ура! С кодом впринципе разобрались. Теперь самое важное — деплоинг бота не хероку.
Деплоим бота на Heroku.
Для начала надо зарегистрироваться на Хероку и на Гитхабе.
Теперь создаём репозиторий на гитхабе. (нажмите плюсик слева от вашего аватара)
Сейчас нам нужен Procfile (Procfile.windows для windows). Создаём его и записываем в него bot: python3 bot.py
Теперь удаляем TOKEN из bot.py, здесь он не нужен, ведь мы будем загружать этот файл на гитхаб. Через тот же терминале, что использовали для запуска бота, заливаем файлы на гитхаб. (Предворительно удалите папку __pycache__).
Гит просит логин и пароль, спокойно вводим и преступаем к деплоингу бота на хероку. Пишем всё в том же терминале.
Теперь возвращаем TOKEN в bot.py, здесь он нужен, ведь мы будем загружать этот файл на хероку.
Поздравляю!
Работа окончена, бот работает удалённо.
Ссылки
Заключение
Если кому-то было интересно, то цель написания статьи выполнена. Если кому-то хочется увидеть статью про более сложного бота (с вебхуками, подключенной БД с настройками пользователей и т.д.) — пишите.
Мега-Учебник 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, если вы еще этого не сделали, и таким образом вы будете уведомлены о моих последующих статьях.
Спасибо вам, еще раз, за то, что были лояльным читателем.