Files
my-game/DEPLOYMENT.md

8.4 KiB
Raw Permalink Blame History

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

Вариант 1: Один сервер (проще)

Если у вас один сервер и вы хотите развернуть все на одном домене:

Требования:

  • Ubuntu/Debian сервер
  • Docker и Docker Compose
  • Домен (например, game.example.com)

Шаги:

  1. Подключитесь к серверу:

    ssh user@your-server.com
    
  2. Установите Docker и Docker Compose (если еще не установлены):

    # 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. Клонируйте репозиторий:

    git clone <your-repo-url>
    cd my-game
    
  4. Запустите production версию:

    docker-compose -f docker-compose.prod.yml up -d --build
    
  5. Настройте nginx на сервере для проксирования:

    Создайте /etc/nginx/sites-available/game:

    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;
        }
    }
    

    Активируйте конфигурацию:

    sudo ln -s /etc/nginx/sites-available/game /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
    
  6. Настройте SSL с Let's Encrypt:

    sudo apt-get install certbot python3-certbot-nginx
    sudo certbot --nginx -d game.example.com
    

Готово! Игра доступна по адресу https://game.example.com


Вариант 2: Отдельные порты (быстрее)

Если не хотите настраивать nginx, можно открыть порты напрямую:

  1. Запустите production версию:

    docker-compose -f docker-compose.prod.yml up -d --build
    
  2. Откройте порты в firewall:

    sudo ufw allow 80
    sudo ufw allow 3001
    
  3. Доступ:

    • Клиент: http://your-server.com:80
    • Сервер: http://your-server.com:3001

Важно: Socket.io и изображения будут работать автоматически, так как клиент использует логику из socket.js:

// Автоматически определяет хост
const serverUrl = `${window.location.protocol}//${window.location.hostname}:3001`

Вариант 3: Два отдельных сервера/домена

Если фронтенд и бэкенд на разных серверах:

Сервер 1 (Backend): api.example.com

  1. Запустите только сервер:

    docker run -d \
      -p 3001:3001 \
      -e MONGODB_URI=mongodb://mongodb:27017/svoya-igra \
      svoya-igra-server
    
  2. Настройте CORS в server/src/index.js:

    const cors = require('cors');
    app.use(cors({
      origin: 'https://game.example.com', // URL вашего фронтенда
      credentials: true
    }));
    

Сервер 2 (Frontend): game.example.com

  1. Создайте .env.production:

    VITE_SERVER_URL=https://api.example.com
    
  2. Соберите и запустите:

    docker build -f Dockerfile -t svoya-igra-client .
    docker run -d -p 80:80 svoya-igra-client
    

Переменные окружения для production

Client (.env.production):

# Если API на другом домене/сервере
VITE_SERVER_URL=https://api.example.com

# Если на том же сервере, но другой порт
VITE_SERVER_URL=https://example.com:3001

# Если оставить пустым - автоопределение
VITE_SERVER_URL=

Server (.env):

PORT=3001
MONGODB_URI=mongodb://localhost:27017/svoya-igra
NODE_ENV=production

Проверка работоспособности

После развертывания проверьте:

  1. Клиент загружается:

    curl https://game.example.com
    
  2. Сервер отвечает:

    curl https://game.example.com:3001
    # или
    curl https://api.example.com
    
  3. Socket.io подключается: Откройте DevTools → Network → WS → проверьте подключение к socket.io

  4. Изображения загружаются: Создайте игру с вопросом-картинкой и проверьте загрузку


Обновление приложения

# Остановите контейнеры
docker-compose -f docker-compose.prod.yml down

# Обновите код
git pull

# Пересоберите и запустите
docker-compose -f docker-compose.prod.yml up -d --build

Мониторинг и логи

# Посмотреть логи всех сервисов
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

# Создать бэкап
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:

    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 мониторинг