Деплой Django + Postresql на Heroku

В настоящее время существуют облачные платформы, такие как heroku и redhat openshift, которые предоставляют возможность бесплатно разместить у себя ваше приложение. Конечно бесплатный тариф имеет множество ограничений, но он может отлично подойти для учебного проекта или какого-нибудь простого приложения не требующего много ресурсов.

heroku

Heroku предоставляет бесплатно 500 mb на диске и 512 mb RAM (подробнее тут - https://devcenter.heroku.com/articles/limits). Также есть возможность использовать свой домен. Приложение работает в специальном Unix-контейнере, который называется Dyno. Free plan предоставляет 1 dyno без возможности масштабирования. Также время работы ограничено 1000 часами в месяц и приложение “засыпает” после 30 минут без активности. В dyno используется эфемерная файловая система. Это означает, что созданные приложением файлы удаляются.

настроика окружения

Развертывание приложения в heroku осуществляется с помощью git. Для начала необходимо установить heroku cli и выполнить аутентификацию с помощью heroku login. Затем, в папке с вашим приложением нужно выполнить команду heroku create, которая создаст в git удаленный репозиторий с названием heroku.

Перед отправкой в репозиторий нужно настроить приложение. Необходимо скрыть SECRET-KEY и другие секретные переменные. Для этого можно использовать переменные окружения. В Heroku переменные окружения можно задавать в личном кабинете, либо командой heroku config:set.

Для установки библиотек python heroku использует pipenv. Если вы еще не используете pipenv, то установить его можно через pip, командой pip install pipenv. Далее командой pipenv install из файла requiremnts.txt будут созданы файл с зависимостями Pipenv и Pipenv.lock, которые используются вместо requirements.txt. Для запуска django приложения потребуется web-сервер gunicorn.

pipenv install gunicorn

Чтобы настроить запуск django через gunicorn, нужно создать файл Procfile содержащий в себе команду:

web: gunicorn yourapp-name.wsgi

Heroku по умолчанию не может отдавать staticfiles. Чтобы это исправить можно использовать whitenoise.

pipenv install whitenoise

settings.py

MIDDLEWARE = [
    'whitenoise.middleware.WhiteNoiseMiddleware',]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

настроика postgres

Для соединения dyno с базой данных используется переменная DATABASE_URL. Для парсинга переменной в формат django, рекомендуется использовать dj-database-url.

pipenv install dj-database-url

settings.py

# Heroku: Update database configuration from $DATABASE_URL.
import dj_database_url
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)

Для работы с postgresql потребуется установить addon Heroku Postgres.

heroku addons:create heroku-postgresql:<PLAN_NAME>

deploy

После всех необходимых настроек отправляем приложение в heroku командой

git push heroku master.

Запускаем миграции

heroku run python manage.py migrate

Если выкатка прошла без ошибок, то приложение можно открыть командой heroku open. Посмотреть логи можно командой:

heroku logs --tail
Written on June 25, 2018