# Инструкция по развертыванию на удаленном сервере ## Вариант 1: Один сервер (проще) Если у вас один сервер и вы хотите развернуть все на одном домене: ### Требования: - Ubuntu/Debian сервер - Docker и Docker Compose - Домен (например, `game.example.com`) ### Шаги: 1. **Подключитесь к серверу:** ```bash ssh user@your-server.com ``` 2. **Установите Docker и Docker Compose** (если еще не установлены): ```bash # Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # Docker Compose sudo apt-get update sudo apt-get install docker-compose-plugin ``` 3. **Клонируйте репозиторий:** ```bash git clone cd my-game ``` 4. **Запустите production версию:** ```bash docker-compose -f docker-compose.prod.yml up -d --build ``` 5. **Настройте nginx на сервере для проксирования:** Создайте `/etc/nginx/sites-available/game`: ```nginx server { listen 80; server_name game.example.com; # Клиент (фронтенд) location / { proxy_pass http://localhost:80; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # API и Socket.io location /socket.io/ { proxy_pass http://localhost:3001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # Статические файлы (изображения, аудио) location /uploads/ { proxy_pass http://localhost:3001; } } ``` Активируйте конфигурацию: ```bash sudo ln -s /etc/nginx/sites-available/game /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx ``` 6. **Настройте SSL с Let's Encrypt:** ```bash sudo apt-get install certbot python3-certbot-nginx sudo certbot --nginx -d game.example.com ``` Готово! Игра доступна по адресу `https://game.example.com` --- ## Вариант 2: Отдельные порты (быстрее) Если не хотите настраивать nginx, можно открыть порты напрямую: 1. **Запустите production версию:** ```bash docker-compose -f docker-compose.prod.yml up -d --build ``` 2. **Откройте порты в firewall:** ```bash sudo ufw allow 80 sudo ufw allow 3001 ``` 3. **Доступ:** - Клиент: `http://your-server.com:80` - Сервер: `http://your-server.com:3001` **Важно:** Socket.io и изображения будут работать автоматически, так как клиент использует логику из `socket.js`: ```javascript // Автоматически определяет хост const serverUrl = `${window.location.protocol}//${window.location.hostname}:3001` ``` --- ## Вариант 3: Два отдельных сервера/домена Если фронтенд и бэкенд на разных серверах: ### Сервер 1 (Backend): `api.example.com` 1. **Запустите только сервер:** ```bash docker run -d \ -p 3001:3001 \ -e MONGODB_URI=mongodb://mongodb:27017/svoya-igra \ svoya-igra-server ``` 2. **Настройте CORS в `server/src/index.js`:** ```javascript const cors = require('cors'); app.use(cors({ origin: 'https://game.example.com', // URL вашего фронтенда credentials: true })); ``` ### Сервер 2 (Frontend): `game.example.com` 1. **Создайте `.env.production`:** ```bash VITE_SERVER_URL=https://api.example.com ``` 2. **Соберите и запустите:** ```bash docker build -f Dockerfile -t svoya-igra-client . docker run -d -p 80:80 svoya-igra-client ``` --- ## Переменные окружения для production ### Client (.env.production): ```bash # Если API на другом домене/сервере VITE_SERVER_URL=https://api.example.com # Если на том же сервере, но другой порт VITE_SERVER_URL=https://example.com:3001 # Если оставить пустым - автоопределение VITE_SERVER_URL= ``` ### Server (.env): ```bash PORT=3001 MONGODB_URI=mongodb://localhost:27017/svoya-igra NODE_ENV=production ``` --- ## Проверка работоспособности После развертывания проверьте: 1. **Клиент загружается:** ```bash curl https://game.example.com ``` 2. **Сервер отвечает:** ```bash curl https://game.example.com:3001 # или curl https://api.example.com ``` 3. **Socket.io подключается:** Откройте DevTools → Network → WS → проверьте подключение к `socket.io` 4. **Изображения загружаются:** Создайте игру с вопросом-картинкой и проверьте загрузку --- ## Обновление приложения ```bash # Остановите контейнеры docker-compose -f docker-compose.prod.yml down # Обновите код git pull # Пересоберите и запустите docker-compose -f docker-compose.prod.yml up -d --build ``` --- ## Мониторинг и логи ```bash # Посмотреть логи всех сервисов docker-compose -f docker-compose.prod.yml logs -f # Логи конкретного сервиса docker logs svoya-igra-client docker logs svoya-igra-server docker logs svoya-igra-mongodb # Проверить статус docker-compose -f docker-compose.prod.yml ps ``` --- ## Резервное копирование MongoDB ```bash # Создать бэкап docker exec svoya-igra-mongodb mongodump --out /data/backup # Копировать бэкап на хост docker cp svoya-igra-mongodb:/data/backup ./backup # Восстановить docker exec svoya-igra-mongodb mongorestore /data/backup ``` --- ## Решение проблем ### Socket.io не подключается **Проблема:** В DevTools видно `WebSocket connection failed` **Решение:** 1. Проверьте что порт 3001 открыт 2. Убедитесь что nginx проксирует `/socket.io/` 3. Проверьте CORS настройки на сервере ### Изображения не загружаются **Проблема:** 404 на `/uploads/image.jpg` **Решение:** 1. Убедитесь что файлы есть в `server/public/uploads/` 2. Проверьте volume в docker-compose: `./server/public:/app/public` 3. Проверьте статическую раздачу в `server/src/index.js` ### Клиент не подключается к серверу **Проблема:** Клиент пытается подключиться к localhost вместо домена **Решение:** 1. Проверьте `.env.production` 2. Пересоберите клиент: `docker-compose -f docker-compose.prod.yml up -d --build client` 3. Очистите кеш браузера --- ## Оптимизация для production 1. **Включите gzip в nginx** (уже добавлено в nginx.conf) 2. **Настройте CDN** для статических файлов (опционально) 3. **Добавьте rate limiting** в nginx для защиты от DDoS: ```nginx limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; location /socket.io/ { limit_req zone=api burst=20; ... } ``` 4. **Настройте PM2** для автоперезагрузки сервера при падении (опционально) 5. **Мониторинг:** используйте Grafana + Prometheus или простой uptime мониторинг