2025-08-02 00:18:09 +03:00
|
|
|
|
# Развертывание
|
|
|
|
|
|
|
|
|
|
|
|
## Обзор
|
|
|
|
|
|
|
|
|
|
|
|
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: <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`:
|
|
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
|
[Unit]
|
|
|
|
|
|
Description=Quoter File Service
|
|
|
|
|
|
After=network.target redis.service
|
|
|
|
|
|
|
|
|
|
|
|
[Service]
|
|
|
|
|
|
Type=simple
|
2025-09-01 20:36:15 +03:00
|
|
|
|
Author=quoter
|
2025-08-02 00:18:09 +03:00
|
|
|
|
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
|
|
|
|
|
|
- Не храните секреты в коде
|
|
|
|
|
|
- Ротация ключей доступа
|
|
|
|
|
|
|
|
|
|
|
|
### Аудит
|
|
|
|
|
|
|
|
|
|
|
|
- Логируйте все операции с файлами
|
|
|
|
|
|
- Отслеживайте использование квот
|
|
|
|
|
|
- Мониторьте подозрительную активность
|