Как развернуть django приложение на heroku
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?
Решил поделиться с вами тем, как поставить проект написаный на Python/Django на сервер heroku. Heroku — это бесплатный хостинг для тестирования своих проектов. Если вам нужно посмотреть как действует проект в боевом режиме — вперед!
1. Надо пройти регистрацию на heroku. В этом нет ничего сложного, просто вводите данные, подтверждаете на почте аккаунт, и вперед.
4. В нашей консоли прописываем команду:
После чего создаем в каталоге проекта файл .gitignore. В нем мы можем записать все файлы которые мы хотим проигнорировать при загрузке на сервер. Допустим на сервере я буду использовать базу данных MySQL, по этому файл db.sqlite3 мне не нужен.
После пишем в bush 3 команды
1-ая отвечает за добавление всех фалов в git.
5. Теперь входим в наш heroku через консоль. Пишем:
Дальше вводим сначало E-mail, нажимаем Enter. Потом пароль и опять же Enter.
Вот мы и вошли. Дальше создаем приложение, мы это будем делать через консоль так что вводим в нее следующее:
Команда создает приложение. После этой команды через пробел можно написать имя приложения. В противном случае heroku с генерирует его автоматически и выведет в консоль.
6. Дальше создаем несколько файлов, для того что бы heroku понял что мы загружаем и как:
Procfile
runtime.txt
-
В runtime сразу пишем этот код:
Дальше устанавливаем сам gunicorn для обслуживания django через wsgi:
Сразу же устанавливаем whitenoise для работы со статическими файлами:
7. Теперь переходим в settings.py и делаем следующие изменения:
Добавляем static_root если у вас его нет:
8. Настраиваем работу с базой данных. Устанавливаем утилиту для более удобной работы:
переходим опять в настройки и пишем:
9. Последний файл который нам нужен — requirements.txt, в нем будут все установленные библиотеки:
У нас создался файл со всеми пакетами. Можете записать в него различные пакеты с их версиями. Обязательно надо записать эту строчку:
Если при дальнейших действиях у вас возникнут ошибки, посмотрите, может вам надо добавить сюда какой либо пакет.
10. Ну и финал, загружаем на сервер.
Переходим в консоль и пишем такие команды:
Если у вас не получилось с main, попробуйте:
И пошел процесс загрузки нашего проекта на heroku. Дальше вам в консоль напишет ссылку на наш проект. По ней мы будем переходить потом, а сейчас выполним все миграции:
И создадим super user-а:
Переходим по раннее полученной ссылке, и видим наш проект. Вот так за 10 шагов мы загрузили наш проект на heroku и настроили базу данных. Всем спасибо за внимание.
Heroku - это облачная платформа, предоставляющая услуги хостинга. Она поддерживает несколько языков программирования, включая PHP, Node.js и Python. Это платформа как сервис (PaaS), который позволяет вам управлять приложениями веб-сайтов, одновременно заботясь о ваших серверах, сетях, хранилище и других облачных компонентах.
В этой статье мы рассмотрим, как развернуть приложение Django на Heroku с помощью Git.
Предпосылки
Ниже приведен список вещей, которые необходимо сделать, прежде чем мы начнем развертывание:
- Git
- Учетная запись Heroku и интерфейс командной строки
- Приложение Django
Интерфейс командной строки Heroku (CLI) позволяет легко создавать приложения Heroku и управлять ими прямо из терминала. Это важная часть использования Heroku.
Чтобы установить Heroku CLI (он же Heroku Toolbelt), следуйте инструкциям на официальном сайте.
Убедитесь, что ваше приложение Django работает в виртуальной среде, которую вам необходимо поддерживать в течение всего процесса развертывания.
Аккаунт Heroku
После того, как все эти вещи будут установлены, следующим шагом будет создание бесплатной учетной записи Heroku здесь, если у вас еще нет учетной записи.
После написания в терминале следующего:
Настроить приложение Django для Heroku
Теперь, когда мы сделали все необходимое, давайте подготовим наше приложение Django для Heroku.
Procfile
PROCFILE файл с именем Procfile без расширения файла, помещенного в корневом каталоге вашего приложения. В нем перечислены типы процессов в приложении, и каждый тип процесса является объявлением команды, которая выполняется при запуске контейнера / динамометрического стенда этого типа процесса.
Перед созданием Procfile вы захотите установить django gunicorn в каталог вашего проекта:
Хотя Django поставляется со своим собственным сервером WSGI, мы скажем Heroku использовать Gunicorn для обслуживания нашего приложения, что также рекомендуется Heroku.
Теперь создайте Procfile в родительском каталоге и добавьте следующую строку:
Замените yourdjangoweb фактическим названием вашего проекта.
Runtime.txt
Создайте текстовый файл с именем runtime.txt в том же каталоге, что и Procfile . Он сообщает Heroku, какую версию Python использует ваше приложение. Если вы не уверены в версии, введите в терминал python --version с активированной виртуальной средой Django.
Затем добавьте версию в runtime.txt :
Посмотреть поддерживаемые версии Python на Heroku можно здесь.
Разрешенные хосты
В качестве альтернативы вы можете разрешить все приложения от Heroku, опуская имя приложения, например:
Вы также можете использовать ['*'] , чтобы разрешить все хосты. Вы можете найти более подробную информацию в документации.
Установить пакеты
Ниже приведены дополнительные пакеты, которые необходимо установить в нашей виртуальной среде.
Чтобы подключить нашу базу данных Django к Heroku, установите dj-database-url , выполнив:
Поскольку Heroku использует базы данных Postgres, нам также понадобится его адаптер для Python:
И, наконец, мы будем использовать WhiteNoise для обслуживания статических файлов на рабочем сервере. Что мы можем установить, выполнив:
Мы уже настроили gunicorn , давайте добавим конфигурацию для whitenoise и dj-database-url .
Настройка статических файлов
Сначала добавьте базовые настройки для обслуживания статических файлов в любом проекте Django. Вы можете скопировать и вставить следующие настройки в свой settings.py :
Добавьте WhiteNoise в список MIDDLEWARE , сразу после SecurityMiddleware :
Настройка базы данных
Мы используем dj-database-url для настройки нашей базы данных. Добавьте эти строки внизу settings.py :
Requirements.txt
Heroku распознает развернутое приложение как приложение Python, только если у него есть файл requirements.txt в корневом каталоге. Он сообщает Heroku, какие пакеты необходимы для запуска вашего приложения.
Для этого мы можем использовать pip freeze и передать вывод в файл requirements.txt :
Ваш requirements.txt должен выглядеть примерно так:
Примечание: Вышеуказанные версии используются нашим приложением Django и могут отличаться для вашего.
Подключите приложение Heroku к Git
Теперь нам нужно создать приложение Heroku:
Инициализируйте пустой репозиторий в каталоге вашего проекта:
Подключите приложение Heroku к пустому git репозиторию:
Зафиксируйте изменения / файлы:
Наконец, отправьте проект в git репозиторий, размещенный на Heroku:
Если все пойдет нормально, вы увидите такой вывод:
Ошибка collectstatic
Вы можете получить ошибку collectstatic , связанную с запуском команды git push heroku master . Это связано с каталогом статических файлов, и вы можете обойти его с помощью следующей команды:
Он скажет Heroku не запускать команду collectstatic во время развертывания приложения. Вы можете запустить его позже, используя bower :
Это может произойти по многим причинам, включая, помимо прочего:
- Ваш список STATICFILES_DIRS пуст или настроен неправильно.
- В вашем каталоге static нет файлов для отслеживания git . Вы можете добавить любой временный файл в свой каталог static , чтобы он работал.
Перенести базу данных
Последний шаг - отразить models , вашу базу данных в Heroku, выполнив миграции:
Добавление собственного доменного имени
1. Войдите в панель управления Heroku.
2. Выберите ваше текущее приложение из списка:
3. Выберите Settings на панели навигации и прокрутите вниз, чтобы найти раздел Domain:
4. Нажмите на Add domain, где вы сможете добавить свое доменное имя.
Этот вариант доступен только для проверенных учетных записей. Вам будет предложено ввести данные кредитной карты на Heroku для подтверждения вашей учетной записи. Вы можете найти более подробную информацию о добавлении доменов и субдоменов на этой странице.
Вывод
В этой статье мы развернули приложение Django на Heroku с пользовательским доменным именем, используя Git.
В этой статье мы расскажем о развертывании приложения Django в конвейере Heroku из репозитория GitHub.
Вступление
Heroku -это популярная Платформа как услуга (PaaS), которая позволяет разработчикам запускать и развертывать приложения, используя инфраструктуру, необходимую с точки зрения аппаратного и программного обеспечения.
Это означает, что нам не нужно инвестировать в аппаратное и программное обеспечение, необходимое для предоставления наших приложений конечным пользователям, и эта свобода позволяет нам сосредоточиться на нашей бизнес-логике вместо развертывания.
В этом посте мы расскажем, как развернуть простое приложение Django в конвейере Heroku. Он ориентирован на существующих разработчиков Python и предполагает базовое понимание настройки и запуска приложения Django.
Предпосылки
Для этого поста нам понадобится:
- Бесплатный уровень Учетная запись Heroku ,
- Установлен Python 3+ и Virtualenv установлен и учетная запись GitHub.
Демонстрационное Приложение
Загрузка приложения Django
Перед развертыванием вашего приложения Django нам нужно будет подготовить его в соответствии с требованиями Heroku. Мы начнем с создания виртуальной среды, активации ее и установки необходимых пакетов, и, наконец, загрузим простое приложение Django:
Если все пойдет хорошо, то на нашем локальном сервере должна быть запущена следующая целевая страница:
На данный момент структура папок нашего проекта выглядит следующим образом:
Прежде чем мы развернемся на Heroku, нам нужно будет внести некоторые изменения. Во-первых, нам нужно изменить настройку ALLOWED_HOSTS в нашем plaindjango/settings.py к:
Когда Heroku развертывает наше приложение, он запускает команду django-admin collectstatic , которая связывает и сохраняет все статические файлы в указанной папке. Эта папка будет находиться в корневом каталоге нашего проекта.
Подготовка приложения к развертыванию
Когда наше приложение Django готово, Heroku требует, чтобы мы включили следующие файлы в корень нашего проекта, чтобы он был готов к развертыванию:
- Когда наше приложение Django готово, Heroku требует, чтобы мы включили следующие файлы в корень нашего проекта, чтобы он был готов к развертыванию:
Цель этого файла-указать версию Python, которая будет использоваться для запуска нашего проекта. В нашем случае файл будет просто содержать:
Этот файл определяет команды, которые будут выполняться при запуске программы.
В то время как Django поставляется со своим собственным сервером WSGI, наш профиль скажет Heroku использовать Gunicorn для обслуживания нашего приложения. Содержимое этого файла будет:
Эта строка говорит Heroku, что наш web процесс или приложение, которое будет запущено с помощью gunicorn . Gunicorn затем будет использовать файл WSGI нашего проекта для запуска нашего сервера приложений.
Наконец, нам нужен requirements.txt файл, определяющий требования нашего приложения Django. Мы можем создать это в нашей виртуальной среде, выполнив следующую команду:
Окончательная структура папок нашего приложения Django, содержащая дополнительные файлы, теперь будет:
С этими файлами на месте наше приложение готово к Heroku.
Развертывание в Heroku через GitHub
Хотя Heroku предлагает свою собственную платформу Git, которую мы можем использовать для наших развертываний, она не так богата функциями, как GitHub. Heroku также позволяет нам извлекать наш код из GitHub и развертывать его.
Наш код готов к развертыванию, поэтому мы можем пойти дальше и создать репозиторий GitHub и продвинуть наш код.
Для справки, вот пример приложения Django на GitHub , которое готово к развертыванию на Heroku.
Мы предоставляем имя нашего конвейера и репозитория GitHub для подключения:
A pipeline представляет собой группу приложений Heroku, которые используют одну и ту же кодовую базу. В конвейере мы можем определить различные этапы непрерывного процесса доставки.
Это означает, что через Heroku мы можем развернуть наш код в нашей производственной, промежуточной и среде разработки одновременно, все из GitHub.
При использовании GitHub в качестве источника нашего приложения мы можем настроить конвейеры Heroku для развертывания кода из разных ветвей в разные среды.
Это дает нам видимость нашего проекта на нескольких этапах, улучшая нашу доставку.
Трубопровод Heroku
Это вид нашего недавно созданного конвейера для нашего приложения на GitHub:
Heroku позволяет нам добавлять существующие приложения в конвейер или создавать новые. Поскольку это новый конвейер, мы создадим новое приложение под названием plaindjango-production , которое будет нашей производственной средой.
Наше рабочее приложение было создано, но наш код еще не запущен. Следующим шагом является выбор ветви, из которой код будет развернут в нашей производственной среде:
В самом конце журналов есть ссылка на наше запущенное приложение. Когда мы переходим по ссылке, нас приветствует наша целевая страница Django:
Мы успешно развернули наше производственное приложение Django в Heroku через GitHub. Чтобы создать приложение для нашей промежуточной среды, выполняются те же шаги, что и для основной среды.
Запрос pull можно увидеть здесь , на GitHub , и это результат на нашем конвейере Heroku:
Мы видим, что для нашего запроса на вытягивание было создано новое приложение, и когда мы открываем его, мы видим изменения, которые запрос на вытягивание вносит в наш проект:
Наш запрос на вытягивание был успешно развернут, и мы можем просмотреть его перед объединением изменений в master. При активированном автоматическом развертывании Heroku развернет наши изменения, как только мы объединим запрос на вытягивание в главную ветвь, и изменения будут запущены автоматически.
Вывод
Наше приложение Django было развернуто в Heroku из GitHub с помощью конвейера. Хотя это не единственный способ развертывания приложения Django в Heroku, он наиболее подходит для совместного проекта.
Контейнеризированные приложения можно развернуть на Heroku, создав образы Docker и опубликовав их либо в Dockerhub, либо в собственном реестре контейнеров Heroku. Более подробную информацию о развертывании докеризованных приложений в Heroku можно найти в официальной документации . Heroku также предоставляет платформу Git, которую можно использовать для развертывания приложений в сочетании с их инструментом CLI.
Благодаря интеграции с функциональными возможностями git и Github, позволяющими развертывать контейнерные приложения, Heroku-это способная платформа для удовлетворения ваших потребностей в разработке. Платформа также предоставляет дополнения через маркетплейс.
Эти дополнения представляют собой сервисы или части инфраструктуры, которые могут быть использованы для улучшения наших приложений. Такие дополнения позволяют нам интегрировать наше приложение в базы данных и хранилища данных, включая PostgreSQL, MySQL и Redis.
С приложениями Django на Heroku можно добиться большего, и этот пост должен был представить простой взгляд на то, как развернуть приложение Django на платформе таким образом, чтобы оно соответствовало нашему ежедневному рабочему процессу.
Готовый к Heroku Djangoproject можно найти здесь, на GitHub , а также открытый запрос pull, который также был развернут.
Мой первый опыт деплоя на heroku. Сервис предоставляет бесплатные инстансы с разумными ограничениями, чем я и воспользуюсь.
Официальный документ тут, а это вольный перевод, который делался вместе с запуском моего приложения на heroku.
Задача: запустить уже имеющийся джанго-проект на сервисе heroku.
- host Windows 7 x64
- guest Ubuntu wily 15.10
- under Vagrant 1.8.1
- python 3.4.3
- django 1.9.2
- db backend sqlite3
Все команды выполняются внутри Vagrant-контейнера. Деплой на heroku из-под Windows тоже возможен, но там есть ряд несовместимостей, все подробно описаны с соотв. разделах статей на сайте Heroku.
Toolbelt
Первое, что нужно сделать, это установить в систему "тулбелт" - приложение, которое позволяет управдять инстансами heroku из командной строки. Для debian/ubuntu команда будет такая
Procfile
Каждый проект должен иметь Procfile. Он определяет тип процессов приложения и точку входа. Должен располагаться в корне проекта.
Установим Gunicorn прямо сейчас:
runtime.txt
Heroku должен правильно определить, что приложение у нас написано на Python. Происходит это очень просто - по наличию файла requirements.txt в корне проекта. Даже если нет зависимых пакетов, requirements.txt должен присутствовать.
Когда происходит деплой, heroku сообщает о найденном приложении python:
Это означает, что heroku будет разворачивать наше приложение, используя питон версии 2.7.11 . Причем не имеет значения, какую версию питона мы используем при разработке.
Чтобы изменить версию питона на продакшене, нужно указать ее в файле runtime.txt :
Не все версии питона одинаково поддерживаются. На момент написания статьи это были python-2.7.11 и python-3.5.1 . Можно указать и другие версии, однако heroku одобряет и поддерживает именно эти. Подробнее - Supported python runtimes.
settings.py и среда выполнения
Настройки Django для среды разработки и для heroku будут разнится, поэтому нужно позаботиться о том, чтобы наше приложение знало, где оно выполняется. Я делаю это через переменные окружения. На ubuntu/debian это делается так:
а на heroku так:
Или можно через интерфейс, в секции Settingы -> Config Variables. Проверить установленные переменные можно или там же в интерфейсе, или командой
но обязательно из директории проекта (или понадобится явно указать --app APP )
Далее в settings.py делаем такую конструкцию:
Sqlite или Postgres
Sqlite не подходит для использования на heroku. На heroku используется так называемая ephemeral filesystem. Каждый dyno обладает такой файловой системой. На нее можно писать, с нее можно читать, но она время от времени сбрасывается. Так же она очищается при деплое. Поэтому нельзя использовать файловую систему для хранения перманентных данных.
Поэтому в качестве базы данных нужно использовать Postgres. Heroku предоставляет бесплатный инстанс базы данных PostgreSQL с ограницением в 10k строк. Это ограничение нужно учитывать при выборе Heroku как бесплатного сервиса.
Однако если приложение не использует каких-то особенностей Postgres, то можно оставить среду разработки на sqlite, чтобы не устанавливать Postgres локально.
Heroku Postgres работает как адд-он к приложению. Аддон можно установить командой
- название тарифного плана, для free плана это hobby-dev .
Про ограничения этого плана можно почитать здесь
После этого в нашем приложении появится переменная окружения DATABASE_URL для подключения к инстансу Postgres.
Следующее, что нам нужно сделать, это установить psycopg2 для использования Python совместно с Postgres.
Конфигурация базы данных
На Heroku есть такое понятие, как Config Vars . Это, по сути, набор констант. Хранятся они вместе с контейнером, и передаются в среду выполнения как переменные окружения. В них рекомендуется хранить приватные настройки, такие как логины и пароли.
Там же Heroku хранит и настройки подключения к БД Posgres, в переменной DATABASE_URL .
Чтобы внедрить эти параметры в наш settings.py , на помощь приходит пакет dj-database-url. Он парсит DATABASE_URL и подставляет данные подключения в DATABASES['default'] в нашем проекте джанго.
В settings.py добавляем (убирать ничего не нужно) настройки подключения к ДБ в соответствии с $DATABASE_URL :
Database extension
Если для работы базы данных требуются расширения, их можно установить следующим образом (на примере hstore)
Перенос данных из локальной базы
Дамп в формате custom (-Fc) из официального мануала для моего метода не подходит
Создаем дамп так
Сбрасываем базу на heroku
Добавляем нужные расширения
Заливаем дамп на heroku
Сливаем дамп с heroku
Восстанавливаем слитый дамп в локальную базу. Этот процесс не уничтожает локальную базу или объекты, поэтому если локальная база уже содержит данные, результат может быть неконсистентным.
Database connection persistence
По умолчанию, Django будет создавать постоянное подключение к базе данных только для каждого цикла запроса приложения.
Постоянные соединения представляют собой связи с базами данных, которые не закрываются при завершении скрипта. При получении запроса на постоянное соединение сервер вначале проверяет, имеется ли идентичное постоянное соединение (которое было открыто при предыдущих обращениях) и, если таковое было найдено, использует его.
Это весьма накладное поведение, которое может замедлить выполение Django приложения.
К счастью, Django может обеспечивать постоянные соеденения, которые дают значительное улучшение производительности приложения.
Обслуживание статики
Django settings for static assets can be a bit difficult to configure and debug. However, if you just add the following settings to your settings.py, everything should work exactly as expected:
Для дополнительной информации см. Django and Static Assets.
Whitenoise
По умолчанию, Django не поддерживает обслуживание статики в продакшене. Heroku рекомендует использовать проект WhiteNoise для наилучшего обслуживания статики на продакшене.
Bower
Так как мы используем bower для установки зависимостей, нужно научить делать то же самое heroku. Для этой цели служат buildpack'и. Каждый buildpack устанавливает в контейнер heroku какой-то набор окружения. Есть официальные buildpack'и и неофициальные. У нас приложение на python, поэтому у нас автоматически установится buildpack heroku/python .
Нам нужно установть три buildpack'а, но, важно! - именно в такой последовательности - nodejs, bower, python:
Для того, чтобы заработал buildpack nodejs, наше приложение должно пройти проверку на heroku, что оно действительно является nodejs-приложением. Для этого в корне проекта должен сушествовать файл package.json c таким содержимым:
На этом все, bower должен установиться и установать зависимости, наблюдаем так ли это в логе, во время деплоя.
Запуск приложения локально
Конечно, команда должна выполняться при включенном виртуальном окружении. heroku local запустит сервер на 5000 порту. Если все прошло удачно, двигаемся дальше, если нет - анализируем вывод команды.
Деплой на Heroku
Добавляем новые файлы и делаем коммит
Логинемся на heroku
Если инстанс уже был создан и привязан к приложению, а теперь нужно задеплоить на другой инстанс, проделываем следующее:
Если мы хотим просто переименовать инстанс, то выполняем такую команду
Теперь можно делать деплой:
Если во время деплоя что-то пошло не так, исправляем ошибки, делаем коммит, затем снова деплой
После этого увидим красивый отчет об установке:
После этого остается лишь посмотреть адрес нашего приложения в админке сервиса и скопировать его в браузер :)
Дополнительные действия
Возможно, после загрузки нашего приложения на heroku потрбуется выполнить какие-то дополнительные действия, например, применить миграции или создать суперпользователя:
Custom domain
Бесплатный тир heroku так же поддерживает custom domain для нашего приложения. Использовать Custom domain достаточно просто: сначла нужно подключить домен к приложению
Затем добавить запись CNAME у доменного провайдера, ссылающуюся на DNS Target из таблички, примерно так
Точка в конце DNS Target может присутствовать, а может и нет, в зависмости от требований DNS провайдера.
Читайте также: