Skip to content

paracosm17/django-gunicorn-postgres-nginx-docker

Repository files navigation

Django + gunicorn + postgres + nginx + docker deploy

Это небольшая шпаргалка по деплою django приложения с помощью docker.
Вместо чистого Django используется CMS Wagtail (надстройка над Django), но в целом, разницы особой нет. Структура проекта та же.
Проект полностью чистый, от сюда можно брать только часть, связанную непосредственно с деплоем

Запуск

Без докера

Запуск без докера больше подойдет для этапа разработки, чтобы быстренько запускать проект из консоли с помощью встроенного в джанго тестового сервера

git clone https://github.com/paracosm17/django-gunicorn-postgres-nginx-docker djangodeploy && cd djangodeploy
python manage.py makemigrations &&
python manage.py migrate &&
python manage.py createsuperuser &&
python manage.py runserver

Через докер

git clone https://github.com/paracosm17/django-gunicorn-postgres-nginx-docker djangodeploy && cd djangodeploy
mv .env.dist .env

Также предварительно можете отредактировать файл .env

sudo docker compose up --build

Как всё работает

В docker compose собираются 3 контейнера из 3 образов: nginx, postgresql, и третий это само наше приложение, оно билдится из папки с проектом.

Postgres

По части postgres Вам ничего трогать не нужно. Имя БД, имя пользователя для бд и пароль указываете в файле .env
Во внешнюю систему соединение с бд будет пробрасываться по порту 5439, это можно изменить в docker-compose.yml если вдруг 5439 занят
В остальном, всё уже настроено и ничего трогать не нужно. Также написан небольшой скрипт в docker-entrypoint.sh который ждёт запуска бд, только потом стартует джанго приложение.

Nginx

Если вы хотите более тонкую настройку nginx, можно изменить конфигурационный файл nginx/templates/default.conf.template
Использование темплейта объясняется тем, что используются переменные среды, а конфигурационные файлы nginx их не видят, поэтому нужен шаблон.
Подробнее тут - https://hub.docker.com/_/nginx (Using environment variables in nginx configuration (new in 1.19))
Порт, по которому будет доступно само приложение в вашей внешней системе (за пределами контейнера) настраивается через переменную PORT в .env. По дефолту там порт 666, поэтому заходите по адресу http://localhost:666

UPD: Я забыл, что убрал переменные среды из конфига nginx, поэтому по сути темплейты больше не нужны. Но пусть останутся, будете знать как прокинуть туда переменные.

Django

Для джанги используются 2 файла настроек dev или production. Каждый из них ипортирует в себя всё что есть в базовых настройках, они отличаются между собой переменными DEBUG, EMAIL_BACKEND, DATABASES
Проект настроен так, что его можно запустить и без переменных окружения, поэтому в некоторые переменные в настройках подставятся дефолтные значения, на случай, если переменные среды не указаны. Например, будет использоваться файл настроек dev, а там используется бд sqlite3, где логины, пароли, порты и т д не нужны
Также настроено автосоздание суперпользователя в docker-entrypoint.sh. Данные для создания берутся из .env

Заключение

Проект показывает базовую настройку для деплоя джанго проекта с помощью докера. Nginx нормально проксирует все запросы, вся статика работает. Постгрес нормально запускается и сохраняет в себя данные. Джанго приложение нормально запускается и работает.

About

django-gunicorn-postgres-nginx-docker template

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published