Files
yaru.nixg.ru/docs/deployment

Деплой и инфраструктура

Архитектура развёртывания

                    ┌─────────────────┐
                    │   Nginx/Traefik │
                    │   (reverse proxy)│
                    └────────┬────────┘
                             │
              ┌──────────────┼──────────────┐
              │              │              │
     ┌────────▼───────┐ ┌───▼────────┐ ┌───▼────────┐
     │   FastAPI App  │ │ FastAPI    │ │  PostgreSQL│
     │   (instance 1) │ │ (instance 2)│ │  + pgqueue │
     └────────────────┘ └────────────┘ └────────────┘

Docker контейнеризация

Структура проекта

yaru.nixg.ru/
├── docker-compose.yml      # Основной compose для разработки
├── docker-compose.prod.yml # Production конфигурация
├── Dockerfile              # Образ приложения
└── docker/
    ├── nginx/
    └── postgres/

docker-compose.yml (разработка)

version: '3.8'

services:
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: yaru
      POSTGRES_USER: yaru
      POSTGRES_PASSWORD: yaru_dev
    volumes:
      - postgres_data:/var/lib/postgresql/data

  app:
    build: .
    command: uvicorn main:app --reload --host 0.0.0.0
    volumes:
      - .:/app
    environment:
      DATABASE_URL: postgresql://yaru:yaru_dev@db/yaru
    depends_on:
      - db

  nginx:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./docker/nginx/dev.conf:/etc/nginx/nginx.conf

volumes:
  postgres_data:

Production развёртывание

Требования

  • VPS с Ubuntu 22.04+ (минимум 2GB RAM, 2 CPU)
  • Домен с настроенным DNS
  • SSL сертификат (Let's Encrypt)

Переменные окружения (production)

# База данных
DATABASE_URL=postgresql://yaru:***@localhost/yaru_prod
DATABASE_POOL_SIZE=20

# Безопасность
SECRET_KEY=***
JWT_EXPIRE_HOURS=24

# Файлы
MEDIA_ROOT=/var/yaru/media
MAX_UPLOAD_SIZE=50MB

# Fediverse
SERVER_DOMAIN=yaru.nixg.ru
SERVER_NAME=YARU

# Логирование
LOG_LEVEL=INFO

CI/CD пайплайн

GitHub Actions (пример)

name: Deploy

on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run tests
        run: pytest

  deploy:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to VPS
        run: |
          ssh user@server "cd /var/yaru && docker-compose pull && docker-compose up -d"

Мониторинг и логирование

Логи

  • Access logs (Nginx)
  • Application logs (FastAPI → JSON format)
  • Database logs (PostgreSQL slow queries)

Метрики для мониторинга

  • Response time (p50, p95, p99)
  • Error rate
  • Active users
  • Posts per hour
  • Federation activities

Инструменты

  • Prometheus + Grafana (метрики)
  • Loki (логи)
  • Uptime Kuma (доступность)

Резервное копирование

Что备份ровать

  • PostgreSQL дамп (ежедневно)
  • Медиафайлы (ежедневно)
  • Конфигурационные файлы

Стратегия

# Ежедневный бэкап БД
pg_dump -U yaru yaru > /backups/yaru_$(date +%Y%m%d).sql

# Синхронизация медиа
rsync -av /var/yaru/media /backups/media/

# Хранение: 7 дней локально, 30 дней в облаке

Масштабирование

Горизонтальное

  • Несколько инстансов FastAPI за load balancer
  • PostgreSQL репликация (read replicas)
  • CDN для статики и медиа

Оптимизация

  • Кэширование лент в Redis
  • Индексы PostgreSQL для частых запросов
  • Фоновая отправка ActivityPub через очереди

Чеклист деплоя

  • Купить домен, настроить DNS
  • Подготовить VPS (Ubuntu, firewall, SSH keys)
  • Установить Docker + Docker Compose
  • Настроить Nginx + SSL (Let's Encrypt)
  • Развернуть PostgreSQL
  • Запустить FastAPI приложение
  • Настроить бэкапы
  • Настроить мониторинг
  • Протестировать ActivityPub federation

Вопросы для обсуждения

  • Какой хостинг выбрать (Timeweb, Selectel, Hetzner, DigitalOcean)?
  • Нужен ли отдельный сервер для БД или всё на одном VPS?
  • Использовать ли managed PostgreSQL или свой инстанс?
  • Требуется ли CDN для медиа (Cloudflare, BunnyCDN)?