Перейти к основному содержимому

Локальная разработка

Быстрый старт для разработчика: поднять PostgreSQL и Redis, запустить бэкенд и фронтенд, применить миграции и прогнать проверки. Требуется Node.js 22, npm и Docker.

Что где запускается​

ПриложениеПортКомандаКонфиг
PostgreSQL 16 + pgvector5432docker compose up -d postgres redisdocker-compose.yml
Redis 7 (с паролем)6379там жеREDIS_PASSWORD, по умолчанию optima-local
Backend (NestJS)3000npm run start:dev в backend/backend/.env
Frontend (Next.js)3001npm run dev в frontend/frontend/.env.local
Landing (Vite)3002npm run dev в landing/landing/.env
Docs-site (Docusaurus)3000 по умолчаниюnpm start в docs-site/—

Порт документации совпадает с бэкендом: если запускаете оба, укажите другой порт — npm start -- --port 3003.

1. Инфраструктура: docker-compose​

Корневой docker-compose.yml описывает PostgreSQL (pgvector/pgvector:pg16, нужен для RAG), Redis и контейнер бэкенда. Порты публикуются только на 127.0.0.1, Redis защищён паролем. Для работы с бэкендом «на хосте» достаточно двух сервисов:

docker compose up -d postgres redis

Учётные данные БД локально: пользователь, пароль и база — optima. Если бэкенд запускается не в compose, в .env нужен Redis-URL с паролем: REDIS_URL=redis://:optima-local@localhost:6379. Контейнер backend из compose тоже доступен (docker compose up), но миграции в нём автоматически не применяются — запустите их с хоста (шаг 3).

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

cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env.local
cp landing/.env.example landing/.env
  • Backend — обязательны DATABASE_URL, REDIS_URL, JWT_ACCESS_SECRET, JWT_REFRESH_SECRET (не короче 16 символов), ENCRYPTION_KEYS (kid:hex64) и ENCRYPTION_ACTIVE_KID. Значения в .env.example — заглушки для разработки (в production они отвергаются). Ключ шифрования можно сгенерировать командой openssl rand -hex 32. LLM-переменные (LLM_*) необязательны: без них ИИ-функции вернут ошибку конфигурации при вызове, остальное работает. Env валидируется при старте — опечатка роняет запуск с понятным сообщением. Справочник — Переменные окружения.
  • Frontend — NEXT_PUBLIC_API_URL=http://localhost:3000, NEXT_PUBLIC_LANDING_URL=http://localhost:3002.
  • Landing — VITE_APP_ORIGIN, VITE_DOCS_URL (адреса приложения и документации).

3. Миграции и сиды​

cd backend
npm install
npm run migration:run # применить миграции (через ts-node, DATABASE_URL из .env)
npm run migration:show # какие миграции применены
npm run migration:revert # откатить последнюю
npm run migration:generate -- src/core/database/migrations/<Имя> # сгенерировать по diff сущностей
npm run migration:create -- src/core/database/migrations/<Имя> # пустая миграция
npm run seed:run # идемпотентные сиды из src/core/database/seeds/*.seed.ts

Миграции идут первыми: схема, расширение vector и партиции создаются ими. В production те же миграции применяет entrypoint контейнера (Развёртывание). Правила схемы — Данные, решение — ADR-0001.

4. Запуск и первый вход​

cd backend && npm run start:dev # API http://localhost:3000, Swagger http://localhost:3000/api/docs
cd frontend && npm install && npm run dev # http://localhost:3001

Зарегистрируйтесь в приложении — новому пользователю назначается роль seller. Чтобы получить роль администратора, обновите запись вручную: UPDATE users SET role = 'admin' WHERE email = '…'; (Безопасность). Подключение кабинета WB требует настоящего токена Wildberries (Кабинеты WB); для безопасных проб можно включить песочницы WB (WB_API_USE_SANDBOX=true).

Очереди и расписания работают в том же процессе: при запущенных Redis и бэкенде плановые задачи стартуют сами (Фоновые задачи). Панель очередей — /admin/queues (локально открыта без пароля).

5. Команды проверок​

ГдеКомандаЧто делает
backendnpm run lintESLint с автоисправлением
backendnpm test / npm run test:watch / npm run test:covюнит-тесты Jest (БД и Redis не нужны)
backendnpm run test:e2ee2e на реальных PostgreSQL и Redis, включая цикл миграций «применить → откатить → применить»
backendnpm run test:contractпроверка OpenAPI-контракта (при изменении набора эндпоинтов обновите test/openapi.e2e-spec.ts)
backendnpm run buildсборка nest build в dist/
backendnpm run docs · docs:coverage · docs:openapiCompodoc, порог покрытия документацией 80 %, выгрузка openapi.json
frontendnpm run lint, npm run typecheckESLint и tsc --noEmit
frontendnpm run test:unit (npm test — watch)Vitest
frontendnpm run e2ePlaywright (первый раз: npx playwright install chromium)
frontendnpm run buildproduction-сборка Next.js
frontendnpm run api:generateвыгрузка OpenAPI бэкенда и генерация типов src/lib/api/schema.d.ts
landingnpm run lint, npm run typecheck, npm run buildпроверки и сборка лендинга
docs-sitenpm run build · npm run serve · npm run sync:adrсборка и просмотр портала, синхронизация ADR из backend/docs/adr

После изменения контракта API: npm run docs:openapi в backend/, затем npm run api:generate во frontend/.

Git-хуки​

В backend/ husky ставится автоматически при npm install (скрипт prepare). На коммите lint-staged запускает по изменённым backend/src/**/*.ts ESLint с --fix и tsc -p tsconfig.build.json --noEmit; коммит с неисправимой ошибкой блокируется. Все проверки перед PR — CI/CD.

Документация вместе с кодом​

Документируем на русском: TSDoc и Swagger-декораторы пишутся вместе с кодом; значимое архитектурное решение — новый ADR в backend/docs/adr/ (затем npm run sync:adr в docs-site/). Описание фич для клиентов — в docs-site/docs/business/. Документацию кода (Compodoc) можно открыть локально: npm run docs:serve в backend/.