Подготовка Django приложения для локальной разработки и деплоя
Поговорим про настройку приложения для двух сред «разработки» 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
С логированием и сбором метрик разберемся во второй части.