- перенесены тесты parsers из src/apps/parsers/tests в tests/apps/parsers - обновлены тесты задач под текущее поведение Celery (ошибки пробрасываются исключениями) - убрана зависимость тестов от внешнего брокера через локальные eager-вызовы - добавлены/уточнены фабрики и импорты для единой структуры тестов - обновлены README и CHANGELOG с новым правилом размещения тестов и запуском
300 lines
8.8 KiB
Markdown
300 lines
8.8 KiB
Markdown
# Mostovik Backend
|
||
|
||
Backend-сервис на Django/DRF для сбора, хранения и выдачи данных из государственных источников (Минпромторг, ЕРП, ЕИС закупок, ФНС), с асинхронной обработкой через Celery.
|
||
|
||
## Что умеет проект
|
||
|
||
- JWT-аутентификация и профиль пользователя.
|
||
- Swagger UI документация API.
|
||
- Health/Liveness/Readiness эндпоинты.
|
||
- Фоновые задачи с трекингом статуса (`BackgroundJob`).
|
||
- Парсеры источников:
|
||
- Минпромторг: сертификаты и реестр производителей.
|
||
- Единый реестр проверок (`proverki.gov.ru`, включая 248-ФЗ/294-ФЗ).
|
||
- Закупки (`zakupki.gov.ru`, SOAP API с токеном).
|
||
- ФНС: загрузка и обработка Excel-отчётности (`fin_{id}_{ogrn}.xlsx`).
|
||
- Админ-панель на Jazzmin для мониторинга данных и логов загрузок.
|
||
|
||
## Технологии
|
||
|
||
- Python 3.11
|
||
- Django 3.2
|
||
- Django REST Framework
|
||
- PostgreSQL 15
|
||
- Redis 7
|
||
- Celery + django-celery-beat + django-celery-results
|
||
- drf-yasg (Swagger/OpenAPI)
|
||
- uv (управление зависимостями)
|
||
- Docker / Docker Compose
|
||
|
||
## Структура проекта
|
||
|
||
```text
|
||
.
|
||
├── src/
|
||
│ ├── apps/
|
||
│ │ ├── core/ # health, background jobs, openapi, startup checks
|
||
│ │ ├── user/ # auth, профиль пользователя
|
||
│ │ └── parsers/ # клиенты/сервисы/задачи парсеров
|
||
│ ├── core/ # urls/asgi/wsgi/celery
|
||
│ ├── settings/ # base/dev/production/test
|
||
│ └── manage.py
|
||
├── tests/
|
||
├── docker/
|
||
│ ├── Dockerfile
|
||
│ └── scripts/
|
||
├── input/ # входящие/обработанные/ошибочные файлы ФНС
|
||
├── docker-compose.dev.yml
|
||
├── docker-compose.prod.yml
|
||
└── Makefile
|
||
```
|
||
|
||
## Переменные окружения
|
||
|
||
Ключевые переменные:
|
||
|
||
- `DJANGO_SETTINGS_MODULE`: `settings.dev` (локально/dev) или `settings.production` (prod).
|
||
- `POSTGRES_*`: доступ к PostgreSQL.
|
||
- `REDIS_CACHE_URL`, `CELERY_BROKER_URL`, `CELERY_RESULT_BACKEND`: Redis/Celery.
|
||
- `CHECKO_API_KEY`: ключ API Checko.
|
||
- `ZAKUPKI_TOKEN`: токен SOAP API ЕИС закупок.
|
||
- `COLLECTSTATIC_ON_MIGRATE`: `1`/`0`.
|
||
- `STARTUP_CHECKS_ENABLED`: fail-fast проверки DB/Redis перед стартом runtime-процессов.
|
||
|
||
Важно: если используете `.env.dev`/`.env.prod`, проверьте, что `DJANGO_SETTINGS_MODULE` указывает на `settings.*`, а не на устаревший `config.settings.*`.
|
||
|
||
## Локальный запуск в Docker (рекомендуется)
|
||
|
||
### 1. Подготовка
|
||
|
||
```bash
|
||
# из корня проекта
|
||
cp .env.prod.example .env.prod # только если нужен prod compose
|
||
```
|
||
|
||
Для dev используется `.env.dev`. При необходимости поправьте:
|
||
|
||
```env
|
||
DJANGO_SETTINGS_MODULE=settings.dev
|
||
```
|
||
|
||
### 2. Старт dev-стека
|
||
|
||
```bash
|
||
make dev-up
|
||
# или:
|
||
docker compose -f docker-compose.dev.yml up -d
|
||
```
|
||
|
||
Сервисы:
|
||
|
||
- `db` (PostgreSQL)
|
||
- `redis`
|
||
- `migrate` (однократный запуск миграций)
|
||
- `web` (Django runserver)
|
||
- `celery_worker`
|
||
- `celery_beat`
|
||
|
||
### 3. Проверка
|
||
|
||
```bash
|
||
docker compose -f docker-compose.dev.yml ps
|
||
docker compose -f docker-compose.dev.yml logs -f web
|
||
```
|
||
|
||
### 4. Остановка
|
||
|
||
```bash
|
||
make dev-down
|
||
```
|
||
|
||
## Локальный запуск без Docker
|
||
|
||
Вариант для разработки на хосте.
|
||
|
||
### 1. Зависимости
|
||
|
||
```bash
|
||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||
source "$HOME/.cargo/env"
|
||
uv sync --dev
|
||
```
|
||
|
||
### 2. Поднять PostgreSQL и Redis
|
||
|
||
Любым удобным способом (локально через сервисы или контейнеры). Пример с Docker:
|
||
|
||
```bash
|
||
docker run -d --name mostovik_pg \
|
||
-e POSTGRES_DB=mostovik \
|
||
-e POSTGRES_USER=postgres \
|
||
-e POSTGRES_PASSWORD=postgres \
|
||
-p 5432:5432 postgres:15.10
|
||
|
||
docker run -d --name mostovik_redis -p 6379:6379 redis:7-alpine
|
||
```
|
||
|
||
### 3. Экспорт переменных
|
||
|
||
```bash
|
||
export DJANGO_SETTINGS_MODULE=settings.dev
|
||
export POSTGRES_HOST=127.0.0.1
|
||
export POSTGRES_PORT=5432
|
||
export POSTGRES_DB=mostovik
|
||
export POSTGRES_USER=postgres
|
||
export POSTGRES_PASSWORD=postgres
|
||
export REDIS_HOST=127.0.0.1
|
||
export REDIS_CACHE_URL=redis://127.0.0.1:6379/1
|
||
export CELERY_BROKER_URL=redis://127.0.0.1:6379/0
|
||
export CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||
```
|
||
|
||
### 4. Миграции и запуск
|
||
|
||
```bash
|
||
cd src
|
||
uv run python manage.py migrate
|
||
uv run python manage.py createsuperuser
|
||
uv run python manage.py runserver
|
||
```
|
||
|
||
В отдельных терминалах:
|
||
|
||
```bash
|
||
cd src && DJANGO_SETTINGS_MODULE=settings.dev uv run celery -A core worker --loglevel=INFO
|
||
cd src && DJANGO_SETTINGS_MODULE=settings.dev uv run celery -A core beat --loglevel=INFO
|
||
```
|
||
|
||
Опционально для `proverki.gov.ru` fallback-режима:
|
||
|
||
```bash
|
||
uv run playwright install chromium
|
||
```
|
||
|
||
## API и доступные эндпоинты
|
||
|
||
Базовый URL в dev: `http://localhost:8000`
|
||
|
||
- Swagger UI: `GET /`
|
||
- Admin: `GET /admin/`
|
||
- Health: `GET /health/`, `GET /health/live/`, `GET /health/ready/`
|
||
|
||
Версионированный API: `/api/v1/`
|
||
|
||
- Пользователи и auth: `/api/v1/users/`
|
||
- Фоновые задачи: `/api/v1/jobs/`
|
||
- Минпромторг: `/api/v1/minpromtorg/`
|
||
- Проверки: `/api/v1/proverki/`
|
||
- Закупки: `/api/v1/zakupki/`
|
||
- ФНС: `/api/v1/fns/`
|
||
- Системные (admin): `/api/v1/system/`
|
||
|
||
Основные auth-эндпоинты:
|
||
|
||
- `POST /api/v1/users/register/`
|
||
- `POST /api/v1/users/login/`
|
||
- `POST /api/v1/users/token/refresh/`
|
||
- `POST /api/v1/users/token/verify/`
|
||
- `GET /api/v1/users/me/`
|
||
|
||
ФНС загрузка:
|
||
|
||
- `POST /api/v1/fns/upload/` (`multipart/form-data`, поле `files`)
|
||
- `GET /api/v1/fns/reports/`
|
||
- `GET /api/v1/fns/reports/{id}/`
|
||
|
||
## Парсеры и фоновые задачи
|
||
|
||
Celery-задачи (основные):
|
||
|
||
- `apps.parsers.tasks.parse_industrial_production`
|
||
- `apps.parsers.tasks.parse_manufactures`
|
||
- `apps.parsers.tasks.parse_inspections`
|
||
- `apps.parsers.tasks.sync_inspections`
|
||
- `apps.parsers.tasks.parse_procurements`
|
||
- `apps.parsers.tasks.sync_procurements`
|
||
- `apps.parsers.tasks.process_fns_file`
|
||
- `apps.parsers.tasks.scan_fns_directory`
|
||
|
||
Планировщик (`celery beat`) по умолчанию:
|
||
|
||
- ежедневный парсинг Минпромторга (сертификаты/производители)
|
||
- сканирование директории ФНС каждые 5 минут
|
||
|
||
Директории ФНС:
|
||
|
||
- входящие: `input/fns/`
|
||
- успешные: `input/fns/processed/`
|
||
- ошибки: `input/fns/failed/`
|
||
|
||
## Тесты
|
||
|
||
- Все тесты проекта хранятся только в `ROOT_DIR/tests`.
|
||
- Размещение тестов внутри `src/**/tests` не используется.
|
||
- Базовый запуск всех тестов:
|
||
|
||
```bash
|
||
./scripts/run-tests.sh
|
||
```
|
||
|
||
- Запуск отдельных тестов через скрипт (с путями относительно `src/`):
|
||
|
||
```bash
|
||
./scripts/run-tests.sh ../tests/apps/parsers/test_tasks.py
|
||
```
|
||
|
||
- Прогон в режиме, близком к production (PostgreSQL + миграции):
|
||
|
||
```bash
|
||
make test-prod
|
||
```
|
||
|
||
## Команды разработки
|
||
|
||
```bash
|
||
make install
|
||
make setup-dev
|
||
make test
|
||
make test-prod
|
||
make test-cov
|
||
make test-fast
|
||
make lint
|
||
make pre-commit
|
||
make pre-push
|
||
make migrate
|
||
make createsuperuser
|
||
make shell
|
||
```
|
||
|
||
## Production (docker-compose.prod.yml)
|
||
|
||
```bash
|
||
cp .env.prod.example .env.prod
|
||
# обязательно проверить:
|
||
# DJANGO_SETTINGS_MODULE=settings.production
|
||
|
||
docker compose -f docker-compose.prod.yml --env-file .env.prod up -d --build
|
||
docker compose -f docker-compose.prod.yml --env-file .env.prod ps
|
||
```
|
||
|
||
В prod compose поднимаются:
|
||
|
||
- `migrate`
|
||
- `web` (gunicorn)
|
||
- `celery_worker`
|
||
- `celery_beat`
|
||
|
||
БД/Redis в prod compose не создаются, предполагаются внешние сервисы.
|
||
|
||
## Наблюдаемость и диагностика
|
||
|
||
- Health-checkи для оркестрации: `/health/live/`, `/health/ready/`, `/health/`.
|
||
- Расширенный health: `GET /health/?include_celery=true`.
|
||
- Логи контейнеров:
|
||
|
||
```bash
|
||
docker compose -f docker-compose.dev.yml logs -f web
|
||
docker compose -f docker-compose.dev.yml logs -f celery_worker
|
||
docker compose -f docker-compose.dev.yml logs -f celery_beat
|
||
```
|