Files
quoter/docs/deployment.md
Untone 6c3262edbe
Some checks failed
Deploy / deploy (push) Has been skipped
CI / lint (push) Failing after 8s
CI / test (push) Failing after 3m57s
simpler-auth+no-overlay
2025-09-01 20:36:15 +03:00

6.8 KiB
Raw Blame History

Развертывание

Обзор

Quoter можно развернуть различными способами в зависимости от ваших потребностей и инфраструктуры.

Способы развертывания

1. Docker (Рекомендуется)

Сборка образа

# Сборка production образа
docker build -t quoter:latest .

# Сборка с тегами
docker build -t quoter:v1.0.0 .

Запуск контейнера

docker run -d \
  --name quoter \
  -p 8080:8080 \
  -e REDIS_URL=redis://redis:6379 \
  -e CORE_URL=https://api.example.com/graphql \
  -e STORJ_ACCESS_KEY=your-key \
  -e STORJ_SECRET_KEY=your-secret \
  -e AWS_ACCESS_KEY=your-aws-key \
  -e AWS_SECRET_KEY=your-aws-secret \
  quoter:latest

Docker Compose

Создайте docker-compose.yml:

version: '3.8'

services:
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes

  quoter:
    build: .
    ports:
      - "8080:8080"
    environment:
      - REDIS_URL=redis://redis:6379
      - CORE_URL=https://api.example.com/graphql
      - STORJ_ACCESS_KEY=${STORJ_ACCESS_KEY}
      - STORJ_SECRET_KEY=${STORJ_SECRET_KEY}
      - AWS_ACCESS_KEY=${AWS_ACCESS_KEY}
      - AWS_SECRET_KEY=${AWS_SECRET_KEY}
      - RUST_LOG=info
    depends_on:
      - redis
    restart: unless-stopped

volumes:
  redis_data:

Запуск:

docker-compose up -d

2. Kubernetes

Deployment

Создайте k8s/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: quoter
  labels:
    app: quoter
spec:
  replicas: 3
  selector:
    matchLabels:
      app: quoter
  template:
    metadata:
      labels:
        app: quoter
    spec:
      containers:
      - name: quoter
        image: quoter:latest
        ports:
        - containerPort: 8080
        env:
        - name: REDIS_URL
          value: "redis://redis-service:6379"
        - name: CORE_URL
          value: "https://api.example.com/graphql"
        - name: STORJ_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: quoter-secrets
              key: storj-access-key
        - name: STORJ_SECRET_KEY
          valueFrom:
            secretKeyRef:
              name: quoter-secrets
              key: storj-secret-key
        - name: AWS_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: quoter-secrets
              key: aws-access-key
        - name: AWS_SECRET_KEY
          valueFrom:
            secretKeyRef:
              name: quoter-secrets
              key: aws-secret-key
        - name: RUST_LOG
          value: "info"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

Service

apiVersion: v1
kind: Service
metadata:
  name: quoter-service
spec:
  selector:
    app: quoter
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: LoadBalancer

Secrets

apiVersion: v1
kind: Secret
metadata:
  name: quoter-secrets
type: Opaque
data:
  storj-access-key: <base64-encoded-key>
  storj-secret-key: <base64-encoded-secret>
  aws-access-key: <base64-encoded-key>
  aws-secret-key: <base64-encoded-secret>

3. Systemd (Linux)

Создание сервиса

Создайте /etc/systemd/system/quoter.service:

[Unit]
Description=Quoter File Service
After=network.target redis.service

[Service]
Type=simple
Author=quoter
Group=quoter
WorkingDirectory=/opt/quoter
Environment=REDIS_URL=redis://localhost:6379
Environment=CORE_URL=https://api.example.com/graphql
Environment=STORJ_ACCESS_KEY=your-key
Environment=STORJ_SECRET_KEY=your-secret
Environment=AWS_ACCESS_KEY=your-aws-key
Environment=AWS_SECRET_KEY=your-aws-secret
Environment=RUST_LOG=info
ExecStart=/opt/quoter/quoter
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Управление сервисом

# Создание пользователя
sudo useradd -r -s /bin/false quoter

# Копирование бинарного файла
sudo cp target/release/quoter /opt/quoter/
sudo chown quoter:quoter /opt/quoter/quoter

# Включение и запуск сервиса
sudo systemctl daemon-reload
sudo systemctl enable quoter
sudo systemctl start quoter

# Проверка статуса
sudo systemctl status quoter

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

Prometheus метрики

Добавьте в Cargo.toml:

[dependencies]
prometheus = "0.13"
actix-web-prom = "0.6"

Grafana дашборд

Создайте дашборд для мониторинга:

  • Количество запросов в секунду
  • Время ответа API
  • Использование памяти и CPU
  • Ошибки по типам
  • Использование квот

Логирование

Структурированные логи

# JSON формат для ELK stack
RUST_LOG=info cargo run | jq .

Ротация логов

Настройте logrotate:

/var/log/quoter/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 644 quoter quoter
    postrotate
        systemctl reload quoter
    endscript
}

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

Горизонтальное масштабирование

  1. Load Balancer: Настройте nginx или HAProxy
  2. Redis Cluster: Для высоких нагрузок
  3. S3 CDN: Для статических файлов

Вертикальное масштабирование

  • Увеличьте ресурсы контейнера/сервера
  • Настройте пул соединений Redis
  • Оптимизируйте размер изображений

Безопасность

Сетевая безопасность

  • Используйте HTTPS в продакшене
  • Настройте firewall
  • Ограничьте доступ к Redis

Секреты

  • Используйте Kubernetes Secrets или Docker Secrets
  • Не храните секреты в коде
  • Ротация ключей доступа

Аудит

  • Логируйте все операции с файлами
  • Отслеживайте использование квот
  • Мониторьте подозрительную активность