Напишу вам небольшой гайд, как деплоить 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 можете прочесть здесь.

Уточню лишь пару моментов:

  1. "SSL mode" нужно установить в Require

  2. В "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)


  1. ProstakovAlexey
    21.08.2022 21:17
    +2

    Пробовал вчера зайти на heroku со старым аккаунтом - не пустил, проблема с логиным или паролем. Попробовал завести новый - ваша страна не обслуживается. Старый инстанс с python ботом правда работает.


    1. AndreyLeshko Автор
      22.08.2022 11:18
      +1

      У меня аккаунт был) Я попробую создать новый, потом если что допишу как обойти блокировку


  1. Adilet-novichok
    23.08.2022 01:18

    Советую посмотреть на dj_database_url


    1. AndreyLeshko Автор
      23.08.2022 08:24

      Спасибо за совет, добавил как альтернативный вариант. Но я всё-же предпочту прописать руками)