nakama/DEPLOYMENT.md

535 lines
12 KiB
Markdown
Raw 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.

# 🚀 Deployment Guide - NakamaSpace
Инструкция по деплою NakamaSpace на production серверы.
## 📋 Требования
### Backend
- Node.js 16+
- MongoDB 5+ (или MongoDB Atlas)
- Redis (опционально, для кэширования)
- HTTPS сертификат
### Frontend
- Node.js 16+ (для сборки)
- Статический хостинг или CDN
---
## 🌐 Рекомендуемые платформы
### Backend + MongoDB
1. **Railway** (самый простой) ⭐
2. **Render** (бесплатный tier)
3. **Heroku** (платный)
4. **DigitalOcean App Platform**
5. **AWS Elastic Beanstalk**
6. **Google Cloud Run**
### Frontend
1. **Vercel** (оптимально для Vite) ⭐
2. **Netlify**
3. **Cloudflare Pages**
4. **GitHub Pages** (с настройкой)
### MongoDB
1. **MongoDB Atlas** (бесплатный M0 tier) ⭐
2. **DigitalOcean Managed Database**
3. **AWS DocumentDB**
### Redis (опционально)
1. **Upstash** (serverless, бесплатный tier)
2. **Redis Cloud**
3. **Railway Redis**
---
## 🚂 Railway Deployment (Рекомендуется)
### Backend
1. **Установить Railway CLI:**
```bash
npm i -g @railway/cli
railway login
```
2. **Создать проект:**
```bash
cd /Users/glpshchn/Desktop/nakama
railway init
```
3. **Добавить MongoDB плагин:**
```bash
railway add mongodb
```
4. **Настроить переменные окружения:**
```bash
railway variables set NODE_ENV=production
railway variables set JWT_SECRET=$(openssl rand -base64 32)
railway variables set TELEGRAM_BOT_TOKEN=your_token_here
railway variables set FRONTEND_URL=https://your-frontend.vercel.app
```
5. **Деплой:**
```bash
railway up
```
6. **Получить URL:**
```bash
railway domain
```
### Frontend
1. **Установить Vercel CLI:**
```bash
npm i -g vercel
```
2. **Настроить .env.production:**
```bash
cd frontend
echo "VITE_API_URL=https://your-railway-app.railway.app/api" > .env.production
```
3. **Деплой:**
```bash
vercel --prod
```
4. **Настроить Telegram Bot:**
- Откройте @BotFather
- `/mybots` → Ваш бот → Bot Settings → Menu Button
- Укажите URL: `https://your-vercel-app.vercel.app`
---
## ☁️ MongoDB Atlas Setup
1. **Создать аккаунт:**
- Зайдите на https://www.mongodb.com/cloud/atlas
- Создайте бесплатный M0 cluster
2. **Настроить доступ:**
- Database Access → Add User
- Network Access → Add IP (0.0.0.0/0 для всех)
3. **Получить Connection String:**
- Cluster → Connect → Connect your application
- Скопируйте URI: `mongodb+srv://...`
4. **Добавить в переменные:**
```bash
railway variables set MONGODB_URI="mongodb+srv://user:pass@cluster.mongodb.net/nakama"
```
---
## 🐳 Docker Deployment
### Dockerfile для Backend
```dockerfile
FROM node:18-alpine
WORKDIR /app
# Установить зависимости
COPY package*.json ./
RUN npm ci --only=production
# Скопировать код
COPY backend ./backend
# Создать папку для uploads
RUN mkdir -p backend/uploads
EXPOSE 3000
CMD ["node", "backend/server.js"]
```
### Dockerfile для Frontend
```dockerfile
FROM node:18-alpine AS builder
WORKDIR /app
# Установить зависимости
COPY frontend/package*.json ./
RUN npm ci
# Скопировать код
COPY frontend ./
# Собрать
RUN npm run build
# Production образ
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
```
### docker-compose.yml
```yaml
version: '3.8'
services:
backend:
build:
context: .
dockerfile: Dockerfile.backend
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- MONGODB_URI=mongodb://mongo:27017/nakama
- JWT_SECRET=${JWT_SECRET}
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
depends_on:
- mongo
- redis
restart: unless-stopped
frontend:
build:
context: .
dockerfile: Dockerfile.frontend
ports:
- "80:80"
depends_on:
- backend
restart: unless-stopped
mongo:
image: mongo:6
volumes:
- mongo_data:/data/db
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
mongo_data:
```
---
## 🔧 Environment Variables Checklist
### Backend (.env.production)
-`NODE_ENV=production`
-`MONGODB_URI` - MongoDB connection string
-`PORT` - Порт сервера (обычно 3000)
-`JWT_SECRET` - Случайная строка (openssl rand -base64 32)
-`TELEGRAM_BOT_TOKEN` - Токен от @BotFather
-`FRONTEND_URL` - URL frontend приложения
-`CORS_ORIGIN` - Разрешённые origins (через запятую)
- ⚙️ `REDIS_URL` - (опционально) Redis connection string
### Frontend (.env.production)
-`VITE_API_URL` - URL backend API
---
## 🔐 Security Checklist
Перед деплоем проверьте:
- [ ] JWT_SECRET изменён на случайную строку
- [ ] MongoDB доступ ограничен (не 0.0.0.0/0 в prod)
- [ ] CORS настроен правильно (не '*' в prod)
- [ ] Rate limiting включён
- [ ] HTTPS настроен (обязательно для Telegram Mini App)
- [ ] Переменные окружения не закоммичены в Git
- [ ] MongoDB Atlas IP whitelist настроен
- [ ] Telegram Bot webhook настроен правильно
---
## 📊 Performance Optimization
### Backend
1. **Enable Redis caching:**
```bash
railway variables set REDIS_URL=redis://...
```
2. **Увеличить rate limits для production:**
```bash
railway variables set RATE_LIMIT_GENERAL=1000
railway variables set RATE_LIMIT_POSTS=50
```
3. **Configure MongoDB indexes:**
MongoDB индексы уже настроены в моделях, но проверьте их создание:
```bash
db.posts.getIndexes()
```
### Frontend
1. **Enable Vercel Edge Network:**
- Автоматически включается при деплое на Vercel
2. **Configure caching headers:**
Создайте `vercel.json`:
```json
{
"headers": [
{
"source": "/assets/(.*)",
"headers": [
{
"key": "Cache-Control",
"value": "public, max-age=31536000, immutable"
}
]
}
]
}
```
---
## 🔄 CI/CD Setup
### GitHub Actions (Railway)
Создайте `.github/workflows/deploy.yml`:
```yaml
name: Deploy to Railway
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Railway
run: npm i -g @railway/cli
- name: Deploy
run: railway up
env:
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
```
---
## 📱 Telegram Bot Setup
1. **Настроить Menu Button:**
```
/mybots → Выбрать бота → Bot Settings → Menu Button
URL: https://your-vercel-app.vercel.app
Text: Открыть NakamaSpace
```
2. **Настроить Description:**
```
/mybots → Выбрать бота → Edit Bot → Edit Description
"NakamaSpace - мини-социальная сеть для Furry и Anime сообщества"
```
3. **Добавить команды:**
```
/mybots → Выбрать бота → Edit Bot → Edit Commands
start - Запустить NakamaSpace
help - Помощь
profile - Мой профиль
```
---
## 🧪 Testing Production
После деплоя проверьте:
1. **Health check:**
```bash
curl https://your-api.railway.app/health
```
2. **API доступность:**
```bash
curl https://your-api.railway.app/api
```
3. **WebSocket:**
```javascript
const socket = io('https://your-api.railway.app')
socket.on('connect', () => console.log('Connected!'))
```
4. **Frontend:**
- Откройте `https://your-app.vercel.app`
- Проверьте что API запросы работают
- Проверьте авторизацию через Telegram
5. **Telegram Mini App:**
- Откройте бота в Telegram
- Нажмите Menu Button
- Проверьте что приложение загружается
---
## 🐛 Troubleshooting
### CORS Errors
```bash
railway variables set CORS_ORIGIN=https://your-frontend.vercel.app
```
### Telegram Init Data Invalid
- Проверьте что TELEGRAM_BOT_TOKEN правильный
- Проверьте что используется HTTPS
### MongoDB Connection Failed
- Проверьте MONGODB_URI
- Проверьте IP whitelist в Atlas
- Проверьте что пароль не содержит специальных символов (URL encode)
### Redis Connection Failed
- Это нормально, приложение работает без Redis
- Для включения: настройте REDIS_URL
### WebSocket не подключается
- Проверьте CORS_ORIGIN
- Проверьте что используется wss:// (не ws://) для HTTPS
---
## 📈 Monitoring
### Railway Logs
```bash
railway logs
```
### MongoDB Atlas Monitoring
- Atlas Dashboard → Metrics
- Отслеживайте: Connections, Operations, Storage
### Uptime Monitoring
Используйте:
- **UptimeRobot** (бесплатно)
- **Pingdom**
- **StatusCake**
Мониторьте endpoints:
- `https://your-api.railway.app/health`
- `https://your-frontend.vercel.app`
---
## 🔄 Updates
### Backend Update
```bash
git push origin main
# Railway автоматически задеплоит
```
### Frontend Update
```bash
cd frontend
vercel --prod
```
### Database Migration
Если изменились модели:
```bash
# Подключиться к MongoDB
mongo "mongodb+srv://..."
# Выполнить миграцию
db.posts.createIndex({ content: "text", hashtags: "text" })
```
---
## 🌍 Доступность для пользователей из РФ
### Проксирование изображений
NakamaSpace автоматически проксирует изображения с e621 и gelbooru через ваш сервер, что обеспечивает доступность контента для пользователей из РФ, где эти сайты могут быть заблокированы.
**Как это работает:**
1. API запросы к e621 и gelbooru выполняются с вашего сервера
2. URL изображений автоматически заменяются на прокси-URL вашего сервера
3. Изображения стримятся через эндпоинт `/api/search/proxy/:encodedUrl`
4. Добавлено кэширование (24 часа) для оптимизации производительности
**Поддерживаемые домены:**
- `e621.net`
- `static1.e621.net`
- `gelbooru.com`
- `static1.gelbooru.com`
**Важно:**
- Убедитесь, что ваш сервер имеет доступ к этим доменам
- Рекомендуется использовать сервер вне РФ для надежного доступа к источникам
- Проксирование происходит автоматически, никаких дополнительных настроек не требуется
---
## 💰 Costs Estimate
### Free Tier (Starter)
- **Railway**: $5/month credits (достаточно для старта)
- **MongoDB Atlas**: Free M0 (512MB)
- **Vercel**: Free (100GB bandwidth)
- **Total**: ~$0-5/month
### Production Tier
- **Railway**: ~$10-20/month
- **MongoDB Atlas**: M2 $9/month (2GB)
- **Redis**: Upstash $10/month или Railway $5/month
- **Vercel**: Pro $20/month (больше bandwidth)
- **Total**: ~$30-60/month
---
## 🎉 Ready!
После выполнения всех шагов у вас будет:
- ✅ Backend на Railway с MongoDB Atlas
- ✅ Frontend на Vercel
- ✅ HTTPS для обоих
- ✅ Telegram Bot настроен
- ✅ Monitoring включён
**Ваш NakamaSpace готов к использованию!** 🚀
---
## 📞 Support
Проблемы при деплое? Проверьте:
1. [SETUP.md](SETUP.md) - подробная инструкция
2. [QUICKSTART.md](QUICKSTART.md) - быстрый старт
3. GitHub Issues - создайте issue с описанием проблемы