Heroku как запустить приложение python
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents Loading
Copy raw contents
Copy raw contents
Мы с вами научились выкладывать наши сайты и ботов на Pythonanywhere, но это не единственный вариант. Существуют другие подобные сервисы - Heroku, Scalingo, Openshift.
Все они являются PaaS - Platform-as-a-Service, которые позволяют вам очень просто пользоваться облачным хостингом и быстро выкладывать свои приложения вместо того, чтобы самостоятельно настраивать сервер.
От Pythonanywhere они отличаются тем, что для них разработчиками не всегда предоставлен такой же удобный веб-интерфейс, в котором многое делается кнопочками в панели управления, и нужный функционал мы получем через командную строку Unix. Но ощее с Pythonanywhere у них то, что там есть возможность делать хотя бы что-то из того, что вам нужно, бесплатно.
Дело в том, что вслед за компанией Amazon многие другие IT-компании стали предоставлять пользователям (в числе которых и частные лица, и компании поменьше) облачные сервисы, то есть возможность не содержать на свои средства большой парк серверов (это часто неудобно, потому что бесперебойную работу серверов обеспечить не так просто), а покупать место на мощных серверах, которые содержит хозяин облака. Основные конкурирующие на этом поле сервисы -- это Amazon Web Services, Google Cloud и Microsoft Azure. Все они платные (Google предоставляет на своей платформе условно-бесплатный тестовый период в один месяц), но мощные и надёжные.
Почему еще и Heroku?
Pythonanywhere | Heroku |
---|---|
только одно приложение | несколько приложений |
свой домен - платная функция | позволяет использовать собственное доменое имя |
ограниченный доступ к внешним ресурсам | доступ к внешним ресурсам не ограничен |
Подробнее про количество бесплатных приложений: на Heroku можно создавать несколько приложений бесплатно лишь до тех пор, пока у вас есть свободные Dyno (про это будет ниже).
Подготовка к выкладыванию
- Чтобы наш фласк-сайт или фласк-бот заработал на Heroku, нужно убедиться, что в конце основной программы написан вот такой код:
В директории с вашим фласк-приложением обязательно должны быть следующие три файла:
requirements.txt - в этом файле нужно перечислить все не стандартные питоновские модули, которые необходимы для вашей программы. В списке нужно указать не только название модуля, но и нужную вам версию. Выглядеть это будет примерно так:
Обратите внимание, что в этот список НЕ НУЖНО писать setuptools и pip!
Когда вы будете выкладывать приложение, Heroku прочитает файл requirements.txt и установит все перечисленные модули командой pip install -r requirements.txt .
runtime.txt - в этом файле нужно написать одну строчку:
Если в директории нет runtime.txt , то Heroku будет по умолчанию думать, что ваше приложение написано на Python 2.7.
Procfile - обратите внимание, что у файла нет расширения, иначе heroku не сможет прочитать его содержимое. В этом файле нужно написать одну строчку:
Для выкладывания приложений на Heroku используется git. Поэтому если в вашей директории с проектом еще нет git-репозитория, его нужно создать. Открываем терминал (Mac, Linux) или командную строку (Windows) и пишем:
- cd путь-к-директории - переходим в директорию с нашим фласк-проектом,
- git init - создаем в текущей директории репозиторий,
- git add * - говорим гиту следить за всеми файлами в репозитории,
- git commit -m 'Initial commit' - делаем первый коммит.
Как выложить сайт на Heroku?
Зарегистрироваться на сайте Heroku, ваш email будет логином. Когда вы зарегистрировались, вы попадаете в Dashboard. Сейчас у вас там ничего нет - вам предлагают создать приложение (an app) или пройти туториал по работе с Heroku и выбранного вами языка программирования. Туториал по питону там ориентирован на джанго, мы работаем с фласком, так что наши действия будут слегка отличаться.
Открыть терминал (Mac, Linux) или командную строку (Windows) и выполнить команды:
- cd путь-к-директории - переходим в директорию с нашим фласк-проектом,
- heroku login - логинимся в наш аккаунт Heroku,
- ввести свой емейл и пароль, с которыми мы зарегистрировались,
- heroku create - создаем приложение, которое поможет Heroku получить наш код и запустить его. В этот момент Heroku делает сразу несколько вещей.
Во-вторых, к вашему репозиторию добавляется удаленный репозиторий (git remote), который называется heroku . У одного локального репозитория на вашем компьютере может быть несколько удаленных (например, у вас может быть origin - это ваш удаленный репозиторий на GitHub, и heroku - удаленный репозиторий на Heroku.)
git push heroku master - эта команда отправляет наш код на облачный хостринг, и Heroku устанавливает нужные модули.
heroku ps:scale web=1 - эта команда говорит запустить наш фласк-сайт на одном dyno.
A dyno is a lightweight Linux container that runs a single user-specified command.
То есть ваш сайт или бот будет работать на маленьком виртуальном Линукс-"сервере". Бесплатно вам доступно 550 или 1000 таких dyno.
heroku open - эта команда открывает ваш сайт в браузере. Ура! Все готово!
Если по какой-то причине сайт не заработал, то нужно посмотреть логи:
Поскольку мы отправляем все файлы на Heroku через git, возникает небольшая проблема:
Для работы с секретами рекомендуется использовать переменные среды: ваши ключи будут храниться в текстовых переменных вашей системы и в вашем Heroku-приложении, но при этом они никогда не попадут в открытый git-репозиторий.
Раньше мы с вами писали секретные ключи в игнорируемый файл (например, TOKEN = ". " внутри conf.py ) и импортировали секретные переменные с помощью from conf import * .
Вместо этого, можно установить переменную среды прямо в терминале\командной строке:
- Mac, Linux - export SOME_SECRET_KEY=1c3-cr3am-15-yummy
- Windows - set SOME_SECRET_KEY 1c3-cr3am-15-yummy (если у вас Windows 10, то setx )
- Heroku - heroku config:set SOME_SECRET_KEY=1c3-cr3am-15-yummy
После этого и на вашем компьютере, и в облачном хостинге Heroku переменную среды можно прочитать с помощью питона:
То есть строчку from conf import * вам придется заменить на строчки вида:
Кроме того, старые вебхуки с адресом на pythonanywhere уже не действительны, и их надо заменить на адрес вашего приложения. В целом, код очень простого бота из первого конспекта по телеграму, адаптированный под Heroku, будет выглядеть вот так:
Как запустить что-то по расписанию?
Если вы делаете какой-то веб-сервис, который должен обновлять какие-то данные через определённые промежутки времени (например, каждый день в 12:00 или каждый четверг в 17:25), то вы можете настроить стандартную Unix-утилиту cron, которая умеет запускать на сервере какой-то нужный пользователю процесс в тот момент, когда это ему необходимо.
Есть и другой консольный редактор, nano, он проще и все команды, которые вы должны выполнить для тех или иных действий, постоянно показываются внизу экрана ("крышечка" означает "Ctrl"):
Однако он не установлен по умолчанию во всех дистрибутивах, и, возможно, его придётся установить самостоятельно.
Создать или отредактировать расписание можно вызовом команды crontab -e . В открывшемся окне нужно будет описать в формате cron, что вы хотите, чтобы было сделано, и когда это должно быть сделано. Формат cron подразумевает, что вы напишете минута час день_месяца месяц день_недели команда , а потом -- то, что должно будет запуститься, в том виде, в котором бы вы сами это запускали вручную в командной строке.
Примеры расписания в cron:
Обратите внимание, что к программам нужно писать полный путь, потому что cron ничего не знает про то, какую директорию вы считаете рабочей.
В моем предыдущем посте я на высоком уровне описал, как я разработал API с использованием Flask. Я кратко рассказал о том, как я провел его через Heroku. В этом посте я собираюсь углубиться и показать вам, как шаг за шагом развернуть API в Heroku.
Давайте начнем
После разработки приложения на вашем локальном компьютере у вас всегда есть желание поделиться им с другими далеко, но… вы не будете носить свой компьютер и идти показывать им. Таким образом, вам нужно будет разместить его в Интернете, чтобы вы предоставили им общедоступный URL-адрес, где они могут просматривать вашу работу или продукт.
Heroku-это платформа как услуга(PaaS), которая абстрагирует нас от работы с серверами, все, что нам нужно сделать, это зарегистрироваться, загрузить несколько инструментов, а затем легко загрузить наш код на платформу.
Прежде чем мы продолжим, пожалуйста, убедитесь, что у вас есть базовые знания о Git, о том, как он работает, а также о том, как использовать терминал (командная строка).
Heroku CLI
Вам необходимо загрузить CLI Heroku, который позволит нам развертывать наше приложение и управлять им.
После установки войдите в Cli Heroku, выполнив эту команду в терминале.
Вам будет предложено ввести свой адрес электронной почты и пароль. Вы войдете в систему только в том случае, если эти данные соответствуют учетным данным, с которыми вы зарегистрировались на платформе Heroku.
Приложение
Мы собираемся развернуть приложение API , которое я разработал и о котором писал в этом посте , хотя вы можете следить за своим собственным приложением.
У меня есть код приложения, размещенный здесь в моей учетной записи Github. Следуйте за мной, если у вас нет приложения для использования.
Давайте начнем с клонирования приложения. Откройте терминал и вставьте эту команду, чтобы клонировать приложение. Мягкое напоминание о том, что этот шаг будет работать только в том случае, если на вашем компьютере установлен Git.
Откройте папку bucket_api_heroku с помощью вашего любимого текстового редактора или IDE. Создайте виртуальную среду и установите зависимости, запустив.
Примечание: если вы используете свое собственное приложение, убедитесь, что вы добавили requirements.txt файл при запуске |/pip freeze > requirements.txt так, чтобы были добавлены все зависимости приложений.
Добавление файла Procfile
Для того, чтобы мы могли успешно развернуть любое приложение в Heroku, мы должны добавить Профиль в это приложение.
Прежде чем мы сможем добавить профиль, нам нужно сначала установить веб-сервер под названием Gunicorn . Выполните следующую команду в папке приложения.
Обновите файл требований, выполнив
Создайте новый файл с именем Proc file и не добавляйте никаких расширений. Добавьте эту строку ниже
web используется Heroku для запуска веб-сервера для приложения. app:app указывает имя модуля и приложения. В нашем приложении у нас есть модуль приложения, и наше приложение для колбы также называется приложением. Если ваши другие, вы можете их изменить.
Развертывание
Теперь мы готовы к развертыванию нашего приложения. В папке приложения выполните
Выходные данные этой команды будут аналогичны приведенным ниже. Обратите внимание на URL-адрес приложения, потому что именно там находится ваше приложение.
Теперь перейдите по URL-адресу приложения, чтобы просмотреть документацию API приложения в качестве домашней страницы.
База данных
Как вы, возможно, уже знаете, нашему приложению нужна база данных для сохранения данных. Он использует базу данных Postgresql для сохранения этих данных.
Heroku достаточно умен, чтобы сканировать код нашего приложения и назначить ему базу данных Postgres. Если вы посмотрите на панель мониторинга приложения Heroku в разделе обзор , вы увидите настроенное дополнение под названием Heroku Postgres, как показано ниже.
Обзор панели мониторинга
Пока не очень волнуйтесь, нам все еще нужно заполнить базу данных нашими таблицами. Для этого мы добавим еще одну строку в наш Профиль .
Команда обновление бд из manage.py файл заполняет схему таблицы из базы данных миграция файла в базу данных.
Зафиксируйте изменения и переместите их в репозиторий Heroku master git или клонируйте и используйте этот репозиторий .
Тестирование приложения
Теперь мы можем, наконец, протестировать наше приложение live API. Перейдите на домашнюю страницу приложения и нажмите на Зарегистрировать пользователя в разделе ссылки. Затем нажмите кнопку переключиться на консоль выбрать производство , чтобы данные, которые мы отправляем, могли сохраняться в базе данных. Нажмите на body , чтобы отобразить пример данных электронной почты и пароля.
Документация по API и консоль
А 201 код возвращается при успешном создании пользователя, как показано ниже.
Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть Heroku. Сегодня я расскажу, как легко и быстро развернуть простенького бота на данной платформе.
По умолчанию, Heroku предлагает до 5 приложений на аккаунт и дает 550 бесплатных дино-часов в месяц. Если же подключить к аккаунту банковскую карту, их к-во расширится до 1000. Подробнее о фри дино-часах можно почитать здесь.
Прежде всего, для использования Heroku, нужно авторизироваться. Если у вас нет аккаунта, создайте его, перейдя по этой ссылке. Затем нужно установить Heroku Toolbelt. Эта утилита на данный момент поддерживает основные ОС: Windows, macOS и Linux.
После установки, чтобы убедиться, что все установилось, откройте консоль и введите heroku :
Если все работает, логинимся, используя данные, введенные при регистрации:
Создание приложения
Сегодня мы будем деплоить бота, написанного во второй части. Для начала создадим наше приложение под названием momentumbots :
Имя momentumbots уже занято мной, так что придумайте свое 🙂
Если же не указывать название приложения, то будет сгенерировано рандомное название:
Ставим Вебхуки
В данном уроке мы начнем создание веб-приложения на Flask, которое вычисляет частоту словесных пар на основе текста из предоставленной веб-страницы. Это будет первая часть подробного руководства по созданию веб-сайта на Flask.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Если вам нужен исходный код приложения из статьи, можете скачать его с репозитория.
Содержание статьи
Настройка проекта на Flask
Для основной настройки проекта, вам нужно быть знакомым со следующими инструментами:
- Virtualenv;
- Flask;
- git/Github;
- Heroku (основы).
Сперва настроим рабочую директорию:
Инициализиуем новый git репозиторий внутри нашей рабочей директории:
Устанавливаем среду окружения для использования в нашем веб-приложении:
Теперь вы можете увидеть (env) с левой стороны терминала, это указывает на то, что сейчас вы работаете в виртуальной среде.
Чтобы покинуть виртуальную среду просто выполните в терминале команду deactivate и когда захотите продолжить работу над проектом, запустите source env/bin/activate .
Затем нам нужно будет создать базовую структуру для нашего приложения. Создадим следующие файлы в папку "flask-by-example" :
В итоге, будет создана следующая структура из файлов:
Не забудьте обновить файл .gitignore из репозитория.
На всякий случай, стоит обновить pip через команду:
Устанавливаем Flask через pip:
Добавляем установленные библиотеки в наш файл requirements.txt :
Открываем файл app.py в текстовом редакторе и добавляем следующий код:
Затем нужно настроить Heroku для запуска веб-приложения на нем.
Установка Heroku для работы с Flask
Если вы этого еще не сделали, создайте аккаунт на Heroku, скачайте и установите Heroku Toolbelt и затем в терминале запустите команду для входа на Heroku:
После удачного входа на Heroku, нужно создать файл Procfile в вашей корневой директории проекта:
Добавляем следующую строку в новый созданный файл Procfile:
Не забудьте добавить модуль gunicorn в файл зависимостей requirments.txt :
Нам также нужно указать версию Python, чтобы Heroku использовал верный Python Runtime для запуска нашего веб-приложения.
Просто создаем файл под названием runtime.txt со следующим содержимым:
Загрузим наши изменения через git (также можно разместить на Github), затем создаем две новые веб-приложения на Heroku.
Первое веб-приложение для продакшена:
Второе веб-приложение для стейджинга:
Названия из примера уже заняты, поэтому вы должны выбрать свои собственные уникальные названия.
Я предлагаю использовать такой шаблон названия приложения:
В моем случае это:
В моем случае был получен вот такой результат в терминале:
Добавим новые приложения в git remote. Не забудьте назвать один remote pro (для продакшена), а другой stage (для стейджинга):
Подготавливаем все файлы для комита:
Теперь можно загрузить оба приложения для работы в режиме реального времени на Heroku:
- Для стейджинга: git push stage master
- Для продакшена: git push pro master
Вот так выглядит результат в терминале у меня:
Writing objects : 100 % ( 8 / 8 ) , 1015 bytes | 1015.00 KiB / s , done . remote : -- -- -> Installing pip 20.1.1 , setuptools 47.1.1 and wheel 0.34.2 remote : Downloading click - 7.1.2 - py2 .py3 - none - any .whl ( 82 kB ) remote : Downloading Flask - 1.1.2 - py2 .py3 - none - any .whl ( 94 kB ) remote : Downloading gunicorn - 20.0.4 - py2 .py3 - none - any .whl ( 77 kB ) remote : Downloading itsdangerous - 1.1.0 - py2 .py3 - none - any .whl ( 16 kB ) remote : Downloading Jinja2 - 2.11.2 - py2 .py3 - none - any .whl ( 125 kB ) remote : Downloading MarkupSafe - 1.1.1 - cp38 - cp38 - manylinux1_x86_64 .whl ( 32 kB ) remote : Downloading Werkzeug - 1.0.1 - py2 .py3 - none - any .whl ( 298 kB ) remote : Installing collected packages : click , MarkupSafe , Jinja2 , Werkzeug , itsdangerous , Flask , gunicorn remote : Successfully installed Flask - 1.1.2 Jinja2 - 2.11.2 MarkupSafe - 1.1.1 Werkzeug - 1.0.1 click - 7.1.2 gunicorn - 20.0.4 itsdangerous - 1.1.0Рабочий поток создания веб-приложения
Сделаем изменение в нашем веб-приложении и загрузим их только на стейджинге (тестовой версии нашего веб-приложения):
Запустите веб-приложение локально и убедитесь, что все работает:
Попробуем загрузить текущие изменения только для стейджинга, прежде чем загрузить их в продакшен.
Убедитесь, что ваши изменения зафиксированы в git:
Затем, загружаем все изменения на стейджинг (приложение для предварительного тестирования):
У меня получился вот такой вывод:
Writing objects : 100 % ( 3 / 3 ) , 460 bytes | 460.00 KiB / s , done . remote : -- -- -> No change in requirements detected , installing from cache remote : -- -- -> Installing pip 20.1.1 , setuptools 47.1.1 and wheel 0.34.2Теперь при переходу в среду стейджинга вы сможете использовать новый URL, то есть /mike и увидите Привет, mike! в зависимости от того, какое имя вы поместили в URL.
В моем случае это:
Однако, если вы попробуете то же самое на продакшен сайте, вы получите ошибку. Таким образом, мы можем создавать веб-приложения и тестировать их в среде стейджинга, а затем запускать их на продакшен.
Если все хорошо, давайте загрузим изменения и для продакшена:
Теперь та же функциональность доступна на продакшен сайте.
Этот разделенный рабочий процесс в виде стейджинг/продакшен позволяет вносить изменения, показывать нововведения клиентам , экспериментировать и так далее. Все делается внутри изолированного сервера, не вызывая каких-либо изменений на рабочем продакшен сайте, который используют пользователи.
Создаем файл конфигурации веб-приложения
Напоследок, нам нужно настроить конфигурации в зависимости от статуса приложения. Зачастую есть вещи, которые будут отличаться в локальных настройках и в настройках стейджинга и продакшена.
Возможно, вы захотите подключиться к разным базам данных, иметь различные ключи от AWS и так далее. Создадим файл конфигурации для работы с разными средами веб-приложения.
Добавим файл config.py в корень проекта:
В файле конфигурации мы собираемся позаимствовать кое-что из того, как настраивается конфигурация в Django. У нас будет базовый класс Config , от которого наследуются другие классы конфигурации. Затем при необходимости мы импортируем соответствующий класс.
Добавьте следующей код в созданный файл config.py :
basedir = os.path . abspath ( os.path . dirname ( __file__ ) )Мы импортировали модуль os и затем создали переменную basedir значение которой является полным путем к файлу config.py . Затем мы создаем базовый класс Config с некоторыми основными настройками, которые будут наследовать другие классы.
Теперь мы можем импортировать подходящий нам класс с конфигурациями, в зависимости от статуса нашего веб-приложения. Мы можем использовать переменные среды для выбора настроек, которые будут использоваться в зависимости от среды нашего веб-приложения, которая может быть:
- локальной на нашем компьютере;
- стейджингом (приложение только для тестирования);
- продакшеном (рабочее приложение для пользователей).
Flask: Настройка локальной среды
Для настройки нашего веб-приложения с индивидуальными переменными в зависимости от среды, мы будем использовать модуль autoenv.
Этот модуль позволяет создавать команды, которые будут запускаться каждый раз когда мы заходим в папку нашего приложения. Для того чтобы это реализовать, нам нужно установить модуль autoenv глобально т.е. для всей системы.
Сначала выходим из виртуальной среды в терминале, устанавливаем глобально модуль autoenv и создаем файл .env :
Читайте также: