diff --git a/.images/clean_arch.png b/.images/clean_arch.png new file mode 100644 index 0000000..6dc2340 Binary files /dev/null and b/.images/clean_arch.png differ diff --git a/README.md b/README.md index e69de29..75efdc0 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,59 @@ +# Rekomenci fluon *(рэкоменси флюйон)* + +## **Кейс — сколько ты зарабатываешь?** + +## Для продактов + +Пока хз что написать + + +## Для разработчиков + +[RFC проекта](RFC.md) + +### Быстрый старт + +1. Установка зависимостей +```shell +uv sync --group dev +``` + +2. Запуск линтеров +```shell +just lint +``` + +3. Запуск проекта +```shell +just build +just up +``` + +4. Создание и применение миграций +```shell +just migrations-make "message" +just migrations-run +``` + +--- + +### Стек + +#### Backend + ++ **fastapi** - http server ++ **dishka** - IoC container ++ **sqlalchemy** - ORM и query builder ++ **adaptix** и **pydantic** - для моделей ++ **postgresql** - база данных + +#### ML + ++ **torch** - для машинного обучения ++ **sentence-transformers** - создание эмбеддингов + +#### Linters ++ **mypy strict** - статический анализатор типов ++ **ruff** - статический линтер и форматтер кода ++ **codespell** - сыщик опечаток ++ **bandit** - сыщик уязвимостей diff --git a/RFC.md b/RFC.md new file mode 100644 index 0000000..c84f5a9 --- /dev/null +++ b/RFC.md @@ -0,0 +1,90 @@ +# Rekomenci fluon RFC + +## Архитектура. *(Всё как завещал дядюшка Боб...)* +Проект следует чистой архитектуре дядюшки Боба. + + + + + +# RFC-PROOD: Архитектура Recomenci Fluon + +Статус: PROOOD +Дата: 23 ноября 2025 +Автор: prod 39 + +## 1. Краткое описание +### Цель. +Описать целевую архитектуру, границы ответственности компонентов, модель разработки и деплоя для проекта рекомендаций и предсказаний зарплат (далее — проект) + +RFC определяет интерфейсы для API, операционные требования и переходный план + +## 2. Мотивация +- Упорядочить архитектуру для масштабируемости, тестируемости и повторяемости ML-экспериментов +- Обеспечить безопасный и предсказуемый деплой +- Определить контракты между web/API, ML-сервисом и хранилищем данных + + +## 3. Область и не-включения +Включено: +- Архитектура сервисов (web_api, ml) +- Хранилища: PostgreSQL, S3(далее object storage) +- CI/CD, контейнеризация и инвентори infra: Docker Compose +- Метрики, логирование, мониторинг базовой обработки ошибок + +Не включено: +- Подробный дизайн интерфейсов UI +- Исследовательские ML-эксперименты (детальные датасеты/фичи) — описан процесс интеграции + + +## 4. Цели и критерии приёмки +Цели: +- Стабильный REST/HTTP API для вакансий и предсказаний +- Горизонтально масштабируемый ML embedding-сервис +- Повторяемый pipeline подготовки данных и обучения + + +## 5. Высокоуровневая архитектура +- Web API (web_api): HTTP-сервис, инкапсулирующий бизнес логику. Проксируются запросы к ML +- ML сервис (ml): HTTP-сервис для генерации embenddings и предсказания +- PostgreSQL — является хранилищем данных +- Инфра: Docker Compose для локальной разработки; Coolify для CI/CD + +Коммуникация: +- HTTP rest-ful между web_api и ml; опционально gRPC в будущем +- Обмен артефактами через object storage и метаданные в PostgreSQL + +## 6. Контракты API (предварительно) +- Web API: + - POST /v1/predict — payload: vacancy/resume; returns: salary_prediction {value, confidence, model_version}. + - POST /v1/vacancies — сохраняет вакансию для последующей обработки. + - GET /v1/models — список доступных моделей и версий. +- ML service: + - POST /infer — принимает фичи/сырой текст, возвращает предсказание и мета. + - GET /health, GET /metrics. + +Входные/выходные схемы должны быть описаны в OpenAPI (yaml) и поддерживаться CI-валидатором + +## 7. Деплой и CI/CD +- Локально: Docker Compose (just up/build) +- Staging/Prod: Coolify +- CI pipeline: lint → build images → full tests → push образ → deploy staging +- Резервное копирование: pg_dump + object storage snapshot. + +## 8. Миграции данных и схем +- Использовать alembic для миграций схем PostgreSQL. +- Версионировать фичи и контракт входных данных (jsonschema). +- При изменениях схем: обеспечить миграционные скрипты + миграционный план с откатом. + +## 9. Безопасность и секреты +- Секреты в ENV (environment secrets в CI). +- Валидация входящих данных и rate-limiting (Redis). + +## 10. Мониторинг и логирование +- Логи структурированные (JSON), собираются в централизованный collector (ELK/Prometheus + Grafana для метрик). +- Метрики: latency, error_rate, throughput, model_drift indicators (distribution shifts), resource usage. +- Алёрты: SLO/SLA для latency/errors. + +## 11. Тестирование +- Unit tests - тестируют бизнес логику +- E2E - тестируют весь user flow diff --git a/pyproject.toml b/pyproject.toml index 4adc93b..881c239 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,8 @@ dev = [ { include-group = "tests" }, { include-group = "linters" }, { include-group = "migrations" }, + { include-group = "ml" }, + { include-group = "backend" }, ] [project.scripts] diff --git a/src/template_project/adapters/data_gateways/tables.py b/src/template_project/adapters/data_gateways/tables.py index bf381ff..58e70e7 100644 --- a/src/template_project/adapters/data_gateways/tables.py +++ b/src/template_project/adapters/data_gateways/tables.py @@ -22,7 +22,7 @@ from sqlalchemy.orm import registry from template_project.application.access_token.entity import AccessToken from template_project.application.auth_identity.entity import AuthIdentity, AuthMethod -from template_project.application.common.enums import EducationGrade, ExperienceType +from template_project.application.common.enums import EducationGrade from template_project.application.notification_device.entity import NotificationDevice from template_project.application.resume.entity import ( Resume,