259 lines
8.1 KiB
Markdown
259 lines
8.1 KiB
Markdown
# Серверная часть 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 в репозитории
|