Найти тему
Deployme

Развертывание Python Django приложения в Деплойми

Привет!

Сегодня развернем приложение посерьезнее, Python Django приложение с базой данных и сборкой фронта через webpack.

В качестве основы используем два проекта:

https://github.com/khadegd/django-webpack-starter

https://github.com/nickjj/docker-django-example

В первой части статьи рассмотрим развертывание с помощью Heroku Buildpack, а во второй с помощью Dockerfile.

В качестве иллюстрации к статьям - используем видео https://youtu.be/RTmTaAh1eh8.

Да-а, это будет посложнее предыдущих примеров, но все должно получиться – засекайте время!

Изучим код первого примера:

https://github.com/khadegd/django-webpack-starter

Невооруженным глазом видим, что для того, чтобы запустить проект нужно использовать три директивы, которые khadegd указал в файле Readme.md.

yarn run build-prod // cборка фронтовой части
python manage
.py collectstatic // cборка статических файлов
python manage
.py runserver_plus 0.0.0.0:8000 --insecure // запуск сервера

Ищем в коде Dockerfile, но его нет. Значит для развертывания  в Деплойми будем использовать предустановленный тип приложения Django+Nodejs.

Предустановленный тип использует Heroku Buildpack (набор сценариев установки зависимостей и запуска приложения), поэтому Dockerfile нам и не нужен вовсе.

Что с базой данных? Мы же хотим ее привязать к приложению.

Смотрим код, в файле ./app/settings.py находим информацию о подключению к БД

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

Khadegd использует sqlite3, но она не подойдет, так как при развертывании проекта происходит полная пересборка и данные, сохраненные в контейнере, будут утеряны.

Вместо sqlite3 будем использовать PostgreSQL, которую развернем как подключаемый сервис в Деплойми.

Теперь обратим внимание на сборку фронтэнда, посмотрим в файл package.json.

Директиву сборки Khadegd назвал “build-prod”, это проблема, так как автоматика Buildpack при развертывании будет искать стандартную директиву “build-prod”.

В целом, других особенностей  нет, можно приступить к небольшим доработкам кода и затем развернуть приложение.

Перед этим расскажу немного о развертывании с помощью Buildpack.

Для развертывания через Buildpack основное значение имеют ключевые файлы приложения.

Для python приложения – это файл requirements.txt или Pipfile, найдя такой файл в коде Buildpack установит необходимые для запуска этого типа приложения компоненты и зависимости, указанные в файле. Версию python можно указать в файле runtime.txt, если для запуска приложения требуется версия отличная от последней стабильной.

Для nodejs приложения ключевой файл – package.json, при этом Buildpack запускает директиву build для сборки приложения.

В нашем случае надо использовать два разных Buildpack, так как основное приложение Python, но ему требуется сборка фронтенд с помощью webpack, для которого требуется Nodejs платформа.

На этом закончим с  Buildpackами, приступим к доработкам кода.

Первое, что мы сделаем – добавим новую зависимость в приложение DJ-Database-URL

(https://github.com/kennethreitz/dj-database-url) – эта библиотка позволит подключать к приложению внешний сервис базы данных с использованием переменной окружения DATABASE_URL, значение переменной передаст приложению Деплойми при старте контейнера в формате postgres://USER:PASSWORD@HOST:PORT/NAME

После установки зависимости, скорректируем файл ./app/settings.py

  • в начале файла импортируем библиотеку:

import dj_database_url

  • уберем блок кода подключения к SQLite и пропишем вместо него подключение к БД с помощью DATABASE_URL

DATABASES['default'] = dj_database_url.config(conn_max_age=600)

Второе – скорректируем файл package.json и вернем базовое значение директиве сборки!

Третье – добавим файл, в котором опишем процесс запуска приложения. Такой файл называется Procfile. Пропишем в него команду запуска основного процесса, которую автор указал в описании проекта и команду, выполняющую первичные миграции БД:

release: python manage.py migrate

web: python manage.py runserver_plus 0.0.0.0:$PORT --insecure

Секция “release” определяет, какой процесс будет запущен на этапе релиза – миграции БД.

Секция “web” определяет, какой процесс будет запущен при старте контейнера и доступен по http протоколу.

“$PORT” – переменная окружения определяющая порт, на котором будет работать приложение.

Важно, что мы не указали в этом файле директиву сборки фронтенда и статики,  потому что Buildpack запускает их автоматически при сборке проекта.

С кодом закончили. Давайте уже развернем приложение, а то заждались.

В веб интерфейсе Деплойми создаем приложение, выбрав из предустановленных типов – Django + Nodejs. Этот тип приложения сконфигурирован для запуска приложений, написанных на Python с использованием фреймворка Django и использующий Nodejs для сборки фронтэнда.

В процессе создания приложения - выбираем опцию “Базы данных” и добавляем к нашему приложению PostgreSQL.

Больше никаких параметров указывать не нужно, нажимаем “Создать”. И после недолгого ожидания переходим в раздел свойств приложения, в секцию “Как развернуть” приложение, копируем команду развертывания, вставляем ее в консоль – и  развертывание началось.

После развертывания видим, что приложения развернулось и переходим к экрану авторизации в “амдинку” Django.

Так как приложение создано с чистого листа - добавим пользователя под которым авторизируемся в административной части Django.

Для этого копируем команду входа в приложение обозначенной в блоке “Как запустить что-то внутри контейнера с приложением?”. Входим в контейнер и запускаем команду создания пользователя:

python manage.py createsuperuser

После создания пользоваться - авторизируемся в админку.

Все ОК, мы развернули наше Python Django приложение!

Наука
7 млн интересуются