Files
my-game/DEPLOYMENT.md

303 lines
8.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Инструкция по развертыванию на удаленном сервере
## Вариант 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 мониторинг