Вступление
Heroku - это облачная платформа, предоставляющая услуги хостинга. Он поддерживает несколько языков программирования, включая PHP, Node.js и Python. Это платформа как услуга (PaaS), которая позволяет вам управлять приложениями веб-сайтов, одновременно заботясь о ваших серверах, сетях, хранилище и других облачных компонентах.
В этой статье мы рассмотрим, как развернуть приложение Django на Heroku с помощью Git .
Вы можете выполнить те же действия и развернуть приложение с GitHub , если оно там размещено.
Предпосылки
Ниже приведен список вещей, которые необходимо сделать перед тем, как мы приступим к развертыванию:
- Git
- Учетная запись Heroku и интерфейс командной строки
- Приложение Django
Интерфейс командной строки Heroku (CLI) позволяет легко создавать приложения Heroku и управлять ими прямо из терминала. Это важная часть использования Heroku.
Чтобы установить Heroku CLI (он же Heroku Toolbelt ), следуйте инструкциям на официальном сайте .
Убедитесь, что ваше приложение Django работает в виртуальной среде, которую необходимо поддерживать в активном состоянии на протяжении всего процесса развертывания.
Аккаунт Heroku
После того, как были установлены все эти вещи, то следующий шаг заключается в создании бесплатного аккаунта Heroku здесь , если у вас нет учетной записи уже.
После написания в терминале следующего:
$ heroku login
Терминал должен отобразить сообщение вроде:
heroku: Press any key to open up the browser to login or q to exit:
Нажмите любую клавишу и войдите в систему с помощью браузера. Затем терминал отобразит сообщение следующего содержания:
Logged in as [email protected]
Настроить приложение Django для Heroku
Теперь, когда мы сделали все необходимое, давайте подготовим наше приложение Django для Heroku.
Procfile
Procfile - это файл с именем Procfile
без расширения файла,
помещенный в корень вашего приложения. В нем перечислены типы процессов
в приложении, и каждый тип процесса является объявлением команды,
которая выполняется при запуске контейнера / динамометрической станции
этого типа процесса.
Перед созданием Procfile
вы захотите установить django gunicorn
в
каталог вашего проекта:
$ pip install django gunicorn
В то время как Django поставляется со своим собственным сервером WSGI,
наш Procfile
сообщает Heroku использовать Gunicorn для обслуживания
нашего приложения, что также рекомендуется Heroku.
Теперь создайте Procfile
в родительском каталоге и добавьте следующую
строку:
web: gunicorn yourdjangoweb.wsgi --log-file -
Замените yourdjangoweb
фактическим именем вашего проекта.
Runtime.txt
Создайте текстовый файл с именем runtime.txt
в том же каталоге, что и
Procfile
. Он сообщает Heroku, какую версию Python использует ваше
приложение. Если вы не уверены в версии, введите python --version
в
терминале с активированной виртуальной средой Django.
Затем добавьте версию в runtime.txt
:
python-xxx
См. Поддерживаемые версии Python на Heroku здесь .
Разрешенные хосты
Это дополнительная мера безопасности в Django для предотвращения атак
HTTP-заголовка хоста, разрешая обслуживание сайта только на хосте /
доменах, которые добавлены в список ALLOWED_HOSTS
Если Debug = True
и ALLOWED_HOSTS
- []
то по умолчанию разрешен localhost
Чтобы
развернуть и обслуживать ваше веб-приложение на Heroku, добавьте его в
список:
ALLOWED_HOSTS = ['herokuappname.herokuapp.com']
В качестве альтернативы вы можете разрешить все приложения от Heroku, опуская имя приложения, например:
ALLOWED_HOSTS = ['.herokuapp.com']
Вы также можете использовать ['*']
чтобы разрешить все хосты. Вы
можете найти более подробную информацию в
документации
.
Установить пакеты
Ниже приведены дополнительные пакеты, которые необходимо установить в нашей виртуальной среде.
Чтобы подключить нашу базу данных Django к Heroku, установите
dj-database-url
,
позвонив:
$ pip install dj-database-url
Поскольку Heroku использует базы данных Postgres, нам также понадобится его адаптер для Python:
$ pip install psycog2
И, наконец, мы будем использовать WhiteNoise для обслуживания статических файлов на рабочем сервере. Который мы можем установить, позвонив:
$ pip install whitenoise
Мы уже настроили gunicorn
, давайте добавим конфигурацию для
whitenoise
и dj-database-url
.
Настройка статических файлов
Сначала добавьте базовые настройки для обслуживания статических файлов в
любом проекте Django. Вы можете скопировать и вставить следующие
настройки в свой settings.py
:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
PROJECT_ROOT = os.path.join(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'
# Extra lookup directories for collectstatic to find static files
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT, 'static'),
)
-
Добавьте WhiteNoise в
MIDDLEWARE
сразу послеSecurityMiddleware
который должен быть наверху:MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', ]
-
Добавьте
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
в свойsettings.py
.0
Настройка базы данных
Мы используем dj-database-url
для настройки нашей базы данных.
Добавьте эти строки в конец файла settings.py
:
import dj_database_url
prod_db = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(prod_db)
Requirements.txt
Heroku распознает развернутое приложение как приложение Python, только
если у него есть requirements.txt
в корневом каталоге. Он сообщает
Heroku, какие пакеты требуются для запуска вашего приложения.
Для этого мы можем использовать pip freeze
и направить вывод в файл
requirements.txt
$ pip freeze > requirements.txt
Ваш файл requirements.txt
должен включать следующее:
whitenoise==5.2.0
dj-database-url==0.5.0
Django==3.0.9
gunicorn==20.0.4
psycopg2==2.8.5
pytz==2020.1
Примечание . Вышеуказанные версии используются нашим приложением Django, и они могут отличаться для вашего.
Подключите приложение Heroku к Git
Теперь нам нужно создать приложение Heroku:
$ heroku create herokuappname
Он отобразит сообщение «Готово» с двумя URL-адресами в следующих строках:
Creating ⬢ herokuappname... done
https://herokuappname.herokuapp.com/ | https://git.heroku.com/herokuappname.git
Это означает, что для вашего приложения был создан репозиторий Git в
облаке Heroku. URL-адрес https://herokuappname.herokuapp.com/
будет
использоваться для доступа к вашему приложению в любом месте, но нам все
равно нужно сделать еще один шаг перед запуском нашего приложения, т.е.
нам нужно отправить наш код в репозиторий.
Инициализируйте пустой репозиторий в каталоге вашего проекта:
$ git init
> Initialized empty Git repository in /herokuappname/.git/
Подключите приложение Heroku к пустому репозиторию git
$ heroku git:remote -a herokuappname
> set git remote heroku to https://git.heroku.com/herokuappname.git
Добавьте файлы в область подготовки:
$ git add .
Зафиксируйте изменения / файлы:
$ git commit -m "first commit for all files"
Наконец, отправьте проект в git
размещенный на Heroku:
$ git push master heroku
Если все пойдет хорошо, вы увидите такой вывод:
Counting objects: 26, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (26/26), 32.13 KiB | 0 bytes/s, done.
Total 26 (delta 1), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
.....
.....
remote: -----> Launching...
remote: Released v1
remote: https://herokuappname.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/herokuappname.git
[new branch] master -> master
collectstatic Ошибка
Вы можете получить ошибку, связанную с collectstatic
при запуске
команды git push heroku master
. Это связано с каталогом статических
файлов, и вы можете обойти его с помощью следующей команды:
$ heroku config:set DISABLE_COLLECTSTATIC=1
Setting DISABLE_COLLECTSTATIC and restarting ⬢ herokuappname... done, v2
DISABLE_COLLECSTATIC: 1
Он скажет Heroku не запускать collectstatic
во время развертывания
приложения. Вы можете запустить его позже, используя bower
:
$ heroku run 'bower install --config.interactive=false;grunt prep;python manage.py collectstatic --noinput'
Это может произойти по многим причинам, включая, помимо прочего:
- Ваш
STATICFILES_DIRS
пуст вsettings.py
или настроен неправильно. - В вашем
static
каталоге нет файлов для отслеживанияgit
Вы можете добавить любой временный файл в свойstatic
каталог, чтобы он работал.
Перенести базу данных
Последний шаг - отразить ваши models
в базе данных Heroku, выполнив
миграции:
$ heroku run python manage.py migrate
Вот и все, ваше приложение запущено на heroku! Вы можете получить к нему
доступ по адресу [appname].herokuapp.com
. URL-адрес в нашем случае
будет http://herokuappname.herokuapp.com/
.
Добавление собственного доменного имени
Каждое приложение на Heroku размещается на .herokuapp.com
но вы можете
изменить его на свое доменное имя, если оно у вас есть. Процесс прост:
- Войдите в панель управления HerokuÂ
- Выберите ваше текущее приложение из списка:
{.ezlazyload}
- Выберите « Настройки» на панели навигации и прокрутите вниз, чтобы найти раздел « Домен»:
{.ezlazyload}
- Нажмите на Добавить домен, где вы сможете добавить свое доменное имя.
Этот вариант доступен только для проверенных учетных записей. Вам будет предложено ввести данные кредитной карты на Heroku, чтобы подтвердить свою учетную запись. Вы можете найти более подробную информацию о добавлении доменов и субдоменов на этой странице .
Заключение
В этой статье мы развернули приложение Django на Heroku с собственным доменным именем, используя Git.
Помимо различных облачных сервисов, Heroku также предлагает одно из лучших периодов работы серверов, круглосуточную работу и поддержку службы безопасности.