Для запуска проекта на машине должен быть установлен docker
Для разработки требуется python версии не ниже 3.6
Быстрый запуск
Основная часть проекта состоит из шести контейнеров:
- kip_api - контейнер API
- kip_db - контейнер СУБД MariaDB
- kip_nginx - контейнер nginx
- kip_fluentd - контейнер FluentD для сбора логов
- kip_es - контейнер elasticsearch
- kip_kibana - контейнер Kibana
Nginx был добавлен в проект в связи с тем, что сервис API запускается под GUnicorn, который неспособен отдавать статические файлы, что приводит к порче ссылок на компоненты административной панели Django (например, css-стили), из-за чего она выглядит непрезентабельно.
Для упрощения я не стал делать отдельный Dockerfile для сборки своего nginx с копированием конфигурации непосредственно в контейнер, а просто сделал соответствующий маппинг в docker-compose.yml
Для запуска проекта выполните в его папке команды:
sudo sysctl -w vm.max_map_count=262144
docker-compose up -d --build
Первая команда нужна для корретного старта контейнера ElasticSearch.
Посмотрите, какой адрес назначен сервису kip_nginx:
docker ps -q | xargs docker inspect --format "{{ .Id }} - {{ .Name }} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}"
Перейдите по адресу
http://nginx_ip/admin
Данные для авторизации по умолчанию:
email: admin@admin.com
пароль: admin
Сервис может ответить не сразу, так как он ожидает полной инициализации контейнера СУБД.
Контейнеры kip_fluentd, kip_kibana, kip_es были добавлены для того, чтобы можно было централизованно просматривать и анализировать логи работы приложений.
Для просмотра логов перейдите по адресу:
http://kibana_ip:5601/
В качестве обшей шины данных используется кластер брокера сообщений RabbitMQ. В целях реализации задачи асинхронной отправки почты был написан отдельный процесс, который занимается исключительно отправкой сообщений электронной почты. Все клиенты, которым необходимо отправить письмо, помещают в шину данных сообщение в определенном формате и в определенную очередь.
Подробности запуска кластера описаны в документации на шину данных
Разработка
Для выполнения разработки можно поднять отдельно сервер MySQL командой:
docker run -d -p 3306:3306 --name mysqlserver --restart always -e MYSQL_ROOT_PASSWORD=12345 \
-v ~/kip/mysql_data:/var/lib/mysql mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysqlserver
Полученный адрес указать в файле .env в переменной DB_HOST
По адресу http://nginx_ip/swagger/ доступно краткое описание API, которое будет детализироваться в процессе разработки
Для остановки и удаления всех контейнеров проекта выполните в его папке команду:
docker-compose down
Все данные сохранятся, если вы не удалите папку, которая монтируется в сервисе database в файле docker-compose.yml
Для управления тестовыми данными можно использовать команду:
$ python3 manage.py prepare_data
Для получения параметров команды выполните:
$ python3 manage.py prepare_data --help
Пример для добавления новых данных:
$ python3 manage.py prepare_data --fill --users 1 --categories 5 --courses 5 --groups 1 --lessons 10
Выполнение этой команды приведет к созданию 1 пользователя, 5 категорий, 5 курсов в каждой категории, 1 группе в каждом курсе и 10 уроков в каждой группе
Пример для удаления всех данных:
$ python3 manage.py prepare_data --clear
В настроящее время на приватном GitLab настроена и выполняется сборка образа и его отправка в Docker Hub. Демо проекта доступно по адресу:
Админка:
https://kip.sk-developer.ru/admin/
API:
https://kip.sk-developer.ru/api/v1/
Тестирование
Тестирование выполняется в несколько этапов
Этап 1. Тестирование моделей
Тестирование моделей упрощено и сводится к проверке:
- заполненности у моделей свойств verbose_name и verbose_name_plural
- проверка соответствия имени модели заданному
- проверке наличия необходимых полей
- проверке установки свойства unique у полей (если необходимо)
- проверке корректности работы функций в модели (чаще всего это str())
Этап 1. Тестирование API
Тестирование API в общем заключается в доступности endpoints, а также в проверке корректности ответов API. Также тестируются пользовательские функции в моделях.
Уровень покрытия тестами показывается в специальной метке вверху документа
Для определения уровня покрытия, а также обновление статистики сервиса codecov.io необходимо выполнить команды:
pytest --cov --cov-append
codecov --token=<codecov.io token>
Для оперативной реакции на возникающие ошибки добавлена интеграция с сервисом sentry.io