Серверная часть 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- Обновление статуса пользователей
Установка и запуск
Зависимости
npm install
Переменные окружения
Создайте файл .env в корне проекта:
# Сервер
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
Запуск
# Обычный запуск
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
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 тесты
npm test
Интеграционные тесты
npm run test:integration
Нагрузочное тестирование
npm run test:load
Отладка
Логи
- Проверьте логи PM2:
pm2 logs - Проверьте логи приложения в консоли
База данных
- Проверьте подключение к БД
- Выполните тестовые запросы
WebSocket
- Проверьте подключение клиента
- Проверьте события в консоли браузера
Поддержка
При возникновении проблем:
- Проверьте логи сервера
- Проверьте подключение к базе данных
- Проверьте конфигурацию
- Создайте issue в репозитории