# Развертывание ## Обзор Quoter можно развернуть различными способами в зависимости от ваших потребностей и инфраструктуры. ## Способы развертывания ### 1. Docker (Рекомендуется) #### Сборка образа ```bash # Сборка production образа docker build -t quoter:latest . # Сборка с тегами docker build -t quoter:v1.0.0 . ``` #### Запуск контейнера ```bash 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`: ```yaml 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: ``` Запуск: ```bash docker-compose up -d ``` ### 2. Kubernetes #### Deployment Создайте `k8s/deployment.yaml`: ```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 ```yaml apiVersion: v1 kind: Service metadata: name: quoter-service spec: selector: app: quoter ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer ``` #### Secrets ```yaml apiVersion: v1 kind: Secret metadata: name: quoter-secrets type: Opaque data: storj-access-key: storj-secret-key: aws-access-key: aws-secret-key: ``` ### 3. Systemd (Linux) #### Создание сервиса Создайте `/etc/systemd/system/quoter.service`: ```ini [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 ``` #### Управление сервисом ```bash # Создание пользователя 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`: ```toml [dependencies] prometheus = "0.13" actix-web-prom = "0.6" ``` ### Grafana дашборд Создайте дашборд для мониторинга: - Количество запросов в секунду - Время ответа API - Использование памяти и CPU - Ошибки по типам - Использование квот ### Логирование #### Структурированные логи ```bash # 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 - Не храните секреты в коде - Ротация ключей доступа ### Аудит - Логируйте все операции с файлами - Отслеживайте использование квот - Мониторьте подозрительную активность