318 lines
6.8 KiB
Markdown
318 lines
6.8 KiB
Markdown
# Развертывание
|
||
|
||
## Обзор
|
||
|
||
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
|
||
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
|
||
- Не храните секреты в коде
|
||
- Ротация ключей доступа
|
||
|
||
### Аудит
|
||
|
||
- Логируйте все операции с файлами
|
||
- Отслеживайте использование квот
|
||
- Мониторьте подозрительную активность |