Напишу вам небольшой гайд, как деплоить Django приложения на Heroku и некоторые тонкости,которые стоит знать.
Heroku - это облачный сервис, позволяющий разместить ваше приложение. Heroku поддерживает несколько языков программирования, в том числе и любимый нами Python :)
Кроме написанного кода, Heroku позволяет добавить аддоны к вашему приложению. С полным списком аддонов вы можете ознакомиться на официальном сайте, а я расскажу о том, как подключить к приложению базу данных PostgreSQL
Что нам понадобится:
Аккаунт на сайте Heroku
Клиент Heroku
Система контроля версий Git
Ну и собственно наш проект на Django
Для начала посмотрим на структуру нашего проекта:
-
Project_name
asgi.py
settings.py
urls.py
wsgi.py
-
App_name
migrations
templates
static
admin.py
apps.py
models.py
views.py
manage.py
Procfile
requirements.txt
runtime.txt
Проект в данном случае содержит только одно приложение, у вас же их может быть сколько угодно. На этом подробно останавливаться не буду. Как создавать Django приложения можете узнать в документации ну или например в этом гайде
А теперь перейдём к тем непонятным файлам из конца списка:
requirements.txt
Начнем с файла requirements.txt. В нём указаны все дополнительно установленые модули. Для работы нашего приложения, нам понадобится установить несколько таких:
Django
psycopg2 (модуль для работы с СУБД PostgreSQL)
gunicorn (веб сервер для запуска приложений на Python)
whitenoise (нужно, чтобы веб сервер мог обслуживать статические файлы)
*Другие модули, для работы вашего приложения
Все эти модули должны быть установлены в вашем виртуальном окружении. Теперь для создания файла с требованиями воспользуемся встроенной командой пакетного менеджера pip. Необходимый нам файл будет создан в текущей директории
pip freeze > requirements.txt
Procfile
Наш следующий кандидат - Procfile. В нем определяют команды для запуска самого приложения. Здесь просто добавьте следующий код:
web: gunicorn Project_Name.wsgi --log-file
Вместо "Project_Name" впишите название вашего Django проекта
runtime.txt
Наш последний испытуемый. Здесь нужно прописать используемую версию Python.Например:
python-3.8.5
Обратите внимание, что можно указать только одну из поддерживаемых Heroku версий языка. Если указать просто python-3.8, то проект не запустится. Список поддерживаемых Heroku версий языка Python здесь
Настройка конфигурации settings.py
В настройках проекта необходимо сделать несколько изменений:
1. Установить DEBUG = False
DEBUG = bool(os.environ.get('DJANGO_DEBUG', True))
Что здесь происходит и зачем оно всё надо? Объясняю: в переменные окружения мы добавим значение DJANGO_DEBUG="" (пустую строку), что сделает значение переменной DEBUG равным False, иначе, если в переменной окружения нет такой переменной (в случае с запуском для разработки), DEBUG будет установлен в True. Это избавит нас от головной боли, когда после разработки забываешь сменить значение с True на False и заливаешь всё на сервер.
2. Добавить домены в список ALLOWED_HOSTS (впишите название своего приложения heroku):
ALLOWED_HOSTS = ['your-app-name.herokuapp.com','127.0.0.1']
3. Добавить путь к папке, где будут храниться статические файлы (STATIC_ROOT) и префикс URL адреса для получения статических файлов (STATIC_URL)
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
4. Скрыть секретный ключ, сформированный Django. Позже мы добавим его в переменные окружения.
SECRET_KEY = os.environ.get('SECRET_KEY', 'cg#p$g+j9tax!#a3cup@1$8obt2_+&k3q+pmu)5%asj6yjpkag')
Если в переменных окружения будет находиться SECRET_KEY, он будет взят оттуда, иначе используется ключ, переданный вторым параметром. Но так как этот ключ прописан в исходном коде приложения, его используем только для разработки.
5. В переменную MIDDLEWARE добавить новый слой (добавить нужно второй слой из указанных, первый и третий используются в django по умолчанию) Важно соблюдать порядок слоёв.
MIDDLEWARE = [
...
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
...
]
6. Установить настройки для подключения к БД. Как создать БД и где найти все данные для подключения будет рассказано чуть ниже.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST' : os.environ.get('POSTGRES_HOST', 'localhost'),
'NAME': os.environ.get('POSTGRES_DB', 'db_name'),
'USER': os.environ.get('POSTGRES_USER', 'username'),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD', 'password'),
'PORT': os.environ.get('POSTGRES_PORT', '5432'),
}
}
Создание базы данных на сервере Heroku
Для начала создадим новое приложение на сайте Heroku
Откроем страницу нашего приложения и на вкладке Resources нажмем "add more add-ons"
В списке аддонов находим Postgres
Жмём "install heroku postgres"
Выбираем бесплатный вариант и вводим название созданного приложения heroku
База данных создана и привязана к приложению. В списке аддонов вашего приложения находим Heroku Postgres и жмём на ссылку
Переходим на вкладку Settings и жмём кнопку "View Credentials..."
И вот, все необходимые для подключения данные
Теперь к базе данных можно подключиться используя, к примеру pgAdmin4.
Как подключиться к удаленному серверу через pgAdmin4 можете прочесть здесь.
Уточню лишь пару моментов:
"SSL mode" нужно установить в Require
В "DB restriction" нужно добавить название базы данных (строка 'Database' на изображении выше)
А теперь переходим в консоль!
Выполним авторизацию в Heroku
heroku login
Добавим в переменный окружения данные для подключения к Postgres и SECRET_KEY. Звездочки меняем на данные для вашей БД, а вопросики на название вашего приложения на Heroku
heroku config:set DJANGO_DEBUG='' -a ?????
heroku config:set SECRET_KEY=***** -a ?????
heroku config:set POSTGRES_HOST=***** -a ?????
heroku config:set POSTGRES_DB=***** -a ?????
heroku config:set POSTGRES_USER=***** -a ?????
heroku config:set POSTGRES_PASSWORD=***** -a ?????
heroku config:set POSTGRES_PORT=***** -a ?????
Второй вариант указания настроек БД:
Heroku рекомендует использовать библиотеку dj-database-url. Если аддон базы данных подключен к вашему приложения, в ваших переменных окружения по умолчанию присутствует переменная DATABASE_URL. Она уже содержит данные для подключения в следующем формате: postgres://USER:PASSWORD@HOST:PORT/NAME
Для использования
1. Устанавливаем пакет dj-database-url
2 В настройках settings.py оставляем настройки подключения к БД без изменений (эти настройки в дальнейшем будут использоваться для разработки), дополнительно прописываем:
import dj_database_url
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)
Значение conn_max_age=500
делает соединение постоянным, что намного эффективнее, чем воссоздавать соединение в каждом цикле запросов. Однако это необязательно и при необходимости можно удалить.
( Не забываем добавить пакет в requirements.txt )
Теперь переходим в папку с вашим проектом и выполним следующие команды:
heroku git:remote -a ?????
git add .
git commit -m "Deploy to Heroku"
git push heroku master
(*Если ваша ветка имеет другое название, то указываете его)
Первая команда укажет с каким приложением Heroku вы хотите работать. Вторая добавляет в коммит все изменения в проекте. Третья создаёт коммит. Четвертая отправляет проект на сервер Heroku
Происходит процесс загрузки проекта на Heroku, ждём завершения и радуемся победе! продолжаем! Вы уже на финишной прямой! Нужно выполнить миграции и создать суперпользователя:
heroku run python manage.py migrate
heroku run python manage.py createsuperuser
А теперь можем идти открывать шампанское, ведь мы закончили. Осталось найти ссылку на странице вашего приложения и вуоля!
Надеюсь эта статья будет кому-то полезна и вы не будете наступать на грабли, на которые наступил я. Пишите комментарии, хвалите, критикуйте, осуждайте))
Более подробно о всех этапах написано тут, если остались вопросы, рекомендую ознакомиться
Всем удачного кодинга!
Комментарии (4)
Adilet-novichok
23.08.2022 01:18Советую посмотреть на dj_database_url
AndreyLeshko Автор
23.08.2022 08:24Спасибо за совет, добавил как альтернативный вариант. Но я всё-же предпочту прописать руками)
ProstakovAlexey
Пробовал вчера зайти на heroku со старым аккаунтом - не пустил, проблема с логиным или паролем. Попробовал завести новый - ваша страна не обслуживается. Старый инстанс с python ботом правда работает.
AndreyLeshko Автор
У меня аккаунт был) Я попробую создать новый, потом если что допишу как обойти блокировку