# Деплой и инфраструктура ## Архитектура развёртывания ``` ┌─────────────────┐ │ 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 (разработка) ```yaml 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) ```bash # База данных 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 (пример) ```yaml 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 дамп (ежедневно) - [ ] Медиафайлы (ежедневно) - [ ] Конфигурационные файлы ### Стратегия ```bash # Ежедневный бэкап БД 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)?