docs
This commit is contained in:
318
docs/deployment.md
Normal file
318
docs/deployment.md
Normal file
@@ -0,0 +1,318 @@
|
||||
# Развертывание
|
||||
|
||||
## Обзор
|
||||
|
||||
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
|
||||
User=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
|
||||
- Не храните секреты в коде
|
||||
- Ротация ключей доступа
|
||||
|
||||
### Аудит
|
||||
|
||||
- Логируйте все операции с файлами
|
||||
- Отслеживайте использование квот
|
||||
- Мониторьте подозрительную активность
|
||||
Reference in New Issue
Block a user