nakama/DEPLOYMENT.md

12 KiB
Raw Blame History

🚀 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:
npm i -g @railway/cli
railway login
  1. Создать проект:
cd /Users/glpshchn/Desktop/nakama
railway init
  1. Добавить MongoDB плагин:
railway add mongodb
  1. Настроить переменные окружения:
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
  1. Деплой:
railway up
  1. Получить URL:
railway domain

Frontend

  1. Установить Vercel CLI:
npm i -g vercel
  1. Настроить .env.production:
cd frontend
echo "VITE_API_URL=https://your-railway-app.railway.app/api" > .env.production
  1. Деплой:
vercel --prod
  1. Настроить Telegram Bot:
  • Откройте @BotFather
  • /mybots → Ваш бот → Bot Settings → Menu Button
  • Укажите URL: https://your-vercel-app.vercel.app

☁️ MongoDB Atlas Setup

  1. Создать аккаунт:

  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. Добавить в переменные:

railway variables set MONGODB_URI="mongodb+srv://user:pass@cluster.mongodb.net/nakama"

🐳 Docker Deployment

Dockerfile для Backend

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

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

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:
railway variables set REDIS_URL=redis://...
  1. Увеличить rate limits для production:
railway variables set RATE_LIMIT_GENERAL=1000
railway variables set RATE_LIMIT_POSTS=50
  1. Configure MongoDB indexes: MongoDB индексы уже настроены в моделях, но проверьте их создание:
db.posts.getIndexes()

Frontend

  1. Enable Vercel Edge Network:

    • Автоматически включается при деплое на Vercel
  2. Configure caching headers: Создайте vercel.json:

{
  "headers": [
    {
      "source": "/assets/(.*)",
      "headers": [
        {
          "key": "Cache-Control",
          "value": "public, max-age=31536000, immutable"
        }
      ]
    }
  ]
}

🔄 CI/CD Setup

GitHub Actions (Railway)

Создайте .github/workflows/deploy.yml:

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
  1. Настроить Description:
/mybots → Выбрать бота → Edit Bot → Edit Description
"NakamaSpace - мини-социальная сеть для Furry и Anime сообщества"
  1. Добавить команды:
/mybots → Выбрать бота → Edit Bot → Edit Commands

start - Запустить NakamaSpace
help - Помощь
profile - Мой профиль

🧪 Testing Production

После деплоя проверьте:

  1. Health check:
curl https://your-api.railway.app/health
  1. API доступность:
curl https://your-api.railway.app/api
  1. WebSocket:
const socket = io('https://your-api.railway.app')
socket.on('connect', () => console.log('Connected!'))
  1. Frontend:
  • Откройте https://your-app.vercel.app
  • Проверьте что API запросы работают
  • Проверьте авторизацию через Telegram
  1. Telegram Mini App:
  • Откройте бота в Telegram
  • Нажмите Menu Button
  • Проверьте что приложение загружается

🐛 Troubleshooting

CORS Errors

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

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

git push origin main
# Railway автоматически задеплоит

Frontend Update

cd frontend
vercel --prod

Database Migration

Если изменились модели:

# Подключиться к 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 - подробная инструкция
  2. QUICKSTART.md - быстрый старт
  3. GitHub Issues - создайте issue с описанием проблемы