# Инструкция по развертыванию на удаленном сервере

## Вариант 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 <your-repo-url>
   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 мониторинг
