Go to file
k1nq 9b31d924f4
Build and deploy / build (push) Successful in 48s Details
Test / test (push) Successful in 15s Details
Build and deploy / deploy (push) Successful in 23s Details
Merge pull request 'dev' (#12) from dev into master
Reviewed-on: #12
2025-12-01 12:03:22 +00:00
.gitea/workflows fix: remove frontend branch from push triggers in build workflow 2025-12-01 15:53:46 +05:00
app fix: update uvicorn command to use 10 workers for improved performance 2025-12-01 17:00:07 +05:00
frontend fix: update API_URL to use production endpoint 2025-12-01 15:44:48 +05:00
migrations fix: update Dockerfile to set correct working directory for migrations 2025-11-30 00:30:44 +05:00
tests refactor: enhance type hinting and casting for improved type safety across multiple files 2025-12-01 16:44:14 +05:00
.dockerignore feat: add Docker support and database migrations 2025-11-22 14:51:20 +05:00
.env.example feat: add .env.example file with environment variable configurations 2025-12-01 16:09:58 +05:00
.gitignore feat: implement API client, query client, storage, token parsing, and utility functions 2025-12-01 15:27:19 +05:00
.python-version fix: update Python version to 3.14.0 2025-11-27 11:02:15 +05:00
LICENSE Initial commit 2025-11-22 07:35:06 +00:00
README.md fix: update uvicorn command to use 10 workers for improved performance 2025-12-01 17:00:07 +05:00
alembic.ini fix: update database URL to use 0.0.0.0 and adjust Alembic migration configurations 2025-11-27 12:36:49 +05:00
docker-compose-ci.yml fix: update uvicorn command to use 10 workers for improved performance 2025-12-01 17:00:07 +05:00
docker-compose-dev.yml fix: update uvicorn command to use 10 workers for improved performance 2025-12-01 17:00:07 +05:00
pyproject.toml refactor: reorganize import statements for consistency across multiple files 2025-12-01 16:35:09 +05:00
test_db_filling.sql feat: enhance organization management; add member registration and validation, update user registration flow, and improve enum handling 2025-11-29 08:50:11 +05:00
uv.lock feat: implement Redis caching for analytics endpoints with fallback to database 2025-11-29 09:45:27 +05:00

README.md

Test Task CRM

Многопользовательская mini-CRM на FastAPI + PostgreSQL c сервисно-репозиторной архитектурой, JWT-аутентификацией, Alembic-миграциями и готовым React/Vite фронтендом.

Стек и особенности

  • Python 3.14, FastAPI, SQLAlchemy Async ORM, Alembic.
  • Pydantic Settings для конфигурации, JWT access/refresh токены, кеш аналитики в Redis.
  • Frontend: Vite + React + TypeScript (см. frontend/).
  • Докер-окружение для разработки (docker-compose-dev.yml) и деплоя (docker-compose-ci.yml).

Структура проекта

app/
  api/            # FastAPI-роуты и зависимости
  core/           # Настройки, база, безопасность
  models/         # SQLAlchemy-модели
  repositories/   # Работа с БД
  services/       # Бизнес-правила и сценарии
frontend/         # Vite + React SPA
migrations/       # Alembic-миграции
tests/            # Pytest (unit + интеграции)

Переменные окружения

  1. Скопируйте шаблон: cp .env.example .env.
  2. Обновите секреты (DB_PASSWORD, JWT_SECRET_KEY, и т.д.) перед запуском.
  3. Все переменные описаны в app/core/config.py; Vite читает только ключи с префиксом VITE_.

Backend

Переменная Значение по умолчанию Назначение
PROJECT_NAME "Test Task CRM" Заголовки/метаданные API
VERSION "0.1.0" Версия приложения
API_V1_PREFIX /api/v1 Базовый префикс REST
DB_HOST localhost Хост PostgreSQL
DB_PORT 5432 Порт PostgreSQL
DB_NAME test_task_crm Имя БД
DB_USER postgres Пользователь БД
DB_PASSWORD postgres Пароль пользователя
DATABASE_URL Полный DSN (перекрывает DB_*), формат postgresql+asyncpg://user:pass@host:port/db
SQLALCHEMY_ECHO false Логирование SQL
JWT_SECRET_KEY change-me Секрет для подписи JWT
JWT_ALGORITHM HS256 Алгоритм JWT
ACCESS_TOKEN_EXPIRE_MINUTES 30 TTL access-токена
REFRESH_TOKEN_EXPIRE_DAYS 7 TTL refresh-токена
REDIS_ENABLED false Включить кеш аналитики
REDIS_URL redis://localhost:6379/0 Строка подключения к Redis
ANALYTICS_CACHE_TTL_SECONDS 120 TTL кэша аналитики
ANALYTICS_CACHE_BACKOFF_MS 200 max задержка при ретраях записи в кеш

Frontend (Vite)

Переменная Значение по умолчанию Назначение
VITE_API_URL http://localhost:8000.env.example), в src/config/env.ts дефолт https://kitchen-crm.k1nq.tech Базовый URL бекенда (без завершающего /)
VITE_APP_URL http://localhost:5173 URL SPA, используется для deeplink'ов и редиректов

⚠️ В frontend/src/config/env.ts зашит production URL (https://kitchen-crm.k1nq.tech). При деплое в другое место обязательно обновите VITE_API_URL/VITE_APP_URL в .env или настройте переменные окружения на уровне хостинга.

Локальный запуск без Docker

Предварительные требования

  • Python 3.10+ и uv.
  • PostgreSQL 16+ (локально или через Docker).
  • (Опционально) Redis 7+ для кеша аналитики.

Backend (API)

# 1. Готовим окружение
cp .env.example .env
# отредактируйте .env: базы, секреты, VITE_* (если нужен фронтенд)

# 2. Устанавливаем зависимости
uv sync

# 3. Применяем миграции
uvx alembic upgrade head

# 4. Запускаем API (10 воркеров без hot-reload) или включаем reload при необходимости
uvx uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 10

PostgreSQL/Redis можно поднять вручную или командой docker compose -f docker-compose-dev.yml up postgres redis -d.

Frontend

cd frontend
npm install
npm run dev -- --host

Фронтенд ожидает, что VITE_API_URL указывает на работающий бекенд (например, http://localhost:8000).

Запуск через Docker Compose

Локальная разработка (docker-compose-dev.yml)

  • Собирает бекенд из app/Dockerfile, поднимает postgres:16-alpine и redis:7-alpine.
  • Порты по умолчанию: API 8000, Postgres 5432, Redis 6379.
  • Все переменные берутся из .env.
docker compose -f docker-compose-dev.yml up --build
# или в фоне
docker compose -f docker-compose-dev.yml up --build -d

Прод/CI стек (docker-compose-ci.yml)

  1. Соберите образы и статику:

    docker build -f app/Dockerfile -t <registry>/test-task-crm:app .
    docker build -f migrations/Dockerfile -t <registry>/test-task-crm:migrations .
    cd frontend && npm install && npm run build && cd ..
    
  2. Залейте frontend/dist (используется как read-only volume) и задайте GIT_HOST, GIT_USER, GIT_REPO в .env.

  3. Запустите стек:

    docker compose -f docker-compose-ci.yml up -d
    

В этом режиме migrations прогоняется один раз, app слушает порт 80, Postgres хранит данные на /mnt/data/postgres (смонтируйте хостовую директорию заранее).

Redis для аналитики

Кеш аналитики выключен по умолчанию. Чтобы включить:

  1. Поднимите Redis (docker compose ... redis или любым другим способом).
  2. В .env выставьте:
    • REDIS_ENABLED=true
    • REDIS_URL=redis://<host>:6379/0
    • (опционально) ANALYTICS_CACHE_TTL_SECONDS и ANALYTICS_CACHE_BACKOFF_MS.
  3. При недоступности Redis сервис автоматически возвращается к прямым запросам в PostgreSQL и пишет предупреждения в лог.

Тестирование

Все тесты находятся в каталоге tests/ (unit на бизнес-правила и интеграционные сценарии API). Запуск:

uv run pytest

Полезные варианты:

  • Запустить только юнит-тесты сервисов: uvx pytest tests/services -k service.
  • Запустить конкретный сценарий API: uvx pytest tests/api/v1/test_deals.py -k won.

Перед деплоем рекомендуется прогонять миграции на чистой БД и выполнять uvx pytest для проверки правил ролей/стадий.

Линтинг и статический анализ

  • uv run ruff check app tests — основной линтер (PEP8, сортировка импортов, дополнительные правила).
  • uv run ruff format app tests — автоформатирование (аналог black) для единообразного стиля.
  • uv run mypy app services tests — статическая проверка типов (строгий режим + плагин pydantic).

В CI/PR рекомендуется запускать команды именно в этом порядке, чтобы быстрее находить проблемы.