Files
rltn/server/README.md

259 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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