7.4 KiB
Test Task CRM
Многопользовательская mini-CRM на FastAPI + PostgreSQL c сервисно-репозиторной архитектурой, JWT-аутентификацией, Alembic-миграциями и готовым React/Vite фронтендом.
Стек и особенности
- Python 3.10+, 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 + интеграции)
Переменные окружения
- Скопируйте шаблон:
cp .env.example .env. - Обновите секреты (
DB_PASSWORD,JWT_SECRET_KEY, и т.д.) перед запуском. - Все переменные описаны в
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. Применяем миграции
uv run alembic upgrade head
# 4. Запускаем API
uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
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, Postgres5432, Redis6379. - Все переменные берутся из
.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)
-
Соберите образы и статику:
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 .. -
Залейте
frontend/dist(используется как read-only volume) и задайтеGIT_HOST,GIT_USER,GIT_REPOв.env. -
Запустите стек:
docker compose -f docker-compose-ci.yml up -d
В этом режиме migrations прогоняется один раз, app слушает порт 80, Postgres хранит данные на /mnt/data/postgres (смонтируйте хостовую директорию заранее).
Redis для аналитики
Кеш аналитики выключен по умолчанию. Чтобы включить:
- Поднимите Redis (
docker compose ... redisили любым другим способом). - В
.envвыставьте:REDIS_ENABLED=trueREDIS_URL=redis://<host>:6379/0- (опционально)
ANALYTICS_CACHE_TTL_SECONDSиANALYTICS_CACHE_BACKOFF_MS.
- При недоступности Redis сервис автоматически возвращается к прямым запросам в PostgreSQL и пишет предупреждения в лог.
Тестирование
Все тесты находятся в каталоге tests/ (unit на бизнес-правила и интеграционные сценарии API). Запуск:
uv run pytest
Полезные варианты:
- Запустить только юнит-тесты сервисов:
uv run pytest tests/services -k service. - Запустить конкретный сценарий API:
uv run pytest tests/api/v1/test_deals.py -k won.
Перед деплоем рекомендуется прогонять миграции на чистой БД и выполнять uv run pytest для проверки правил ролей/стадий.