sto-k-odnomu/backend
2026-01-10 18:51:33 +03:00
..
prisma stuff 2026-01-10 18:51:33 +03:00
src stuff 2026-01-10 18:51:33 +03:00
test backend and stuff 2026-01-03 17:07:04 +03:00
.dockerignore package update 2026-01-05 01:59:26 +03:00
.env.example backend and stuff 2026-01-03 17:07:04 +03:00
.gitignore backend and stuff 2026-01-03 17:07:04 +03:00
.prettierrc backend and stuff 2026-01-03 17:07:04 +03:00
docker-compose.yml backend and stuff 2026-01-03 17:07:04 +03:00
Dockerfile q 2026-01-10 02:43:06 +03:00
eslint.config.mjs backend and stuff 2026-01-03 17:07:04 +03:00
nest-cli.json backend and stuff 2026-01-03 17:07:04 +03:00
package-lock.json fixes 2026-01-10 00:42:18 +03:00
package.json theme 2026-01-10 02:27:21 +03:00
prisma.config.ts fix 2026-01-05 02:07:48 +03:00
README.md stuff 2026-01-05 00:48:55 +03:00
tsconfig.build.json backend and stuff 2026-01-03 17:07:04 +03:00
tsconfig.json backend and stuff 2026-01-03 17:07:04 +03:00

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!

Способы генерации:

  1. Node.js:
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
  1. OpenSSL:
openssl rand -hex 64
  1. 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