mirror of
https://gitverse.ru/kpa39l/yaru.nixg.ru.git
synced 2026-09-29 09:55:06 +00:00
Деплой и инфраструктура
Архитектура развёртывания
┌─────────────────┐
│ 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)?