Развертывание приложения Node.js в Heroku
Существуют многочисленные бесплатные услуги хостинга для публичного запуска приложений 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:
И переход к http://localhost:3000 :

Обработка формы отправки
Хотя страница отображается правильно, нет логики для обработки 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
Регистрация в Heroku и установка CLI
Теперь, когда приложение создано, пришло время подумать о Heroku. Если у вас нет учетной записи, зайдите на signup.heroku.com и создайте ее.
После того, как у вас есть учетная запись, вам необходимо установить инструменты 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 :
Повторно развернув приложение и обновив страницу, все работает просто отлично!
Руководство для разработчиков по запуску приложений Django на Heroku
Heroku, компания платформы как услуги (PAAS), очень популярная в сообществе Ruby on Rails, теперь начала открывать свою платформу для языков помимо Ruby. Теперь они предлагают поддержку Python, Java, Clojure, Node.js и Scala в своем новом стеке Cedar. Стек Cedar от Heroku все еще находится в бета-версии, но это не должно помешать вам опробовать его, и это именно то, что я собираюсь сделать.
6 месяцев назад я написал серию постов в блоге, в которых рассказывалось обо всех новых интересных хостингах django, которые появлялись. Моя цель состояла в том, чтобы посмотреть на них всех и сравнить их, чтобы узнать, что они могут предложить, и посмотреть, смогу ли я использовать их в своих будущих проектах. Я собираюсь проверить Heroku, используя тот же процесс, который я использовал для проверки других сервисов, чтобы я мог сравнить яблоки с яблоками.
Для тех из вас, кто не знаком с моими другими постами в блоге, не стесняйтесь проверять их сейчас ep.io , apphosted.com , gondor.io , dotcloud.com , DjangoZoom.com , обзор Django для хостинга .
Для тех из вас, кто ленив, я подведу итоги довольно быстро. То, что я пытаюсь сделать, довольно просто, я подписываюсь на сервис и просто просматриваю доступную документацию, могу ли я запустить свое приложение для блога и что мне нужно было сделать, чтобы оно работало , Я опишу каждый шаг на этом пути в качестве полезного руководства для тех, кто может попытаться сделать то же самое со своим приложением. Если я столкнусь с ошибкой, я сообщу вам, что это была за ошибка и как я ее исправил, так что если вы получите ту же ошибку, надеюсь, что то, что я сделал для решения моей проблемы, также исправит вашу.
Heroku Django Документация
Прежде чем вы начнете использовать любую новую платформу, вы должны уделить время чтению документации. Я знаю, это не похоже на веселье, но поверьте мне, это избавит вас от боли и разочарования в дальнейшем. Вот несколько ссылок, которые я нашел полезными.
- Краткое руководство : http://devcenter.heroku.com/articles/quickstart
- Статьи на Python : http://devcenter.heroku.com/articles/python
- Статья Джанго : http://devcenter.heroku.com/articles/django
- Центр разработки : http://devcenter.heroku.com/
Предпосылки
- Аккаунт Heroku
- Heroku клиент командной строки
- Python 2.7, virtualenv, pip, git
- Необходимо использовать pip для управления зависимостями с помощью файла require.txt
Записаться на Heroku
Регистрация была настолько простой, насколько это возможно, все, что мне нужно было сделать, это перейти по этой ссылке: https://api.heroku.com/signup и заполнить мой адрес электронной почты. Зайдите в мою электронную почту и нажмите на ссылку, которую они отправили, и я перешел на страницу, где я выбрал свой пароль, и все готово. Весь процесс занял менее 1 минуты. Не могу победить это.
Подтверждение вашей учетной записи Heroku
Когда вы регистрируете учетную запись, у вас есть ограниченный доступ к некоторым функциям (надстройкам и т. Д.), Пока вы не подтвердите свою учетную запись. Подтвердить свою учетную запись легко, все, что вам нужно сделать, это ввести данные своей кредитной карты. Это доказывает, что вы реальны, а также позволяет использовать некоторые платные функции. Я рекомендую вам подтвердить свою учетную запись, чтобы вы могли получить доступ к некоторым из доступных бесплатных дополнений.
Установка клиента командной строки heroku
Я использую Mac, поэтому собираюсь установить следующую версию клиента командной строки heroku (toolbelt). http://toolbelt.herokuapp.com/osx/download
- Нажмите на ссылку, скачать файл.
- Найдите загруженный файл (heroku-toolbelt.pkg) и дважды щелкните по нему.
- Следуйте подсказкам; при появлении запроса введите пароль и нажмите «закрыть».
Тестируем герою командной строки клиента
- Открытый терминал
- Наберите «heroku version», вы должны увидеть что-то вроде этого «heroku-gem / 2.14.0», если так, это сработало. если нет, вы сделали что-то не так.
Авторизуйтесь в heroku из командной строки клиента
Зайдя в клиент, мы попытаемся найти ваш ключ ssh и загрузить его на сайт heroku для последующей загрузки кода. Если у вас нет ключа, он предложит создать его. Если у вас есть более одного, он спросит вас, какой из них вы хотите использовать.
Пример ключа не найден
Найдено более одного ключевого примера
Готовим ваше приложение Django
Теперь, когда у вас есть учетная запись и установленный клиент, вы готовы начать работу. Если вы начинаете с нуля, я рекомендую выполнить действия, описанные в этом руководстве. http://devcenter.heroku.com/articles/django . Если вы похожи на меня и у вас уже есть приложение, которое вы хотите установить на Heroku, продолжайте читать.
Поскольку у меня уже есть проект, я собираюсь рассказать вам, что мне нужно было сделать, чтобы мое приложение для блога было запущено и запущено на heroku. Я следовал инструкциям из руководства по героку и пошел оттуда. Heroku зависит от git, поэтому я использую копию моего блогового приложения, размещенного на github: https://github.com/kencochrane/kencochrane_blog_heroku
Он должен автоматически активировать среду для вас. Если это не так, запустите эту команду.
Теперь, когда у меня есть 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.
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.
This output looks good the DATABASE_URL env variable is there, so that is OK. Looking more closely at my settings.py file I didn’t have a DATABASES variable because the last time I used this project, the other hosting provider didn’t require that I have one. So I have added a blank DATABASES variable, and that seems to have fixed my issue. Heroku, should make the error message a little nicer, add more notes to their documentation, or even better make their code handle the case when there is no DATABASES variable in the settings file. I have submitted a patch to fix this, so hopefully that will get rolled out in the near future. (https://github.com/heroku/heroku-buildpack-python/pull/8)
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
Heroku offers you two types of processes, a web process and a worker process. Web processes are used for serving web pages, etc. Worker processes are used for items that run in the background. The heroku tutorial goes over how to setup background task using celery and kombu (http://devcenter.heroku.com/articles/django) if you want more info I would check that out.
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.»
This means you can’t use this space to store uploaded files, but it should allow you to upload it there for a minute, and then send it over to Amazon S3 for a more permant storage solution. You could use a tool like Django Queued storage for this: https://github.com/jezdez/django-queued-storage
Databases
Heroku gives each app a 5MB shared postgresql database for FREE. If you pay $15/month you get upgraded to 20GB of space. They also offer dedicated database instances if you need that. See this page for more details. http://www.heroku.com/pricing#0-0
They also have a bunch of other addons (redis, mongodb, couchdb, amazon RDS) that you should be able to tie into, see the addons page for a complete list. http://addons.heroku.com/
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?
Развертывание Flask приложения на Heroku и подключение к БД MySQL — JawsDB

Новички часто устанавливают все пакеты на системном уровне из-за отсутствия опыта (например, с помощью pip). Получение зависимостей из requirements.txt для каждого проекта создаёт на компьютере неуправляемую глобальную среду Python. Виртуальные среды позволяют разделить ПО на отдельные части, сохраняя при этом список зависимостей.
Pipenv помогает разработчикам писать изолированные программные продукты, которые легче развертывать, создавать и изменять.
Что такое Pipenv?
Pipenv объединяет управление пакетами и виртуальной средой в один инструмент дляуправленияими. Pipenv — это pip и virtualenv , обёрнутые воедино.
Что такое Heroku?
Это множество программных продуктов, но нам понадобится только сервис облачной платформы Heroku для размещения приложения и JawsDB для БД MySQL. Он бесплатен! Воспользуемся GUI Heroku.
Преимущества облачной БД
При использовании SQLite каждая передислокация приложения приводит к сбросу БД. JawsDB Heroku позволяет данным сохраняться через обновления приложений. Размещение, настройка, исправление и управление БД — это всё JawsDB.
Подготовка к развёртыванию
Heroku дает возможность развернуть приложение из ветки Github. Как только у нас будет работающее приложение с Pipfile на Github, мы внесём окончательные изменения в репозиторий для развёртывания. Убедитесь, что у вас есть Pipfile в корневой директории проекта, чтобы Heroku мог найти его.
Примечание: следующие изменения позволяют приложению работать в Unix. Gunicorn не работает на ПК c Windows.
Установка gunicorn
Gunicorn — это HTTP-сервер WSGI Python, который будет обслуживать приложение Flask на Heroku. Добавьте gunicorn в Pipfile :
Добавление Procfile
Создайте файл Procfile в корневой папке проекта и добавьте:
Первое app — имя python-файла, который запускает приложение, или имя модуля, в котором оно находится. Второе app — имя приложения, то есть app.py . Этот Procfile работает с gunicorn и Dynos Heroku, чтобы обслуживать приложение удаленно.
Настройка и развертывание облачной БД Heroku Cloud
Всё, что касается Heroku в этой статье, — бесплатно. Создайте там учетную запись.
Перейдите в приложение на Heroku.com и нажмите кнопку resources . Затем введите “Jawsdb MySQL” в поле addons , как показано ниже:

Выберите бесплатную версию и нажмите кнопку provision . Отлично, теперь БД MySQL развёрнута для приложения. Затем нужно интегрировать новую БД в его логику.
Добавим pymysql , библиотеку Python SQL, в Pipfile:
Изменим строку подключения к pymysql . В настройках взгляните на переменные конфигурации. Найдите строку подключения, вроде этой:
Чтобы воспользоваться драйвером Pymysql в БД нужно внести изменения. С помощью текстового редактора, измените mysql на mysql+pymysql и сохраните:
Нужно будет добавить строку к переменным конфигурации на Heroku. Перейдите в настройки, затем в переменные конфигурации ( config vars ) и обновите строку подключения.
Сокрытие строк подключения с .env
Создайте новый файл с именем .env и добавьте строку подключения для облачной БД:
Примечание: запуск pipenv shell дает доступ к скрытым переменным среды. Также к ним можно получить доступ в Python с помощью os .
Для подключения к облаку обязательно добавьте строку выше в database.py !
Развертывание приложения
После тестирования и локальной работы отправляем весь код в ветку master (главную ветку). На Heroku переходим к развертыванию нового приложения ( deploy a new app ) и видим страницу:
Выбор Github и поиск вашего репозитория
Потом выберите Github, введите имя репозитория и нажмите кнопку search . Как только появится ваше имя пользователя и репозиторий, выберите connect . Щелкните на нужной ветке и нажмите deploy (развернуть).
Выбор главной ветки и развертывание
Логи сборки начнут заполнять консоль. Сначала Heroku ищет файл requirements.txt , а затем устанавливает зависимости из Pipfile.lock Pipenv. Вам понадобятся requirements.txt , если вы не используете Pipenv. Поместите эти файлы в корневой каталог проекта.

Как только из Pipfile.lock будет построена среда и сборка пройдет успешно, вы увидите:
Успешная развертывание приложения
Приложение развёрнуто. Нажмите кнопку view , чтобы увидеть его на Heroku.
Построение таблиц при инициализации
Если таблицы не были созданы до того, как вы попытались получить или опубликовать данные, то можно столкнуться с ошибкой. Для решения в app.py добавим:
Автоматическое развертывание
Чтобы изменения в ветке master на Github отображались на Heroku по мере их отправки, можно выбрать эту опцию (ветка master должна работать).
/>Разрешение автоматического развертывания
Вывод
Мы рассмотрели Github как инструмент контроля версий, Pipenv как среду и менеджер пакетов, а также преимущества управления БД через облако. Это упрощает сборку ПО, разработчики вместо управления сосредоточиваются на коде.
Практика правильного управления средой и пакетами имеет значение для специалистов по обработке данных и разработчиков, которые хотят, чтобы с их кодом работали. Использование среды и менеджера пакетов, такого как Pipenv, делает многие процессы эффективными!
Наличие хорошо управляемой главной ветки Github с Pipfile позволило Heroku пересобрать проект с минимальной диагностикой. Развернуть приложение из каталога на Github в Heroku можно за считанные минуты. Спасибо за чтение!