sto-k-odnomu/backend/README.md

239 lines
9.6 KiB
Markdown
Raw Permalink Normal View History

2026-01-03 14:07:04 +00:00
# Backend - "100 к 1" Multiplayer Game
NestJS backend для мультиплеерной игры "100 к 1" с WebSocket поддержкой.
## 🚀 Быстрый старт
### Предварительные требования
- Node.js 18+
2026-01-04 21:48:55 +00:00
- PostgreSQL 15+ (должен быть запущен отдельно, например, в Coolify)
2026-01-03 14:07:04 +00:00
### Установка
2026-01-04 21:48:55 +00:00
**Важно:** PostgreSQL должен быть запущен отдельно как отдельное приложение. Все переменные окружения должны быть настроены в системе или через Coolify.
2026-01-03 14:07:04 +00:00
```bash
# 1. Установить зависимости
npm install
# 2. Настроить переменные окружения
2026-01-04 21:48:55 +00:00
# Переменные должны быть установлены в системе или через Coolify:
# - DATABASE_URL - строка подключения к PostgreSQL
# - JWT_SECRET - секретный ключ для JWT токенов
# - PORT - порт для backend (по умолчанию 3000)
# - HOST - хост для backend (по умолчанию 0.0.0.0)
# - CORS_ORIGIN - домен frontend приложения, с которого разрешены запросы (по умолчанию http://localhost:5173)
# ВАЖНО: CORS_ORIGIN - это домен frontend, а не backend!
# 3. Выполнить миграции
2026-01-03 14:07:04 +00:00
npx prisma migrate dev --name init
2026-01-04 21:48:55 +00:00
# 4. Заполнить демо-данными (опционально)
2026-01-03 14:07:04 +00:00
npm run prisma:seed
2026-01-04 21:48:55 +00:00
# 5. Сгенерировать Prisma Client
2026-01-03 14:07:04 +00:00
npx prisma generate
2026-01-04 21:48:55 +00:00
# 6. Запустить backend
2026-01-03 14:07:04 +00:00
npm run start:dev
```
Backend запустится на http://localhost:3000
## 📁 Структура проекта
```
backend/
├── src/
│ ├── auth/ # Модуль авторизации (JWT, анонимные пользователи)
│ ├── rooms/ # Модуль комнат (создание, присоединение)
│ ├── questions/ # Модуль паков вопросов (CRUD)
│ ├── game/ # WebSocket модуль (real-time игра)
│ ├── stats/ # Модуль статистики (история игр)
│ ├── prisma/ # Prisma сервис
│ ├── app.module.ts # Главный модуль
│ └── main.ts # Точка входа
├── prisma/
│ ├── schema.prisma # Схема базы данных
│ └── seed.ts # Seed скрипт с демо-данными
2026-01-04 21:48:55 +00:00
└── Dockerfile # Docker конфигурация
2026-01-03 14:07:04 +00:00
```
## 🗄️ База данных
### Модели
- **User** - пользователи (анонимные или зарегистрированные)
- **Room** - игровые комнаты
- **Participant** - участники комнат (игроки, ведущие, зрители)
- **QuestionPack** - паки вопросов
- **GameHistory** - история завершённых игр
### Миграции
```bash
# Создать новую миграцию
npx prisma migrate dev --name migration_name
# Применить миграции на production
npx prisma migrate deploy
# Сбросить базу данных (ВНИМАНИЕ: удалит все данные!)
npx prisma migrate reset
```
### Seed данные
Seed скрипт создаёт:
- Демо пользователя
- 2 пака вопросов (общие и семейные)
```bash
npm run prisma:seed
```
## 🔌 API Endpoints
### Auth
- POST /auth/anonymous - создать анонимного пользователя
- POST /auth/register - регистрация
- POST /auth/login - вход
### Rooms
- POST /rooms - создать комнату
- GET /rooms/:code - получить комнату по коду
- POST /rooms/:roomId/join - присоединиться к комнате
### Questions
- POST /questions/packs - создать пак вопросов
- GET /questions/packs - получить все паки
- GET /questions/packs/:id - получить пак по ID
- PUT /questions/packs/:id - обновить пак
- DELETE /questions/packs/:id - удалить пак
### Stats
- POST /stats/game-history - сохранить историю игры
- GET /stats/game-history/:userId - получить историю пользователя
- GET /stats/user/:userId - получить статистику пользователя
## 🌐 WebSocket Events
### Client → Server
- joinRoom - присоединиться к комнате
- startGame - начать игру
- revealAnswer - открыть ответ
- updateScore - обновить счёт
- nextQuestion - следующий вопрос
- endGame - завершить игру
### Server → Client
- roomUpdate - обновление комнаты
- gameStarted - игра началась
- answerRevealed - ответ открыт
- scoreUpdated - счёт обновлён
- questionChanged - вопрос изменён
- gameEnded - игра завершена
## 🔧 NPM Scripts
```bash
npm run start # Запуск в production режиме
npm run start:dev # Запуск в dev режиме с hot reload
npm run start:debug # Запуск в debug режиме
npm run build # Сборка для production
npm run lint # Проверка ESLint
npm run format # Форматирование кода (Prettier)
npm run test # Запуск тестов
npm run test:watch # Запуск тестов в watch режиме
npm run test:cov # Запуск тестов с coverage
npm run prisma:generate # Генерация Prisma Client
npm run prisma:migrate # Создание и применение миграции
npm run prisma:seed # Заполнение БД демо-данными
```
2026-01-04 21:48:55 +00:00
## 🔐 Переменные окружения
2026-01-03 14:07:04 +00:00
2026-01-04 21:48:55 +00:00
Приложение использует переменные окружения напрямую через `@nestjs/config`. Все переменные должны быть настроены в системе или через Coolify:
2026-01-03 14:07:04 +00:00
2026-01-04 21:48:55 +00:00
- `DATABASE_URL` - строка подключения к PostgreSQL (например: `postgresql://user:password@host:5432/dbname`)
- `JWT_SECRET` - секретный ключ для JWT токенов (см. ниже как сгенерировать)
- `PORT` - порт для backend (по умолчанию 3000)
- `HOST` - хост для backend (по умолчанию 0.0.0.0)
- `CORS_ORIGIN` - **домен frontend приложения**, с которого разрешены запросы к backend (по умолчанию http://localhost:5173)
### Что такое CORS_ORIGIN?
`CORS_ORIGIN` - это настройка безопасности CORS (Cross-Origin Resource Sharing). Она указывает backend, с каких доменов разрешено принимать HTTP и WebSocket запросы.
**Важно:** `CORS_ORIGIN` - это домен, где работает **frontend**, а не backend!
2026-01-03 14:07:04 +00:00
2026-01-04 21:48:55 +00:00
**Пример:**
- Frontend работает на: `https://example.com`
- Backend работает на: `https://api.example.com`
- `CORS_ORIGIN` должен быть: `https://example.com` (домен frontend)
2026-01-03 14:07:04 +00:00
2026-01-04 21:48:55 +00:00
Это защищает backend от запросов с неавторизованных доменов.
2026-01-03 14:07:04 +00:00
2026-01-04 21:48:55 +00:00
### 🔑 Как сгенерировать JWT_SECRET?
`JWT_SECRET` - это секретный ключ для подписи и проверки JWT токенов. Он используется для создания и проверки токенов авторизации.
**Требования к JWT_SECRET:**
- Должен быть случайным и криптографически стойким
- Минимум 32 символа, рекомендуется 64+ символа
- Уникальный для каждого приложения
- **Никогда не коммитьте в Git!**
**Способы генерации:**
1. **Node.js:**
```bash
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
2026-01-03 14:07:04 +00:00
```
2026-01-04 21:48:55 +00:00
2. **OpenSSL:**
```bash
openssl rand -hex 64
```
2026-01-03 14:07:04 +00:00
2026-01-04 21:48:55 +00:00
3. **Python:**
2026-01-03 14:07:04 +00:00
```bash
2026-01-04 21:48:55 +00:00
python3 -c "import secrets; print(secrets.token_hex(64))"
2026-01-03 14:07:04 +00:00
```
2026-01-04 21:48:55 +00:00
**Где использовать:**
- В Coolify: Добавьте переменную окружения `JWT_SECRET` в настройках приложения
- Локально: Можно использовать `.env` файл (но не коммитить его в Git!)
**⚠️ ВАЖНО:**
- Используйте **разные** `JWT_SECRET` для development и production
- Если измените `JWT_SECRET`, все существующие токены станут недействительными
- Храните секрет в безопасности - это критически важно для безопасности приложения
2026-01-03 14:07:04 +00:00
2026-01-04 21:48:55 +00:00
**Примечание:** PostgreSQL должен быть запущен отдельно как отдельное приложение в Coolify. Файлы `.env` не используются - все переменные берутся из переменных окружения системы.
2026-01-03 14:07:04 +00:00
## 📝 Prisma Studio
```bash
npx prisma studio
```
Откроется на http://localhost:5555
## 🚀 Production Deployment
```bash
# 1. Собрать проект
npm run build
# 2. Применить миграции
npx prisma migrate deploy
# 3. Запустить
npm run start:prod
```