303 lines
8.4 KiB
Markdown
303 lines
8.4 KiB
Markdown
# Инструкция по развертыванию на удаленном сервере
|
||
|
||
## Вариант 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 мониторинг
|