- docker
- docker compose
- python 3.8+ (опционально, для локального запуска pytest/flake8/mypy)
- poetry (опционально, для локального запуска pytest/flake8/mypy)
Перед запуском контейнеров, необходимо убедиться, что директории docker присутствует файл .env, в котором заполнены все необходимые переменные окружения.
Названия этих переменных можно посмотреть в .env.example
Подробное описание переменных окружения
Ссылка на container registry. Необходимо заполнить, если используется compose файл с указанными image для кастомных сборок (например, docker-compose.main.yml)
Окружение (development, production, testing, etc). Может быть использовано для различных нужд в рамках проекта
Название проекта
Секретный ключ для Django
Режим отладки
0 - выключен
1 - включен
Если включен, то:
- 500 ошибки сервера не будут обработаны обработчиком исключений
- В логах будут отображаться запросы в БД, генерируемые в рамках запроса
Режим прод окружения
0 - выключен
1 - включен
Если выключен, то:
- Будет доступна документация swagger-ui/redoc
- Работа с платежными системами будет работать в боевом режиме
- Чувствительные данные будут исключены из логов
Путь к директории, в которой хранятся медиа-файлы
Префикс в ссылке для медиа-файлов
Путь к директории, в которой хранятся статические файлы
Префикс в ссылке для статических-файлов
Путь к директории, в которой хранятся лог-файлы
Флаг, который определяет, запускается ли проект через gunicorn
При первом запуске DB_NAME, DB_USER, DB_PASSWORD могут быть любыми
При дальнейших запусках DB_NAME, DB_USER, DB_PASSWORD должны быть такими же, как при первом запуске
DB_HOST должен соответствовать названию сервиса БД из compose конфигурации
DB_PORT должен соответствовать порту БД из compose конфигурации
NGINX_OUTER_PORT - порт, через который можно обращаться к контейнеру nginx
NGINX_INNER_PORT - порт, на который будут переадресовываться все запросы внутри контейнера nginx
WSGI_PORT - порт, по которому можно обращаться к wsgi сервису
RABBITMQ_HOST должен соответствовать названию сервиса RabbitMQ из compose конфигурации
RABBITMQ_PORT - любой доступный на хосте порт
При первом запуске RABBITMQ_USER, RABBITMQ_PASSWORD могут быть любыми
При дальнейших запусках RABBITMQ_USER, RABBITMQ_PASSWORD должны быть такими же, как при первом запуске
CELERY_BROKER_URL - ссылка для доступа к брокеру сообщений
CELERY_RESULT_BACKEND - бэкенд для хранения результатов выполнения задач
REDIS_HOST должен соответствовать названию сервиса Redis из compose конфигурации
REDIS_PORT - любой доступный на хосте порт
REDIS_PASSWORD - пароль от пользователя default
LOGGING_SENSITIVE_FIELDS - чувствительные поля, которые нужно игнорировать при записи лога. Должны быть разделены через запятую, без пробелов
LOGGING_LOGGERS - названия логеров. Должны быть разделены через запятую, без пробелов
LOGGING_MAX_BYTES - максимальное кол-во байт на один лог файл
LOGGING_BACKUP_COUNT - максимальное кол-во бэкап файлов для логов
RESTART_POLICY - политика рестарта контейнеров
NGINX_VERSION - версия Nginx
POSTGRES_VERSION - версия PostgreSQL
REDIS_VERSION - версия Redis
RABBITMQ_VERSION - версия Rabbitmq
WSGI_TARGET - образ для сборки wsgi сервиса
CELERY_TARGET - образ для сборки celery worker сервиса
BEAT_TARGET - образ для сборки celery beat сервиса
*_CPUS - лимит ядер на контейнер
*_MEM_LIMIT - лимит памяти на контейнер
*_MEM_RESERVATION - запас памяти на контейнер
TRACING_EXPORTER_ENDPOINT - эндпоинт для отправки трейсов
OTEL_PYTHON_DJANGO_INSTRUMENT - вкл/выкл трейсинг
docker-compose -f docker/docker-compose.yml -f docker/docker-compose.local.yml upили
make localupПосле запуска проект будет доступен по адресу http://localhost:.../
docker-compose upили
make updocker-compose -f docker/docker-compose.yml -f docker/docker-compose.main.yml upили
make mainupПроект станет доступен по порту ${NGINX_OUTER_PORT}
В локальном окружении достаточно перейти по адресу http://localhost:${NGINX_OUTER_PORT}/
В другом окружении необходимо настроить домен, при обращении к которому веб-сервер (Nginx/Apache) будет проксировать все запросы на порт ${NGINX_OUTER_PORT}
Если на хосте установлена docker compose версии >2, то может возникнуть ошибка синтаксиса команды. В таком случае в командах выше нужно заменить
docker-composeна
docker compose- Используемый язык программирования —
Python ... - Используемый фреймворк —
Django ... - Используемая СУБД —
PostgreSQL ... - Используемая для кэширования NoSQL БД —
Redis ... - Используемый брокер сообщений —
RabbitMQ ... - Используемая асинхронная очередь задач —
Celery ...
gunicorn (...)— HTTP-сервер для Djangopsycopg (...)— библиотека для работы с PostgreSQL в Pythonredis (...)— библиотека для работы с Redis в PythonCelery (...)— библиотека для асинхронных очередей задачamqp (...)— библиотека для работы с amqp-протоколомJSON-log-formatter (...)— библиотека для форматирования логов в JSON-форматеdependency-injector (...)— библиотека для внедрения зависимостей (DI)pytest (...)— библиотека для тестированияpytest-django (...)— библиотека для тестирования Django-приложений через pytestpytest-cov (...)— библиотека для оценки покрытия кода тестами через pytestpytest-mock (...)— библиотека для мока зависимостей через pytestpytest-timeout (...)— библиотека для ограничения времени выполнения тестов через pytestconcurrent-log-handler (...)— библиотека для последовательной записи логов в файлы при запуске веб приложения через несколько воркеров (как в gunicorn)mypy (...)— статический анализатор типовflake8 (...)— инструмент линтинга для Pythonblack (...)— библиотека для форматирования кода на языке Pythonisort (...)- библиотека для сортировки импортов
-
Зайти в контейнер
wsgiчерез командуdocker exec -it ${PROJECT_NAME}-wsgi bash
-
Начать выполнение тестов через команду
pytest
или
make testПри таком запуске тесты, в которых тестируется работа с БД, выполнятся с ошибкой
При ошибке выполнения команды запустите тесты внутри Docker-контейнера
-
Перейти в директорию с конфигурационным файлом
-
Начать выполнение тестов через команду
poetry run pytest
-
Зайти в контейнер
wsgiчерез командуdocker exec -it ${PROJECT_NAME}-wsgi bash
-
Начать выполнение flake8 через команду
flake8 .
или
make flake8-
Перейти в директорию с конфигурационным файлом
-
Начать выполнение flake8 через команду
poetry run flake8 .
-
Зайти в контейнер
wsgiчерез командуdocker exec -it ${PROJECT_NAME}-wsgi bash
-
Начать выполнение mypy через команду
mypy .
или
make mypyПри возникновении ошибок запуск возможен только внутри Docker-контейнера
-
Перейти в директорию с конфигурационным файлом
-
Начать выполнение mypy через команду
poetry run mypy .
При разработке рекомендуется использовать black, чтобы поддерживать чистоту кода и избегать лишних изменений при работе с гитом.
Пример конфигурационного файла для Visual Studio Code .vscode/settings.json:
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true
}
}При разработке рекомендуется использовать pre-commit, чтобы перед формированием МР код был уже подготовленным и поверхностно проверенным (например, через flake8)
Для использования должны быть установлены dev-зависимости
Установка
poetry run pre-commit installУдаление
poetry run pre-commit uninstallПосле установки, при каждом коммите будут отрабатывать хуки из конфигурационного файла, предназначенные для коммитов (stages: [commit])
Установка
poetry run pre-commit install --hook-type pre-pushУдаление
poetry run pre-commit uninstall -t pre-pushПосле установки, при каждом пуше будут отрабатывать хуки из конфигурационного файла, предназначенные для пушей (stages: [push])
При разработке рекомендуется использовать pre-commit, чтобы перед формированием МР код был уже подготовленным и поверхностно проверенным (например, через flake8)
Для использования должны быть установлены dev-зависимости
Установка
poetry run pre-commit installУдаление
poetry run pre-commit uninstallПосле установки, при каждом коммите будут отрабатывать хуки из конфигурационного файла, предназначенные для коммитов (stages: [commit])
Установка
poetry run pre-commit install --hook-type pre-pushУдаление
poetry run pre-commit uninstall -t pre-pushПосле установки, при каждом пуше будут отрабатывать хуки из конфигурационного файла, предназначенные для пушей (stages: [push])
Для удобного запуска контейнеров, их сборки, запуска тестов и т.п. в проекте есть Makefile
Для выполнения инструкции, на примере запуска тестов, нужно выполнить команду
make testОсновные правила работы с ветками на проекте:
develop— ветка разработки.- Собирается и разворачивается на dev-сервере;
feature/{feature-slug}— feature-ветка.- Создается только из ветки develop;
- По готовности создается MR в ветку develop.
bugfix/{bug-slug}— bugfix-ветка.- Создается только из ветки develop;
- По готовности создается MR в ветку develop.
release/{major}.{minor}— release-ветка.- Создается только из ветки develop;
- Считается как release-candidate;
- Собирается и разворачивается на stage-сервере (пока не утверждено, как вариант);
- Прямо в ветке могут быть пофикшены баги, без MR;
- Все пофикшенные в ветке баги должны быть смержены в develop, желательно сразу по готовности бага, чтобы не упустить фикс;
- По готовности создается MR в ветку main.
- Правила изменения версии релиза:
minorверсия увеличивается при изменениях, не нарушающих обратную совместимость. Т.е. при этих изменениях пользователи API продолжат работу без необходимости вносить изменения;majorверсия увеличивается при изменениях, нарушающих обратную совместимость.- В идеале, major версия должна совпадать с последней версией API, т.к. новая версия API внедряется по такому же принципу - при появлении изменений, нарушающих обратную совместимость.
hotfix/{bug-slug}— hotfix-ветка.- Создается только из ветки main;
- По готовности создается MR в ветку main.
main— прод ветка.- Собирается и разворачивается на prod-сервере;
- После слияния MR в эту ветку создается tag и release по этой ветке (т.е. по последнему коммиту этой ветки).
TBD
TBD
TBD
TBD
Заметки о релизах ведутся начиная с версии 1.0.0
По готовности релиза в release/* ветке или при хотфиксе в hotfix/* ветке, нужно обновить файл CHANGELOG.md.
Заметки о новом релизе добавляются в начало файла, т.е. до предыдущего релиза. Шаблон заметки о релизе
## 1.1.0 (2024-01-01)
Security:
-
Features:
-
Bugfixes:
-
При необходимости, можно вести заметки о будущем релизе прямо в ветке develop. В таком случае, вместо даты релиза нужно писать unreleased, который потом следует заменить на фактическую дату релиза
## 1.2.0 (unreleased)
Security:
-
Features:
-
Bugfixes:
-