| .. | ||
| prisma | ||
| src | ||
| test | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| .prettierrc | ||
| docker-compose.yml | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| nest-cli.json | ||
| package-lock.json | ||
| package.json | ||
| prisma.config.ts | ||
| README.md | ||
| tsconfig.build.json | ||
| tsconfig.json | ||
Backend - "100 к 1" Multiplayer Game
NestJS backend для мультиплеерной игры "100 к 1" с WebSocket поддержкой.
🚀 Быстрый старт
Предварительные требования
- Node.js 18+
- PostgreSQL 15+ (должен быть запущен отдельно, например, в Coolify)
Установка
Важно: PostgreSQL должен быть запущен отдельно как отдельное приложение. Все переменные окружения должны быть настроены в системе или через Coolify.
# 1. Установить зависимости
npm install
# 2. Настроить переменные окружения
# Переменные должны быть установлены в системе или через 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. Выполнить миграции
npx prisma migrate dev --name init
# 4. Заполнить демо-данными (опционально)
npm run prisma:seed
# 5. Сгенерировать Prisma Client
npx prisma generate
# 6. Запустить backend
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 скрипт с демо-данными
└── Dockerfile # Docker конфигурация
🗄️ База данных
Модели
- User - пользователи (анонимные или зарегистрированные)
- Room - игровые комнаты
- Participant - участники комнат (игроки, ведущие, зрители)
- QuestionPack - паки вопросов
- GameHistory - история завершённых игр
Миграции
# Создать новую миграцию
npx prisma migrate dev --name migration_name
# Применить миграции на production
npx prisma migrate deploy
# Сбросить базу данных (ВНИМАНИЕ: удалит все данные!)
npx prisma migrate reset
Seed данные
Seed скрипт создаёт:
- Демо пользователя
- 2 пака вопросов (общие и семейные)
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
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 # Заполнение БД демо-данными
🔐 Переменные окружения
Приложение использует переменные окружения напрямую через @nestjs/config. Все переменные должны быть настроены в системе или через Coolify:
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!
Пример:
- Frontend работает на:
https://example.com - Backend работает на:
https://api.example.com CORS_ORIGINдолжен быть:https://example.com(домен frontend)
Это защищает backend от запросов с неавторизованных доменов.
🔑 Как сгенерировать JWT_SECRET?
JWT_SECRET - это секретный ключ для подписи и проверки JWT токенов. Он используется для создания и проверки токенов авторизации.
Требования к JWT_SECRET:
- Должен быть случайным и криптографически стойким
- Минимум 32 символа, рекомендуется 64+ символа
- Уникальный для каждого приложения
- Никогда не коммитьте в Git!
Способы генерации:
- Node.js:
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
- OpenSSL:
openssl rand -hex 64
- Python:
python3 -c "import secrets; print(secrets.token_hex(64))"
Где использовать:
- В Coolify: Добавьте переменную окружения
JWT_SECRETв настройках приложения - Локально: Можно использовать
.envфайл (но не коммитить его в Git!)
⚠️ ВАЖНО:
- Используйте разные
JWT_SECRETдля development и production - Если измените
JWT_SECRET, все существующие токены станут недействительными - Храните секрет в безопасности - это критически важно для безопасности приложения
Примечание: PostgreSQL должен быть запущен отдельно как отдельное приложение в Coolify. Файлы .env не используются - все переменные берутся из переменных окружения системы.
📝 Prisma Studio
npx prisma studio
Откроется на http://localhost:5555
🚀 Production Deployment
# 1. Собрать проект
npm run build
# 2. Применить миграции
npx prisma migrate deploy
# 3. Запустить
npm run start:prod