Indexium/docs/deployment.md

119 lines
3 KiB
Markdown

# Деплой Indexium
## MVP (один VPS, <$20/мес)
### Инфра
- **VPS**: Hetzner CX22 (2 vCPU, 4GB) или аналог.
- **Postgres**: Supabase Free / Neon Free / или Docker на том же VPS.
- **Redis**: Valkey/Redis в Docker.
- **Reverse proxy**: Caddy (авто TLS) или Nginx.
### Компоновка
```
VPS
├─ Caddy :80/:443 → :3000 (Axum) + :5173 (SvelteKit SSR)
├─ indexium-backend (systemd / docker)
├─ indexium-frontend (adapter-node)
├─ postgres:5432
└─ redis:6379
```
### Docker Compose (prod)
```yaml
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: indexium
POSTGRES_USER: indexium
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes: [pgdata:/var/lib/postgresql/data]
healthcheck: { test: ["CMD-SHELL", "pg_isready -U indexium"] }
redis:
image: valkey/valkey:8-alpine
command: ["valkey-server", "--save", ""]
healthcheck: { test: ["CMD", "valkey-cli", "ping"] }
backend:
build: ./indexium-backend
env_file: ./indexium-backend/.env
depends_on: [postgres, redis]
ports: ["3000:3000"]
frontend:
build: ./indexium-frontend
environment: { PUBLIC_API_URL: "https://api.indexium.example.com" }
ports: ["5173:3000"]
volumes: { pgdata: {} }
```
### Env (backend)
```
DATABASE_URL=postgres://indexium:***@postgres:5432/indexium
REDIS_URL=redis://redis:6379
GITHUB_APP_ID=...
GITHUB_APP_PRIVATE_KEY=...
WEBHOOK_SECRET=...
RUST_LOG=info
```
### Деплой шаги
```bash
# на VPS
git pull origin main
docker compose -f docker-compose.prod.yml build
docker compose -f docker-compose.prod.yml up -d
# миграции
docker compose exec backend sqlx migrate run
# проверка
curl https://api.indexium.example.com/api/v1/health
```
### Бэкапы
- Postgres: ежедневный `pg_dump` + WAL (PITR если managed).
- Хранить 7 дней в S3/R2.
- Тест восстановления раз в месяц.
### Мониторинг (MVP минимум)
- `/health` + Uptime Kuma / Hetrix.
- Логи: `journalctl -u indexium-backend` или `docker logs`.
- Позже: Prometheus + Grafana + Loki.
### CI/CD (GitHub Actions)
```yaml
# .github/workflows/ci.yml
on: [push, pull_request]
jobs:
backend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo fmt --check
- run: cargo clippy -- -D warnings
- run: cargo test
frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install --cwd indexium-frontend
- run: bun run check --cwd indexium-frontend
```
Деплой: `on: push: branches: [main]` → SSH в VPS → `git pull && docker compose up -d` (или через Watchtower).
### Масштабирование (когда >1k RPS)
- Вынести Worker в отдельный сервис/реплики.
- Postgres read-replica.
- Redis Cluster / NATS JetStream.
- Cloudflare перед API (кэш GET).