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 в репозитории
|