Бэкенд для проекта Старшие Братья Старшие Сестры https://www.nastavniki.org/
Python 3.9+
Django
Django REST Framework
Poetry
Docker
Factory-Boy
Проект предполагает 2 типа запуска: локально и в полноценном режиме. В обоих случаях используется docker. В обоих случаях нужно задать переменные окружения.
- Запуск локально — в docker используется только база данных (PostgreSQL). Пример использования — local.yaml
- Запуск в полноценном режиме — в docker будут помещены БД, код проекта, статика и медиа раздается nginx. Пример использования — production.yam
Контейнерам нужны переменные окружения для хранения секретов. Структура переменных окружения (разделение для локального запуска и в продакшн):
.envs/
├── .local
│ ├── .env
└── .prod
├── .django
└── .postgres
-
Сколонируйте репозиторий проекта и перейдите в папку проекта:
git clone git@github.com:ivartm/bbbs.git cd bbbs
-
Установите рабочее окружение и зависимости (управляются через poetry). Файлы requirements вручную редактировать не нужно
poetry shell poetry install --no-root pre-commit install
-
Убедитесь что установлен и запущен docker и docker-compose
-
Запустите контейнер с БД:
docker-compose -f local.yaml up --build -d
-
Локальный сервер не будет работать корректно без API ключей Mailjet и Youtube. Задайте их в переменных окружения:
- создайте в корне проекта файл '.env', скопируйте в него содержимой файла '.envs example/.local/.env'
- укажите значение ключей. Их можно узнать у вашей команды
- Зпустите проект, он будет использовать БД в контейнере:
python manage.py runserver
- Остановить контейнер с БД:
docker-compose -f local.yaml down
- Остановить контейнер с БД удалив данные:
docker-compose -f local.yaml down --volumes
Используется github Actions, workflow build_and_deploy.yaml Чтобы проект развернулся и работала автоматизация выполните шаги:
-
Склонируйте папку проекта на сервер
git clone git@github.com:ivartm/bbbs.git cd bbbs
-
Задайте переменные окружения. Какие именно переменные нужны и как их задавать в папке '.envs example'
.envs/ └── .prod ├── .django └── .postgres
-
В github создайте environment назвав его "production_environment" и задайте ключи доступа к github и серверу
- COMPOSE_FILE
- DOCKER_PASSWORD
- DOCKER_USERNAME
- HOST
- SSH_KEY
- USERNAME
-
При следующем пуше в ветку "main", если тесты пройдены успешно проект будет выгружен на сервер и перезапущен
- Чтоб не указывать файл yaml каждый раз его можно сохранить в env:
export COMPOSE_FILE=local.yaml # тут экспортировали файл для локальной разработки docker-compose up --build -d
- Выполнить команду внутри контейнера:
docker-compose exec {контейнер в котором выполнить} {команда}
- Например заполнить базу тестовыми данными:
docker-compose exec django python manage.py filldb
- Или создать только 200 мероприятий базу тестовыми данными:
docker-compose exec django python manage.py filldb --event 200
- Создать суперпользователя:
docker-compose exec django python manage.py createsuperuser
- Как смотреть что происходит в контейнерах:
- Запустить контейнеры интерактивно (не использовать флаг -d (--detach , -d)):
docker-compose up
- Если контейнеры уже запущены в фоновом режим, то можно выводить журнал. Например контейнера django:
docker-compose logs --follow django
- Запустить контейнеры интерактивно (не использовать флаг -d (--detach , -d)):
Управляется poetry. Детальное описание в документации poetry
Если кратко, то:
- добавить пакет в список зависимостей для Production
poetry add {название пакета}
- установить пакет в окружение разработки (dev):
poetry add --dev {название пакета}
- обновить список зависимостей:
poetry update
- узнать путь до интепретатора:
poetry env info --path
Настроена интеграций с pre-commit для проверки кода и более простой интеграции с CI/CD.
Выполняются:
- стандартные хуки для общего качества кода
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- id: check-merge-conflict
- проверка PEP8 flake8
- сортировка импортов isort (поддержка формата black)
- проверка PEP8 black
- если есть изменения в poetry.lock или pyproject.toml, то обновляются файлы с зависимостями в requirements/. Добавляйте изменения в коммит.
Выполнить pre-commit хуки локально:
pre-commit run ----all-files
Обновить версии репозиториев с pre-commit хуками:
pre-commit autoupdate
Разделены на 3 ветки prod.py, dev.py, local.py, находятся в config/settings Корневые настройки в base.py
Хорошая практика при разработке использовать local.py. После окончания тестирования переносить в dev, prod, base в зависимости от значимости.
По умолчанию проект запускается с локальными настройками в confg.settings.local
Запуск с определенной конфигурацией:
python manage.py runserver --settings=config.settings.dev
Запуск с предустановленными параметрами:
- все города из предустановленного списка + 10 случайных
- 200 случайных событий
- 15 случайных кураторов
- 10 случайных тегов для Права ребенка
- 70 случайных Прав ребенка с 1 до 5 тегов (случайным образом)
- 70 случайных пользователей, который зарегистрированы на 0-5 мероприятий
- 15 тегов для Вопросы
- 70 случайных Вопросов с 1 до 15 тегов (случайным образом)
- 5 Вопросов без тегов
- 5 Вопросов без ответов
- 15 тегов "Куда пойти"
- 70 случайных "Куда пойти" с 1 до 5 тегов (случайным образом)
- 70 статей в Справочнике
- 10 случайных тегов для Фильмов
- Фильмы с 1 до 5 тегами из сохраненного списка links (случайные данные не подходят: ссылки не будут работать)
- 50 записей в дневнике для случайных пользователей
- 70 случайных статей в "Статьи"
- 2 тега для книг: Художественные и Научные
- 50 случайных книг
- 15 случайных тегов для "Видео"
- Видео с 1 до 5 тегами из сохраненного списка links (случайные данные не подходят: ссылки не будут работать)
- 30 случайных "История дружбы"
- 100 случайных картинок для "История дружбы"
- главную страницу
./manage.py filldb
так же есть возможность опционально добавлять тестовые данные, подробности в help:
./manage.py filldb --help
для очистки таблиц БД (но не удаление!) можете воспользоваться стандартной командой Django:
./manage.py flush
Запуск django сервера c локальными настройками
make runserver
Собрать статику
make build-static
Заполнить базу тестовыми данными:
make filldb
БД + создать суперпользователя (запросит реквизиты):
make filldb-with-superuser:
Создать и применить миграции, без заполнения данными
make migrate
Создать суперпользователя:
make createsuperuser
Запуск shell plus (должен быть установлен)
make shell
Сгенерирвоать новый SECRET_KEY и показать его на экране:
make gen-secretkey
pytest
.../swagger/
.../redoc/,