Heroku как запустить приложение
- 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 ничего не знает про то, какую директорию вы считаете рабочей.
Туда Сюда
Это восемнадцатая часть серии Мега-учебников Flask, в которой я собираюсь развернуть микроблог на облачной платформе Heroku.
Под спойлером приведен список всех статей этой серии 2018 года.
Примечание 1: Если вы ищете старые версии данного курса, это здесь.
В предыдущей статье я показал вам «традиционный» способ размещения приложения 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 выполняется с помощью средства управления версиями git , поэтому приложение должно находиться в репозитории git. Heroku ищет файл под названием Procfile в корневом каталоге приложения для получения инструкций о том, как запустить приложение. Для проектов Python, Heroku потребуется файл requirements.txtфайл со списком всех зависимостей модулей, которые необходимо установить. После того, как приложение будет загружено на серверы Heroku через git, вы, по сути всё сделали, и нужно просто подождать несколько секунд, пока приложение появится в сети. Это действительно так просто.
Heroku предлагает вам выбрать уровень обслуживания исходя из необходимой вычислительной мощности и времени требуемой вашему приложению, так как ваша база пользователей растет вам нужно будет купить больше единиц вычислительных, которые Heroku называет "dynos".
Готовы попробовать Heroku? Давайте начнем!
Создание учетной записи Heroku
Установка Heroku CLI
Heroku предоставляет командную строку для взаимодействия с службой под названием Heroku CLI, доступной для Windows, Mac OS X и Linux. Документация содержит инструкции по установке для всех поддерживаемых платформ. Установите его в своей системе, если вы планируете развертывать приложение для тестирования службы.
Первое, что вы должны сделать после установки CLI, это войти в ваш Heroku аккаунт:
Heroku CLI попросит вас ввести свой адрес электронной почты и пароль учетной записи. Ваш аутентифицированный статус будет сохранен в последующих командах.
Настройка Git
Инструмент git является основой для развертывания приложений в Heroku, поэтому вы должны установить его в своей системе, если у вас его еще нет. Если у вас нет пакета, доступного для вашей операционной системы, вы можете посетить сайт git для загрузки установщика.
Есть множество причин использовать git для ваших проектов. Если вы планируете развертывание в Heroku, то у вас появилась еще одна, потому что для развертывания в Heroku ваше приложение должно быть в репозитории git . Если вы собираетесь выполнить тестовое развертывание для Микроблога, вы можете клонировать приложение из GitHub:
Команда git checkout выбирает конкретную точку фиксации приложения в его истории, соответствующей этой главе.
Если вы предпочитаете работать с собственным кодом, а не с моим, вы можете преобразовать свой собственный проект в репозиторий git , запустив git init . в каталоге верхнего уровня (обратите внимание на точку после init , которая является инструкцией для git, что вы хотите создать репозиторий в текущем каталоге).
Создание приложения Heroku
Чтобы зарегистрировать новое приложение в Heroku, используйте команду apps:create из корневого каталога, передавая имя приложения в качестве единственного аргумента:
Heroku требует, чтобы приложения имели уникальное имя. Имя flask-microblog , которое я использовал выше, не будет вам доступно, потому что я уже использую его, поэтому вам нужно будет выбрать другое для вашего развертывания.
На выходе этой команды мы получим URL, который Heroku назначил приложению, а также его репозиторий git. Ваш локальный репозиторий git уже будет иметь настройку связи с внешним(remote), называемым heroku . Вы можете убедиться, что он существует с помощью команды git remote :
В зависимости от того, как вы создали свой репозиторий git, вывод вышеуказанной команды также может включать в себя еще один удаленный источник с именем origin .
Эфемерная файловая система
Платформа Heroku отличается от других платформ развертывания тем, что в ней реализована ephemeral файловая система, работающая на виртуальной платформе. Что это значит? Это означает, что в любое время Heroku может сбросить виртуальный сервер, что приведет к возврату вашего сервера в чистое состояние. Нельзя предположить, что любые данные, которые вы сохраняете в файловой системе, будут сохраняться, и на самом деле, Heroku очень часто перерабатывает серверы.
Работа в этих условиях создает некоторые проблемы для моего приложения, которое использует несколько файлов:
- Компонент SQLite database engine по умолчанию записывает данные в файл на диске
- Журналы для приложения записываются в файловую систему
- Скомпилированные хранилища языковых переводов также хранятся в локальных файлах
В следующих разделах будут рассмотрены эти три направления.
Работа с базой данных Heroku Postgres
Чтобы решить первую проблему, я перейду на другой механизм базы данных. В главе 17 вы видели, как я использую базу данных MySQL, чтобы повысить надежность развертывания Ubuntu. У Heroku есть собственное предложение базы данных, основанное на Postgres, поэтому я собираюсь переключиться на него, чтобы избежать проблемы хранения SQLite на основе файлов.
Базы данных для приложений Heroku снабжаются одним и тем же CLI Heroku. В этом случае я собираюсь создать базу данных на бесплатном(free) уровне:
URL-адрес вновь созданной базы данных хранится в переменной среды DATABASE_UR L, которая будет доступна при запуске приложения. Это очень удобно, так как приложение уже ищет URL базы данных в этой переменной.
Ведение журнала в stdout
Heroku ожидает, что приложения будут совершать ввод/вывод непосредственно в stdout . Все, что приложение печатает в стандартном выводе сохраняется и возвращается при использовании команды heroku logs . Поэтому я собираюсь добавить переменную конфигурации, которая указывает, нужно ли мне вести записи в stdout или в файл, как я это делал ранее. Вот изменение в конфигурации:
Затем в функции фабрики приложений я могу проверить эту конфигурацию, чтобы понять, как настроить средство ведения журнала приложения:
Поэтому теперь мне нужно определить переменную среды LOG_TO_STDOUT , если приложение работает в Heroku, но не в других конфигурациях. CLI Heroku делает это легко, поскольку предоставляет возможность устанавливать переменные среды, которые будут использоваться во время выполнения:
Скомпилированные переводы
Третьим аспектом микроблога, основанного на локальных файлах, является скомпилированный языковой перевод файлов. Самый простой вариант, чтобы гарантировать, что эти файлы никогда не исчезнут из эфемерной файловой системы, — это добавить скомпилированные языковые файлы в репозиторий Git, чтобы они стали частью начального состояния приложения после его развертывания в Heroku.
Более элегантный вариант, на мой взгляд, заключается в том, чтобы включить команду flask translate compile в команду start up, предоставленную Heroku, так что каждый раз, когда сервер перезапустится эти файлы скомпилируются снова. Я собираюсь пойти этим путём, так как я знаю, что моя процедура запуска будет требовать более одной команды в любом случае, так как мне ещё нужно запустить миграцию базы данных. Поэтому сейчас я отложу эту проблему в сторону и вернусь к ней позже, когда напишу Procfile.
Хостинг Elasticsearch
Elasticsearch является одним из многих сервисов, которые могут быть добавлены к проекту Heroku, но в отличие от Postgres, это не услуга, предоставляемая Heroku, а третья сторона, которая сотрудничают с Heroku, чтобы обеспечить дополнения. На сегодняшний день(когда я пишу эти строки) есть три разных провайдеров комплексной службы elasticsearch.
Прежде чем настраивать Elasticsearch, имейте в виду, что Heroku требует, чтобы ваша учетная запись имела привязанную кредитную карту до установки любого стороннего дополнения, даже если вы остаетесь в пределах их бесплатных уровней. Если вы предпочитаете не предоставлять данные своей кредитки Heroku, пропустите этот раздел. Вы сможете развернуть приложение, но функция поиска не будет работать.
Из вариантов Elasticsearch, которые доступны в качестве дополнений, я решил попробовать SearchBox, который поставляется с бесплатным стартовым планом. Чтобы добавить SearchBox в свою учетную запись, вы должны выполнить следующую команду во время входа в Heroku:
Эта команда развернет службу Elasticsearch и разместит URL-адрес подключения для службы в переменной среды SEARCHBOX_URL , связанной с приложением. Еще раз напомню, что эта команда не будет выполнена, если Вы не добавите свою кредитную карту в свой аккаунт Heroku.
Если вы вспомните из главы 16, мое приложение ищет URL-адрес подключения Elasticsearch в переменной ELASTICSEARCH_URL , поэтому мне нужно добавить эту переменную и установить ее в URL-адрес подключения, назначенный SearchBox:
Здесь я сначала попросил Heroku напечатать значение SEARCHBOX_URL , а затем я добавил новую переменную среды с именем ELASTICSEARCH_URL , установленным в то же значение.
Обновление Requirements
Heroku ожидает, что зависимости будут в файле requirements.txt, точно так же, как я определил в главе 15. Но для запуска приложения на Heroku мне нужно добавить две новые зависимости к этому файлу.
Heroku не предоставляет собственный веб-сервер. Вместо этого он ожидает, что приложение запустит свой собственный веб-сервер по номеру порта, указанному в переменной среды $PORT . Поскольку Веб-сервер разработки flask недостаточно надежен для использования в работе, я собираюсь снова использовать gunicorn, сервер, рекомендованный Heroku для приложений Python.
Приложение также будет подключаться к базе данных Postgres, и для этого SQLAlchemy требует установки пакета psycopg2 .
И gunicorn и psycopg2 нужно быть добавленным в файл requirements.txt.
Профайл
Heroku должен знать, как выполнить приложение, и для этого он использует файл с именем Procfile в корневом каталоге приложения. Формат этого файла прост, каждая строка содержит имя процесса, двоеточие, а затем команду, которая запускает процесс. Наиболее распространенным типом приложения, который работает на Heroku, является веб-приложение, и для этого типа приложений имя процесса должно быть web . Ниже вы можете увидеть Procfile для Microblog:
Здесь я определил команду для запуска веб-приложения как последовательность трёх команд. Сначала я запускаю обновление миграции базы данных, затем компилирую переводы языков и, наконец, запускаю сервер.
Поскольку первые две подкоманды основаны на команде flask , мне нужно добавить переменную среды FLASK_APP :
Команда gunicorn проще, чем то, что я использовал для развертывания Ubuntu, потому что этот сервер имеет очень хорошую интеграцию со средой Heroku. Например, переменная среды $PORT учитывается по умолчанию, и вместо того, чтобы использовать параметр -w для задания числа процессов, heroku рекомендует добавить переменную WEB_CONCURRENCY , которую gunicorn использует, когда -w не предоставляется, что дает вам гибкость для управления числом процессов без необходимости изменять Procfile.
Развертывание приложения
Все подготовительные шаги завершены, поэтому пришло время запуска развертывания. Для загрузки приложения на серверы Heroku для развертывания используется команда git push . Это похоже на отправку изменений в локальном репозитории git на GitHub или другой удаленный сервер git.
Если вы всё же работаете с собственным репозиторием, то ваш код уже, скорее всего, находится в главной ветви, поэтому вам сначала нужно убедиться, что ваши изменения пофиксены:
После чего можно запустить развертывание следующим образом:
Независимо от того, как вы отправляете ветку, вы должны увидеть следующий вывод из Heroku:
Метка heroku , которую мы использовали в команде git push , — это удаленный репозиторий, который был автоматически добавлен HEROKU CLI при создании приложения. Аргумент deploy:master означает, что я перемещаю код из локального репозитория, на который ссылается ветвь deploy , в главную ветвь master репозитория Heroku. Когда вы работаете с вашими собственными проектами, вы, вероятно, будете проталкивать изменения с помощью команды git push heroku master , которая протолкнет(запушит) вашу локальную ветку master . Из-за того, как этот проект структурирован, я отправляю ветку, которая не является master , но ветка назначения на стороне Heroku всегда должна быть master , поскольку это единственная ветвь, которую Heroku принимает для развертывания.
Если вы хотите видеть записи журнала для работающего приложения, используйте команду heroku logs . Это может быть полезно, если по какой-либо причине приложение не запускается. Если были какие-либо ошибки, они будут в журналах.
Развертывание обновлений приложений
Чтобы развернуть новую версию приложения, вам просто нужно выполнить команду git push с новым кодом. Это повторит процесс развертывания, отключит старое развертывание и заменит его новым кодом. Команды в Procfile будут запускаться снова как часть нового развертывания, поэтому любые новые миграции или переводы базы данных будут обновляться во время процесса.
Существуют многочисленные бесплатные услуги хостинга для публичного запуска приложений Node.js. Одним из таких сервисов является Heroku, который позволяет развертывать, управлять и масштабировать свои приложения в Интернете.
В этой статье мы создадим простое приложение Node и Express.js, которое сокращает данные ссылки, и развернем его в Heroku.
Создание Node.js URL Shortener
Чтобы упростить процесс разработки, мы будем использовать Express, легкую веб-инфраструктуру, гибкую и легко настраиваемую. Express поставляется с генератором приложений, но мы начнем с нуля.
Создание каталога проекта
Для начала давайте сделаем папку для нашего проекта:
Инициализация npm
Далее давайте инициализируем npm и вместе с ним запускаем наш проект:
npm init задаст ряд вопросов (название пакета, версия, описание и т. д.). Для простоты давайте пропустим все это, нажав Enter для каждой подсказки. Затем Node сгенерирует файл package.json и распечатает его в терминал:
Поля в package.json (имя пакета, описание, автор и т.д.) могут быть обновлены в любое время, поэтому вам не нужно слишком беспокоиться об этом.
То, что мы добавили здесь вручную, это команда "start": "node app.js" . Она будет чрезвычайно важна позже, когда мы развернем приложение в Heroku.
Heroku нужно знать, как запустить наше приложение, и обычно это делается через Procfile. Поскольку наше приложение очень простое, Procfile будет излишним, и достаточно просто определить, что наше приложение должно запускаться простым выполнением команды node app.js .
Установка Экспресс
После этого мы готовы установить Express:
Построение Node сервера
С установленным Express я создам очень простое приложение в файле под названием app.js :
Приложение на данный момент является только образцом Express, необходимым для его настройки, с одним обработчиком маршрута, который возвращает HTML-страницу через порт 3000 .
Давайте продолжим и определим страницу, которая будет принимать URL, который мы хотим сократить. Он будет состоять только из заголовка и простой формы, которая принимает URL:
Мы можем проверить, нормально ли работает приложение, выполнив:
Поскольку мы добавили команду "start" : "node app.js" в наш package.json, мы также можем запустить ее с помощью команды NPM:
Обработка формы отправки
Хотя страница отображается правильно, нет логики для обработки POST запроса, отправленного через форму по адресу /url .
Чтобы извлечь URL из запроса, отправленного через форму, мы будем использовать модуль body-parser и извлекать его из тела запроса, поэтому давайте продолжим, выполним require а также настроим его для использования:
После этого мы можем извлечь тело запроса через req.body , поэтому давайте продолжим и создадим другой обработчик запроса, который упаковывает URL-адрес из тела и отправляет его обратно:
Это все еще не то, что мы хотим, поскольку мы получаем полный URL-адрес, а не сокращенную версию.
Сокращение URL
Единственное, что осталось сделать для того, чтобы наше приложение Node было завершено - это укоротить URL-адрес перед отправкой. Для этого мы можем использовать модуль node-url-shorttener. Давайте установим его через npm:
Затем получим пакет в приложении:
И, наконец, давайте добавим еще один блок кода, который сокращает URL-адрес перед отправкой обратно:
urlShortner имеет метод short() , который принимает два параметра: исходный URL и функцию обратного вызова. Сокращенный URL-адрес передается в функцию обратного вызова, а затем в res.send() .
Давайте запустим приложение и протестируем его:
После ввода URL мы встречаем:
Развертывание в Heroku
После того, как у вас есть учетная запись, вам необходимо установить инструменты CLI Heroku, которые используются для развертывания. Heroku предоставляет инструкции по установке в центре разработки.
Отправка в Heroku
Развертывание в Heroku работает через Git. Это очень просто, когда вы понимаете, как это работает. По сути, вы можете выполнить развертывание в Heroku, используя удаленное хранилище, точно так же, как на GitHub.
Поскольку это новый проект, Git необходимо инициализировать:
Теперь мы готовы добавить и зафиксировать все файлы проекта. Однако, прежде чем сделать это, мы добавим файл .gitignore , потому что мы не хотим, чтобы каталог node_modules был зафиксирован. Он должен генерироваться npm при развертывании, а не фиксироваться для контроля версий
В вашем файле . gitignore просто добавьте:
Благодаря этому мы можем добавить и зафиксировать наш проект:
После того, как проект будет принят, нам нужно создать приложение Heroku, которое будет соответствовать нашему приложению Node:
Если вы используете CLI впервые, Heroku попросит вас войти через браузер. Процесс очень прост, просто следуйте инструкциям.
После завершения, Heroku возвращает имя и URL вновь созданного приложения (имя вашего приложения будет отличаться от моего). Если вы перейдете по URL, вы увидите страницу приветствия Heroku.
Это по-прежнему не наше приложение для сокращения URL-адресов, а просто общедоступное приложение Heroku, в которое мы будем развертывать свое собственное.
Развертывание приложения
В предыдущей команде heroku create новый удаленный сервер был добавлен в ваш репозиторий Git, что позволит вам выполнить развертывание в Heroku с помощью простой команды, подобной этой:
Поскольку приложение успешно развернуто, мы можем запустить его:
Тем не менее, мы столкнемся с проблемой из-за несоответствия портов. В нашем приложении мы жестко запрограммировали, что оно использует порт 3000 , но Heroku работает на другом порту, и это столкновение приводит к сбою нашего приложения.
Чтобы приложение работало как локально, так и в Heroku, мы изменим порт, и добавим process.env.PORT :
Повторно развернув приложение и обновив страницу, все работает просто отлично!
Ниже приведены основные шаги, необходимые для быстрого создания приложения Node.js с Express и его развёртывание на Heroku.
Шаг 1 — аккаунт на Heroku
Убедитесь, что у вас есть учётная запись Heroku.
Шаг 2 — установите Heroku Toolbelt
Скачайте и установите пакет Toolbelt для вашей ОС.
Шаг 3 — войдите в свой аккаунт
После установки Toolbelt вы должны получить доступ к своей учётной записи.
Вот и всё на этом. Пройдите через эти шаги и вы готовы для развёртывания кода!
Развёртывание первого приложения
На данный момент у вас должно быть приложение, работающее на локальном компьютере. Следующие шаги описывают обновления, которые вам нужно сделать для развёртывания кода.
Обновление package.json
На этом шаге мы должны добавить некоторый код в файл package.json, чтобы мы могли запустить приложение с удалённого сервера.
Прямо сейчас есть хороший шанс, что файл будет выглядеть следующим образом:
В конце объекта "dependencies": < . >вам нужно вставить запятую, чтобы мы могли добавить больше кода. Для начала добавим ключевое слово main:
Обратили внимание на запятую? Она здесь потому, что мы собираемся добавить ещё кое-что. После этого добавьте в объект engines инструменты, которые нужны для запуска этого приложения:
У вас должно быть что-то вроде следующего:
Не забудьте Grunt + Bower
Если на данный момент у вас нет любого пакета Grunt или Bower в объекте dependenciess, нам надо их получить.
Вы можете добавить их вручную в файле package.json или напрямую:
Вероятно у нас нет и возможности развернуть сервер для запуска задач Grunt. Для этого нам потребуется Grunt-CLI.
Прямо сейчас вы должны быть довольны.
Инструкции после установки
Когда делаем развёртывание кода на Heroku, мы должны запустить некоторые команды, в основном установить пакеты Bower и выполнить задачи Grunt. Чтобы сделать это, мы должны добавить инструкции внутри объекта scripts файла package.json.
Непосредственно поcле "start": "node ./bin/www" добавьте:
Теперь у нас есть всё что нужно, чтобы Heroku установил пакеты и запустил скрипты.
Добавление Procfile
Это файл, который необходим Heroku для запуска приложения.
Добавьте в него следующий код:
Heroku будет использовать это для запуска приложения.
Создание хранилища Git
Важно сделать хранилище Git до создания сервера Heroku. ПОДОЖДИТЕ! Прежде, чем вы сойдёте с ума на Git, есть некоторые вещи, которые мы должны сделать.
У вас должен быть файл .gitignore в вашем хранилище на данный момент. Откройте его и убедитесь, что вы игнорируете все node_modules, все bower_components и что-то в диапазоне /stylesheets/*.css.
Отлично. Теперь вы можете сделать git init своего хранилища.
Не обязательно в данное время делать это хранилище Github, но вы можете пожелать сделать его при создании реального приложения.
Heroku, компания платформы как услуги (PAAS), очень популярная в сообществе Ruby on Rails, теперь начала открывать свою платформу для языков помимо Ruby. Теперь они предлагают поддержку Python, Java, Clojure, Node.js и Scala в своем новом стеке Cedar. Стек Cedar от Heroku все еще находится в бета-версии, но это не должно помешать вам опробовать его, и это именно то, что я собираюсь сделать.
6 месяцев назад я написал серию постов в блоге, в которых рассказывалось обо всех новых интересных хостингах django, которые появлялись. Моя цель состояла в том, чтобы посмотреть на них всех и сравнить их, чтобы узнать, что они могут предложить, и посмотреть, смогу ли я использовать их в своих будущих проектах. Я собираюсь проверить Heroku, используя тот же процесс, который я использовал для проверки других сервисов, чтобы я мог сравнить яблоки с яблоками.
Для тех из вас, кто ленив, я подведу итоги довольно быстро. То, что я пытаюсь сделать, довольно просто, я подписываюсь на сервис и просто просматриваю доступную документацию, могу ли я запустить свое приложение для блога и что мне нужно было сделать, чтобы оно работало , Я опишу каждый шаг на этом пути в качестве полезного руководства для тех, кто может попытаться сделать то же самое со своим приложением. Если я столкнусь с ошибкой, я сообщу вам, что это была за ошибка и как я ее исправил, так что если вы получите ту же ошибку, надеюсь, что то, что я сделал для решения моей проблемы, также исправит вашу.
Heroku Django Документация
Прежде чем вы начнете использовать любую новую платформу, вы должны уделить время чтению документации. Я знаю, это не похоже на веселье, но поверьте мне, это избавит вас от боли и разочарования в дальнейшем. Вот несколько ссылок, которые я нашел полезными.
Предпосылки
- Аккаунт Heroku
- Heroku клиент командной строки
- Python 2.7, virtualenv, pip, git
- Необходимо использовать pip для управления зависимостями с помощью файла require.txt
Записаться на Heroku
Подтверждение вашей учетной записи Heroku
Когда вы регистрируете учетную запись, у вас есть ограниченный доступ к некоторым функциям (надстройкам и т. Д.), Пока вы не подтвердите свою учетную запись. Подтвердить свою учетную запись легко, все, что вам нужно сделать, это ввести данные своей кредитной карты. Это доказывает, что вы реальны, а также позволяет использовать некоторые платные функции. Я рекомендую вам подтвердить свою учетную запись, чтобы вы могли получить доступ к некоторым из доступных бесплатных дополнений.
Установка клиента командной строки heroku
- Нажмите на ссылку, скачать файл.
- Найдите загруженный файл (heroku-toolbelt.pkg) и дважды щелкните по нему.
- Следуйте подсказкам; при появлении запроса введите пароль и нажмите «закрыть».
Тестируем герою командной строки клиента
- Открытый терминал
- Наберите «heroku version», вы должны увидеть что-то вроде этого «heroku-gem / 2.14.0», если так, это сработало. если нет, вы сделали что-то не так.
Зайдя в клиент, мы попытаемся найти ваш ключ ssh и загрузить его на сайт heroku для последующей загрузки кода. Если у вас нет ключа, он предложит создать его. Если у вас есть более одного, он спросит вас, какой из них вы хотите использовать.
Пример ключа не найден
Найдено более одного ключевого примера
Готовим ваше приложение Django
Он должен автоматически активировать среду для вас. Если это не так, запустите эту команду.
Теперь, когда у меня есть virtualenv, мне нужно установить свои требования с помощью pip.
Создание приложения django на героку
Создать приложение на heroku очень просто, нужно просто запустить следующую команду.
Развертывание приложения Django в Heroku
Когда вы будете готовы, вы можете развернуть приложение django в Heroku.
Если все прошло хорошо, это должно выглядеть примерно так.
Развертывание приложения на Heroku не удалось, что теперь?
В первый раз, когда вы добьетесь мастерства, вы получите нечто подобное.
Это нормально, просто введите «да», и вам никогда не будет предложено это снова.
Приложение Django должно находиться в подкаталоге пакета
Если ваш django-проект не настроен правильно, вы получите такую ошибку.
This failed, because django app must be in a package subdirectory.. So you need to change the way my django app is setup. Move all of the files under a django project directory except the .git directory and .gitignore and requirements.txt files. For an example of what this looks like, check out the project directory structure on my repo in github.
Heroku push rejected, no Cedar-supported app detected
Another error you can get is this one. «Heroku push rejected, no Cedar-supported app detected»
I had this error and I couldn’t figure it out. After searching through all of the heroku python docs (all 2 of them), I didn’t find anything, so I started doing some trial and error testing, and I finally figure out what was wrong. My django project directory was kencochrane_blog, and this had an underscore, and when I changed it to just kenblog (no more underscore), it worked. I couldn’t find anything anywhere that said you can’t use underscores for your django app name, so they might want to update their documentation, or possibly fix the bug. I’m not sure if this is by design or not, maybe someone can let me know.
Check Django application status on heroku
Now that you have pushed your application out onto Heroku how do you know if it is actually running? The Heroku client has a command called ps, which will tell you what your processes are doing.
My django application looks like it crashed. Most likely because I didn’t setup the database yet, lets look at the logs to see what is causing the problems to be sure.
Checking Django application logs on Heroku
The Heroku client has a nifty logs command that you can use to view the last chunk of logs for your application. It will combine all of your logs into one view, so that you don’t have to have more then one log process running. You can call it directly and get an output similar to the shell command ‘tail’ and you can all use the ‘—tail’ option to follow the logs.
Looks like it is an issue with the settings file. If you wanted to take a look at the settings file to see if we can find out what is wrong you can run the following command.
import os, sys, urlparse urlparse.uses_netloc.append('postgres') urlparse.uses_netloc.append('mysql') try: if os.environ.has_key('DATABASE_URL'): url = urlparse.urlparse(os.environ['DATABASE_URL']) DATABASES['default'] = < 'NAME': url.path[1:], 'USER': url.username, 'PASSWORD': url.password, 'HOST': url.hostname, 'PORT': url.port, >if url.scheme == 'postgres': DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2' if url.scheme == 'mysql': DATABASES['default']['ENGINE'] = 'django.db.backends.mysql' except: print "Unexpected error:", sys.exc_info()This is odd, not sure why this is like this since I’m seeing the DATABASES variable above. Let’s check to see if the environment variables are there. (the output has been changed to protect the innocent, but you still get the picture). You can also use the command ‘heroku config’ if you just want to see your application configuration options.
Now if we redeploy the app and look at the logs, they look much better.
Running django management commands on Heroku
Running django management commands are easy you just need to run the following command and replace <command> with the management command you want to run. There are a few examples below.
Running django shell on Heroku
If you need to use the interactive python shell with django, you still can, you just need to run the following command.
Syncing Django Database on Heroku
Now that our application is starting like it should let’s sync the db.
Running Django South Migrations on Heroku
Now lets look at our processes now
Things are looking better, we are up, and it also shows our old commands that we ran.
if you need to work with the processes you have the following options.
Opening your django application in a web browser
If you run this command it will open a web browser and hopefully your site is running as it should
Running django and gunicorn on heroku
По умолчанию heroku развертывается с помощью встроенного сервера запуска django, который не рекомендуется для производства. Если вы играете вокруг, это нормально, но как только вы это пройдете, первое, что вы должны сделать, — это переключиться на что-то лучшее, например, guincorn. Переключение происходит быстро и безболезненно, и вы будете рады, что сделали это.
- Добавьте gunicorn == 0.13.4 в файл требований.
- создайте новый файл с именем Procfile на том же уровне, что и ваш файл needs.txt, в котором содержится следующее.
Добавьте gunicorn в установленные_apps в settings.py
Просматривая ваши логи, вы увидите, что все работает
Running django/celery background tasks on Heroku
Serving Django Static media on Heroku
I’m not sure how to serve up static media on heroku, to get my app working I just used the built in «django.views.static.serve» views for now, this isn’t ideal and you would want a more permanent solution. A more long term solution would be to push all static media into Amazon s3 and then use Amazon cloudfront to serve everything.
Uploading files to Heroku with Django
«Which the app can use as a temporary scratchpad, but no files it writes are visible to any other «Each dyno gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During its lifetime the dyno can use the filesystem as a temporary scratchpad, but no files it writes are visible to any other dyno (including other dynos in the application) and any files written will be discarded the moment the dyno is stopped or restarted.»
Databases
Setting up Django Caching on Herku
To use memcache on Heroku, I went to the add-on page and installed the free memcache addon. Once I did this I can run the heroku config command to find out my config settings. I then use that information in my django settings file so that I can have access to caching in my app.
They also offer redis if you prefer that.
Sending Email from django on Heroku
If you need to send or receive email in your application there are a few email add-ons that you can use. Pick the one you want and then run the ‘heroku config’ command described above to get your settings, and update your django settings accordingly.
Application size
You application and all of it’s dependencies can’t be more then 100MB in size.
Heroku Pricing
Dynos cost $0.05 per hour, prorated to the second. For example, an app with four dynos is charged $0.20 per hour for each hour that the four dynos are running.
Pricing is based on calendar time. If you set your app to four dynos, you will be charged $0.20 per hour regardless of the traffic your site serves during that time.
Each application receives 750 free dyno hours per month. For example if you have 1 web dyno running for all of April, and a worker dyno running half the time you would have 330 dyno-hours billed that month or $16.50 (720 web dyno hours + 360 worker dyno hours — 750 free dyno hours).
Conclusion
I haven’t really had much time to really play with Heroku, and stress test it at all, but I have to say it is pretty impressive to begin with. There are still some rough edges, but I’m sure they will have those smoothed out before they remove the beta tag. The thing that impresses me the most is all of the addons that you have access to out of the box. I’m not sure how many of these work with the new platform, or with django right now, but I’m sure it is only a matter of time before they are available.
I would highly recommend signing up and trying out their service, it is free so what do you have to lose?
Читайте также: