Подготовка Django приложения для локальной разработки и деплоя

6954478900e1c68503da57a02633aa59

Поговорим про настройку приложения для двух сред «разработки» local и условного прода. Локально приложение будет запускаться с установкой всего необходимого на компьютер, то, что дальше я буду именовать продом будет представлять из себя запуск через docker-compose.

Что это за приложение по сути значения не имеет, из особенностей — там будет celery поверх redis и Postgres, как персистентное хранилище. Код приложения можно посмотреть здесь.

Настроим переменные окружения для двух разных сред и подготовим код под это.

Настроим логирование через Loki и Grafan-у. Настроим мониторинг через Prometheus в ту же Grafan-у.

Поехали.

Чтобы не плодить зависимости по всей системе будем использовать venv:

python -m venv venv
source venv/bin/activate   

Как создавать Django приложение я тут описывать не буду, там по сути 3 команды. Допустим вы его создали и у вас уже есть каркас.

В папке проекта нужно создать папку для настроек. Здесь она называется settings.

В ней нужно создать файл __init__.py чтобы python воспринимал папку, как модуль.

Там рядом уже лежит файл settings.py Переименуем его в base.py и переместим в созданную папку settings.

Создадим еще два файла local.py и prod.py. В них будут различия для соответствующих сред от основных настроек.

Например local.py будет начинаться так 

from .base import *

DEBUG = True

DATABASES['default']['HOST'] = ‘localhost'

В prod.py следует, кроме прочего переопределять секретный ключ так

SECRET_KEY = os.environ.get('SECRET_KEY', SECRET_KEY)

Таким образом он будет браться из переменной окружения

Теперь для локального запуска достаточно экспортировать переменную с указанием откуда брать настройки 

export DJANGO_SETTINGS_MODULE=myproject.settings.local

Либо просто запускать с параметром, что кажется удобнее:

python manage.py runserver --settings=myproject.settings.local

Для продового мы укажем эту переменную в .env файле для docker-compose.yml

Так, с запуском и разделением настроек, вроде разобрались.

Давайте теперь посмотрим на Dockerfile запускать приложение для прода мы будем с помощью gunicorn поэтому обратите внимание на последнюю строчку

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]

И не забудьте добавить его в requirements.txt

Но мы все равно переопределим запуск в docker-compose.yml поэтому давайте посмотрим на него

Целиком можно посмотреть здесь

Что в нем:

Два стандартных контейнера с Postgres и redis, два контейнера для запуска основного приложения и celerey

Строка запуска основного приложения выглядит так

entrypoint: /bin/sh -c "python manage.py migrate && python manage.py loaddata cities.json && python manage.py collectstatic --noinput && gunicorn --bind 0.0.0.0:8000 itjobs.wsgi:application»

Тут мы выполняем миграции, наполняем базу фикстурой, если есть и собираем статические файлы

Поверх всего этого рулит nginx, он проксирует запросы на основное приложение и отдает статику.

Ах да обратите на эти две строчки в основных настройках 

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, ‘staticfiles')

Они скажут куда собирать статические файлы и по какому урлу к ним обращаться.

Так как мы хотели собирать метрики для прометеуса нам нужно установить соответствующий пакет django-prometheus

И добавить в блок MIDDLEWARE в настройках, вначале 

'django_prometheus.middleware.PrometheusBeforeMiddleware',

и

'django_prometheus.middleware.PrometheusAfterMiddleware',

в конце

А еще добавить path ('', include («django_prometheus.urls')), в файл urls.py

Таким образом метрики будут выдаваться по урлу /metrics

nginx.conf базово выглядит так 

server {
    listen 80;
    server_name server;

    location /static/ {
        alias /app/staticfiles/;
    }

    location /metrics {
        access_log off;

        # Allow white list access
        allow 192.168.1.1;

        # Запрещаем доступ всем остальным
        deny all;

        proxy_pass http://web:8000;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        access_log /dev/stdout json_analytics;

        proxy_pass http://web:8000;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Здесь мы не логируем запросы к метрикам, отдаем статику и проксируем все остальные запросы на основное приложение

Полный файл тут

Там в начале еще формат логов указан, оставьте только то что хотите логировать.

И так, для запуска прода нам нужно просто создать .env файл, положить туда необходимые настройки и SECRET_KEY и стартовать все это с помощью docker-compose up --build

С логированием и сбором метрик разберемся во второй части.

© Habrahabr.ru