Files
rltn/server/README.md

259 lines
8.1 KiB
Markdown
Raw Normal View History

2025-09-07 18:18:35 +03:00
# Серверная часть EEV_Proj
## Описание
Серверная часть проекта EEV_Proj построена на Node.js и Express. Сервер обеспечивает API для клиентской части, управляет WebSocket соединениями и взаимодействует с базой данных PostgreSQL.
## Структура
```
server/
├── server.js # Основной файл сервера
├── db.js # Подключение к базе данных
├── db1.js # Альтернативная конфигурация БД
├── organizations.js # Логика организаций
├── ecosystem.config.js # Конфигурация PM2
└── README.md # Эта документация
```
## Основные компоненты
### server.js
Главный файл сервера, который:
- Инициализирует Express приложение
- Настраивает middleware
- Определяет API маршруты
- Запускает WebSocket сервер
- Обрабатывает игровую логику
### db.js
Модуль для работы с базой данных PostgreSQL:
- Подключение к БД
- Выполнение SQL запросов
- Управление транзакциями
### organizations.js
Логика для работы с организациями в игре:
- Создание организаций
- Управление меню организаций
- Обработка покупок
## API эндпоинты
### Аутентификация
- `POST /api/auth/login` - Вход в систему
- `POST /api/auth/register` - Регистрация
### Интерьеры
- `GET /api/interiors/:id/definition` - Получение определения интерьера
- `POST /api/interiors/:id/enter` - Вход в интерьер
### Объекты города
- `GET /api/city_objects/:id/interior` - Получение информации об объекте
### Экономика
- `GET /api/economy/balance` - Получение баланса
- `POST /api/economy/purchase` - Покупка предметов
- `GET /api/economy/inventory` - Получение инвентаря
### Квесты
- `GET /api/quests/progress` - Прогресс квестов
- `POST /api/quests/complete` - Завершение квеста
### Пользователи
- `GET /api/users/status` - Статус пользователей
- `GET /api/users/:id/profile` - Профиль пользователя
### Сообщения
- `GET /api/messages/:contactId` - Получение сообщений
- `POST /api/messages/send` - Отправка сообщения
- `POST /api/messages-read/:contactId` - Отметка сообщений как прочитанных
## WebSocket события
### Клиент → Сервер
- `playerMovement` - Движение игрока
- `interiorChange` - Смена интерьера
- `economy:getBalance` - Запрос баланса
- `economy:getInventory` - Запрос инвентаря
- `economy:updateStats` - Обновление статистики
- `economy:removeItem` - Удаление предмета
- `voiceChatToggle` - Переключение голосового чата
### Сервер → Клиент
- `economy:balanceChanged` - Изменение баланса
- `economy:inventory` - Обновление инвентаря
- `gameTime:update` - Обновление игрового времени
- `us` - Обновление статуса пользователей
## Установка и запуск
### Зависимости
```bash
npm install
```
### Переменные окружения
Создайте файл `.env` в корне проекта:
```dotenv
# Сервер
PORT=4000
NODE_ENV=development
# База данных
DB_HOST=localhost
DB_PORT=5432
DB_USER=your_username
DB_PASS=your_password
DB_NAME=your_database
# JWT
JWT_SECRET=your_jwt_secret
```
### Запуск
```bash
# Обычный запуск
node server.js
# Через PM2
pm2 start ecosystem.config.js
# В режиме разработки
npm run dev
```
## База данных
### Основные таблицы
#### users
- `id` - Уникальный идентификатор
- `username` - Имя пользователя
- `email` - Email адрес
- `password_hash` - Хеш пароля
- `created_at` - Дата создания
#### interiors
- `id` - Уникальный идентификатор
- `name` - Название интерьера
- `glb_path` - Путь к 3D модели
- `spawn_x`, `spawn_y`, `spawn_z` - Координаты входа
- `exit_x`, `exit_y`, `exit_z` - Координаты выхода
#### city_objects
- `id` - Уникальный идентификатор
- `name` - Название объекта
- `interior_id` - Ссылка на интерьер
- `position_x`, `position_y`, `position_z` - Позиция в мире
#### organizations
- `id` - Уникальный идентификатор
- `name` - Название организации
- `type` - Тип организации
- `menu` - JSON с меню организации
#### inventory
- `id` - Уникальный идентификатор
- `user_id` - Ссылка на пользователя
- `item_id` - Ссылка на предмет
- `quantity` - Количество
## Безопасность
### JWT токены
- Используются для аутентификации
- Хранятся в localStorage клиента
- Передаются в заголовке Authorization
### Валидация данных
- Проверка входных данных
- Санитизация SQL запросов
- Защита от SQL инъекций
### CORS
- Настроен для разрешения запросов с клиента
- Ограничен по доменам в продакшене
## Мониторинг и логирование
### PM2
- Управление процессами
- Автоперезапуск при сбоях
- Логирование
### Логи
- Логирование ошибок
- Логирование API запросов
- Логирование WebSocket событий
## Масштабирование
### Кластеризация
- Поддержка нескольких процессов через PM2
- Балансировка нагрузки
- Общие WebSocket соединения
### Кэширование
- Redis для кэширования данных
- Кэширование статических файлов
- Кэширование результатов запросов
## Развертывание
### Docker
```dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 4000
CMD ["node", "server.js"]
```
### Nginx
Настройте Nginx для проксирования API запросов на порт 4000.
### SSL
Настройте HTTPS для безопасного соединения.
## Тестирование
### Unit тесты
```bash
npm test
```
### Интеграционные тесты
```bash
npm run test:integration
```
### Нагрузочное тестирование
```bash
npm run test:load
```
## Отладка
### Логи
- Проверьте логи PM2: `pm2 logs`
- Проверьте логи приложения в консоли
### База данных
- Проверьте подключение к БД
- Выполните тестовые запросы
### WebSocket
- Проверьте подключение клиента
- Проверьте события в консоли браузера
## Поддержка
При возникновении проблем:
1. Проверьте логи сервера
2. Проверьте подключение к базе данных
3. Проверьте конфигурацию
4. Создайте issue в репозитории