535 lines
12 KiB
Markdown
535 lines
12 KiB
Markdown
|
|
# 🚀 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 с описанием проблемы
|
|||
|
|
|