Монорепозиторий task tracker: Next.js-frontend, NestJS API, PostgreSQL + Prisma, Redis, Socket.IO, Docker Compose и Nginx.
Проект уже содержит рабочий контур для командной работы:
- JWT-аутентификация с refresh-token rotation
- организации, участники, роли и проекты
- CRUD задач, комментарии и история активности
- список задач с фильтрами и kanban-доска
- realtime-инвалидация задач через Socket.IO
- отдельные экраны обзора, задач, досок, аналитики и карточки задачи
apps/
api/ NestJS API
web/ Next.js App Router frontend
packages/
db/ Prisma schema, generate, seed
types/ общие DTO и контракты
ui/ базовые UI-компоненты
- Node.js
>=20.11.1 - pnpm
9.15.4 - Frontend:
Next.js 15,React 19,React Query 5,Zustand,@dnd-kit,framer-motion - Backend:
NestJS 11,Socket.IO 4 - Data:
PostgreSQL 16,Prisma 6,Redis 7 - Infra:
Docker Compose,Nginx
/— главная сводка проекта/pages/my— стартовая страница рабочего пространства/tasks— список задач с фильтрами и scope-переключателями/tasks/[taskId]— детальная карточка задачи/boards— kanban-доска/analytics— аналитика по текущему проекту
Рабочее пространство построено вокруг WorkspacePage: он решает авторизацию, гидрацию client state, загрузку организации, проекта, пользователей и задач, а также realtime-подписку.
API поднимается с префиксом /api, Swagger доступен по /api/docs.
Основные модули:
auth— login, refresh,meorganizations— список доступных организацийprojects— список и создание проектовtasks— список, создание, обновление, комментарии, активностьrealtime— namespace/tasksи рассылкаtask:changed
Redis используется как необязательный кеш списка задач. Если Redis недоступен, API продолжает работать без падения.
pnpm installДля локальной разработки нужны env-файлы приложений:
cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env.localТиповые значения уже есть в шаблонах:
apps/api/.envPORT=3001DATABASE_URL=postgresql://tracker:tracker@localhost:5432/tracker?schema=publicREDIS_URL=redis://localhost:6379JWT_ACCESS_SECRET=replace-me-accessJWT_REFRESH_SECRET=replace-me-refreshJWT_ACCESS_TTL=15mJWT_REFRESH_TTL=7dCORS_ORIGIN=http://localhost:3000
apps/web/.env.localNEXT_PUBLIC_API_URL=http://localhost:3001/apiNEXT_PUBLIC_SOCKET_URL=http://localhost:3001
docker compose up -d postgres redispnpm db:generate
pnpm db:migrate
pnpm db:seedpnpm devЛокальные адреса:
- Web:
http://localhost:3000 - API:
http://localhost:3001/api - Swagger:
http://localhost:3001/api/docs - Socket.IO base URL:
http://localhost:3001
Демо-доступ после seed:
- Email:
owner@tracker.local - Password:
changeme123
Для compose используется корневой .env:
cp .env.example .env
docker compose up --build -dПо умолчанию compose поднимает:
postgresна5432redisна6379apiна3001webна3000nginxна8080
Публичные адреса:
- Web:
http://localhost:8080 - API:
http://localhost:8080/api - Swagger:
http://localhost:8080/api/docs - Socket.IO:
http://localhost:8080/socket.io
При старте API-контейнер:
- ждёт доступности PostgreSQL
- выполняет
prisma db push - запускает
seed - стартует NestJS API
Остановить и удалить volumes:
docker compose down -vФайл .env нужен для docker compose и управляет портами, кредами PostgreSQL, JWT-секретами и demo-user.
Шаблон: .env.example
Шаблон: apps/api/.env.example
Ключевые переменные:
PORTDATABASE_URLREDIS_URLJWT_ACCESS_SECRETJWT_REFRESH_SECRETJWT_ACCESS_TTLJWT_REFRESH_TTLCORS_ORIGINDEMO_USER_EMAILDEMO_USER_PASSWORD
Шаблон: apps/web/.env.example
Ключевые переменные:
NEXT_PUBLIC_API_URLNEXT_PUBLIC_SOCKET_URL
pnpm dev
pnpm build
pnpm typecheck
pnpm test
pnpm db:generate
pnpm db:migrate
pnpm db:seed
pnpm docker:up
pnpm docker:downЧто важно:
pnpm buildиpnpm typecheckсначала вызываютdb:generatepnpm testсейчас запускает тесты@tracker/apipnpm devпараллельно поднимает@tracker/apiи@tracker/web
pnpm --filter @tracker/api dev
pnpm --filter @tracker/api test
pnpm --filter @tracker/web dev
pnpm --filter @tracker/web build
pnpm --filter @tracker/db prisma:generate
pnpm --filter @tracker/db prisma:migrate
pnpm --filter @tracker/db prisma:seedapps/api/src/main.ts— bootstrap API, CORS, Swagger,/apiapps/api/src/app.module.ts— сборка модулей и middlewareapps/api/src/modules/tasks/tasks.service.ts— логика задач, кеш и доменные событияapps/api/src/modules/realtime/realtime.gateway.ts— Socket.IO gatewaypackages/db/prisma/schema.prisma— схема БДpackages/db/prisma/seed.ts— демо-данныеapps/web/src/widgets/workspace-shell/ui/workspace-shell.tsx— shell рабочего пространстваapps/web/src/lib/api-client.ts— auth-aware HTTP-клиентapps/web/src/lib/use-task-realtime.ts— realtime-подписка
Основные проверки:
pnpm typecheck
pnpm test
pnpm buildSmoke-check после Docker:
curl -i http://localhost:8080/
curl -i -X POST http://localhost:8080/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"owner@tracker.local","password":"changeme123"}'- Подготовить Linux-хост с Docker и Docker Compose.
- Создать production
.env. - Задать сильные
JWT_ACCESS_SECRETиJWT_REFRESH_SECRET. - Поднять
docker compose up -d --build. - Поставить TLS перед
nginx.
- вынести PostgreSQL и Redis во внешние managed-сервисы
- деплоить
apps/apiиapps/webотдельно - маршрутизировать
/apiи/socket.ioв API - маршрутизировать
/в Next.js frontend - прогонять Prisma-операции на релизе отдельно от runtime
- README приложений:
- Присутствуют комментарии в коде.
- Frontend работает через контракты из
packages/types.