Привет!
Сегодня развернем приложение посерьезнее, 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 приложение!