8.4 KiB
Инструкция по развертыванию на удаленном сервере
Вариант 1: Один сервер (проще)
Если у вас один сервер и вы хотите развернуть все на одном домене:
Требования:
- Ubuntu/Debian сервер
- Docker и Docker Compose
- Домен (например,
game.example.com)
Шаги:
-
Подключитесь к серверу:
ssh user@your-server.com -
Установите 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 -
Клонируйте репозиторий:
git clone <your-repo-url> cd my-game -
Запустите production версию:
docker-compose -f docker-compose.prod.yml up -d --build -
Настройте 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 -
Настройте 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, можно открыть порты напрямую:
-
Запустите production версию:
docker-compose -f docker-compose.prod.yml up -d --build -
Откройте порты в firewall:
sudo ufw allow 80 sudo ufw allow 3001 -
Доступ:
- Клиент:
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
-
Запустите только сервер:
docker run -d \ -p 3001:3001 \ -e MONGODB_URI=mongodb://mongodb:27017/svoya-igra \ svoya-igra-server -
Настройте 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
-
Создайте
.env.production:VITE_SERVER_URL=https://api.example.com -
Соберите и запустите:
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
Проверка работоспособности
После развертывания проверьте:
-
Клиент загружается:
curl https://game.example.com -
Сервер отвечает:
curl https://game.example.com:3001 # или curl https://api.example.com -
Socket.io подключается: Откройте DevTools → Network → WS → проверьте подключение к
socket.io -
Изображения загружаются: Создайте игру с вопросом-картинкой и проверьте загрузку
Обновление приложения
# Остановите контейнеры
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
Решение:
- Проверьте что порт 3001 открыт
- Убедитесь что nginx проксирует
/socket.io/ - Проверьте CORS настройки на сервере
Изображения не загружаются
Проблема: 404 на /uploads/image.jpg
Решение:
- Убедитесь что файлы есть в
server/public/uploads/ - Проверьте volume в docker-compose:
./server/public:/app/public - Проверьте статическую раздачу в
server/src/index.js
Клиент не подключается к серверу
Проблема: Клиент пытается подключиться к localhost вместо домена
Решение:
- Проверьте
.env.production - Пересоберите клиент:
docker-compose -f docker-compose.prod.yml up -d --build client - Очистите кеш браузера
Оптимизация для production
-
Включите gzip в nginx (уже добавлено в nginx.conf)
-
Настройте CDN для статических файлов (опционально)
-
Добавьте 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; ... } -
Настройте PM2 для автоперезагрузки сервера при падении (опционально)
-
Мониторинг: используйте Grafana + Prometheus или простой uptime мониторинг