nakama/DEPLOYMENT.md

535 lines
12 KiB
Markdown
Raw Normal View History

2025-11-03 20:35:01 +00:00
# 🚀 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 с описанием проблемы