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