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