Initial commit: Своя Игра - multiplayer quiz game

This commit is contained in:
Cosmo
2026-03-21 05:00:06 +00:00
commit 1d46ad8b06
80 changed files with 9215 additions and 0 deletions

302
DEPLOYMENT.md Normal file
View File

@@ -0,0 +1,302 @@
# Инструкция по развертыванию на удаленном сервере
## Вариант 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 мониторинг