first commit
This commit is contained in:
579
AIEC-RAG/DEPLOYMENT_GUIDE.md
Normal file
579
AIEC-RAG/DEPLOYMENT_GUIDE.md
Normal file
@ -0,0 +1,579 @@
|
||||
# AIEC-RAG 部署指南
|
||||
|
||||
## 目录
|
||||
|
||||
1. [部署架构](#部署架构)
|
||||
2. [单机部署](#单机部署)
|
||||
3. [Docker部署](#docker部署)
|
||||
4. [生产环境部署](#生产环境部署)
|
||||
5. [性能调优](#性能调优)
|
||||
6. [监控配置](#监控配置)
|
||||
7. [备份恢复](#备份恢复)
|
||||
|
||||
## 部署架构
|
||||
|
||||
### 推荐架构
|
||||
|
||||
```
|
||||
[负载均衡器]
|
||||
|
|
||||
┌────────────┼────────────┐
|
||||
↓ ↓ ↓
|
||||
[AIEC-RAG-1] [AIEC-RAG-2] [AIEC-RAG-3]
|
||||
↓ ↓ ↓
|
||||
└────────────┼────────────┘
|
||||
↓
|
||||
[Elasticsearch集群]
|
||||
↓
|
||||
[向量数据库]
|
||||
```
|
||||
|
||||
### 最小配置要求
|
||||
|
||||
| 组件 | CPU | 内存 | 存储 | 说明 |
|
||||
|-----|-----|------|------|------|
|
||||
| API服务 | 4核 | 8GB | 50GB | 单实例最小配置 |
|
||||
| Elasticsearch | 4核 | 16GB | 200GB | 推荐使用SSD |
|
||||
| 整体系统 | 8核 | 32GB | 500GB | 生产环境推荐 |
|
||||
|
||||
## 单机部署
|
||||
|
||||
### 1. 系统准备
|
||||
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt update
|
||||
sudo apt install -y python3.8 python3-pip git curl wget
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum update -y
|
||||
sudo yum install -y python38 python38-pip git curl wget
|
||||
```
|
||||
|
||||
### 2. 安装Elasticsearch
|
||||
|
||||
```bash
|
||||
# 下载并安装Elasticsearch 8.x
|
||||
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.0-linux-x86_64.tar.gz
|
||||
tar -xzf elasticsearch-8.11.0-linux-x86_64.tar.gz
|
||||
cd elasticsearch-8.11.0
|
||||
|
||||
# 配置Elasticsearch
|
||||
cat >> config/elasticsearch.yml << EOF
|
||||
network.host: 0.0.0.0
|
||||
discovery.type: single-node
|
||||
xpack.security.enabled: true
|
||||
xpack.security.authc.api_key.enabled: true
|
||||
EOF
|
||||
|
||||
# 启动Elasticsearch
|
||||
./bin/elasticsearch -d
|
||||
```
|
||||
|
||||
### 3. 部署AIEC-RAG
|
||||
|
||||
```bash
|
||||
# 克隆项目
|
||||
git clone <repository_url>
|
||||
cd AIEC-RAG
|
||||
|
||||
# 创建虚拟环境
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements.txt
|
||||
|
||||
# 配置环境变量
|
||||
cp .env.example .env
|
||||
# 编辑.env文件,填入实际配置
|
||||
|
||||
# 启动服务
|
||||
python rag_api_server_production.py
|
||||
```
|
||||
|
||||
### 4. 设置系统服务
|
||||
|
||||
创建 `/etc/systemd/system/aiec-rag.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=AIEC-RAG Service
|
||||
After=network.target elasticsearch.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=aiec
|
||||
WorkingDirectory=/opt/AIEC-RAG
|
||||
Environment="PATH=/opt/AIEC-RAG/venv/bin"
|
||||
ExecStart=/opt/AIEC-RAG/venv/bin/python /opt/AIEC-RAG/rag_api_server_production.py
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
启用服务:
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable aiec-rag
|
||||
sudo systemctl start aiec-rag
|
||||
sudo systemctl status aiec-rag
|
||||
```
|
||||
|
||||
## Docker部署
|
||||
|
||||
### 1. 使用预构建镜像
|
||||
|
||||
```bash
|
||||
# 拉取镜像(如果有私有仓库)
|
||||
docker pull your-registry/aiec-rag:latest
|
||||
|
||||
# 或构建本地镜像
|
||||
docker build -t aiec-rag:latest .
|
||||
```
|
||||
|
||||
### 2. Docker Compose部署
|
||||
|
||||
创建 `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
elasticsearch:
|
||||
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
|
||||
container_name: aiec-elasticsearch
|
||||
environment:
|
||||
- discovery.type=single-node
|
||||
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
|
||||
- xpack.security.enabled=true
|
||||
- ELASTIC_PASSWORD=your_password
|
||||
volumes:
|
||||
- es_data:/usr/share/elasticsearch/data
|
||||
ports:
|
||||
- "9200:9200"
|
||||
networks:
|
||||
- aiec_network
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:9200"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
aiec-rag:
|
||||
build: .
|
||||
container_name: aiec-rag
|
||||
depends_on:
|
||||
elasticsearch:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
- ELASTICSEARCH_HOST=http://elasticsearch:9200
|
||||
- ELASTICSEARCH_USERNAME=elastic
|
||||
- ELASTICSEARCH_PASSWORD=your_password
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- "8100:8100"
|
||||
volumes:
|
||||
- ./rag_config_production.yaml:/app/rag_config_production.yaml
|
||||
- ./api_outputs:/app/api_outputs
|
||||
networks:
|
||||
- aiec_network
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
es_data:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
aiec_network:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
启动服务:
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
### 3. Kubernetes部署
|
||||
|
||||
创建 `k8s-deployment.yaml`:
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: aiec-rag
|
||||
labels:
|
||||
app: aiec-rag
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: aiec-rag
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: aiec-rag
|
||||
spec:
|
||||
containers:
|
||||
- name: aiec-rag
|
||||
image: your-registry/aiec-rag:latest
|
||||
ports:
|
||||
- containerPort: 8100
|
||||
env:
|
||||
- name: ELASTICSEARCH_HOST
|
||||
value: "http://elasticsearch-service:9200"
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: aiec-secrets
|
||||
resources:
|
||||
requests:
|
||||
memory: "4Gi"
|
||||
cpu: "2"
|
||||
limits:
|
||||
memory: "8Gi"
|
||||
cpu: "4"
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /health
|
||||
port: 8100
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /health
|
||||
port: 8100
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 5
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: aiec-rag-service
|
||||
spec:
|
||||
selector:
|
||||
app: aiec-rag
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 8100
|
||||
type: LoadBalancer
|
||||
```
|
||||
|
||||
部署到Kubernetes:
|
||||
|
||||
```bash
|
||||
# 创建密钥
|
||||
kubectl create secret generic aiec-secrets --from-env-file=.env
|
||||
|
||||
# 部署应用
|
||||
kubectl apply -f k8s-deployment.yaml
|
||||
|
||||
# 查看状态
|
||||
kubectl get pods
|
||||
kubectl get services
|
||||
```
|
||||
|
||||
## 生产环境部署
|
||||
|
||||
### 1. 负载均衡配置
|
||||
|
||||
使用Nginx作为负载均衡器:
|
||||
|
||||
```nginx
|
||||
upstream aiec_backend {
|
||||
least_conn;
|
||||
server 10.0.1.10:8100 weight=1 max_fails=3 fail_timeout=30s;
|
||||
server 10.0.1.11:8100 weight=1 max_fails=3 fail_timeout=30s;
|
||||
server 10.0.1.12:8100 weight=1 max_fails=3 fail_timeout=30s;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.aiec-rag.com;
|
||||
|
||||
location / {
|
||||
proxy_pass http://aiec_backend;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# 超时设置
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 120s;
|
||||
proxy_read_timeout 120s;
|
||||
}
|
||||
|
||||
# 健康检查端点
|
||||
location /health {
|
||||
proxy_pass http://aiec_backend/health;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. SSL/TLS配置
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name api.aiec-rag.com;
|
||||
|
||||
ssl_certificate /etc/nginx/ssl/aiec-rag.crt;
|
||||
ssl_certificate_key /etc/nginx/ssl/aiec-rag.key;
|
||||
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
# ... 其他配置同上
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 数据库优化
|
||||
|
||||
Elasticsearch优化配置:
|
||||
|
||||
```yaml
|
||||
# elasticsearch.yml
|
||||
cluster.name: aiec-rag-cluster
|
||||
node.name: node-1
|
||||
|
||||
# 内存设置
|
||||
bootstrap.memory_lock: true
|
||||
|
||||
# 线程池
|
||||
thread_pool:
|
||||
write:
|
||||
size: 8
|
||||
queue_size: 1000
|
||||
search:
|
||||
size: 16
|
||||
queue_size: 1000
|
||||
|
||||
# 索引设置
|
||||
index:
|
||||
number_of_shards: 3
|
||||
number_of_replicas: 1
|
||||
refresh_interval: 30s
|
||||
```
|
||||
|
||||
## 性能调优
|
||||
|
||||
### 1. Python应用优化
|
||||
|
||||
```python
|
||||
# 使用Gunicorn作为WSGI服务器(Linux)
|
||||
gunicorn -w 4 -k uvicorn.workers.UvicornWorker \
|
||||
--bind 0.0.0.0:8100 \
|
||||
--timeout 120 \
|
||||
--keep-alive 5 \
|
||||
--max-requests 1000 \
|
||||
--max-requests-jitter 50 \
|
||||
rag_api_server_production:app
|
||||
```
|
||||
|
||||
### 2. 系统参数优化
|
||||
|
||||
```bash
|
||||
# /etc/sysctl.conf
|
||||
net.ipv4.tcp_fin_timeout = 30
|
||||
net.ipv4.tcp_tw_reuse = 1
|
||||
net.ipv4.tcp_tw_recycle = 1
|
||||
net.ipv4.tcp_max_syn_backlog = 8192
|
||||
net.ipv4.tcp_max_tw_buckets = 10000
|
||||
net.core.somaxconn = 65535
|
||||
net.core.netdev_max_backlog = 65535
|
||||
|
||||
# 应用配置
|
||||
sudo sysctl -p
|
||||
```
|
||||
|
||||
### 3. 缓存策略
|
||||
|
||||
配置Redis缓存:
|
||||
|
||||
```python
|
||||
# 在代码中添加缓存支持
|
||||
import redis
|
||||
from functools import lru_cache
|
||||
|
||||
redis_client = redis.Redis(
|
||||
host='localhost',
|
||||
port=6379,
|
||||
decode_responses=True,
|
||||
max_connections=50
|
||||
)
|
||||
|
||||
@lru_cache(maxsize=128)
|
||||
def get_cached_embedding(text: str):
|
||||
# 缓存嵌入向量
|
||||
pass
|
||||
```
|
||||
|
||||
## 监控配置
|
||||
|
||||
### 1. Prometheus监控
|
||||
|
||||
```yaml
|
||||
# prometheus.yml
|
||||
scrape_configs:
|
||||
- job_name: 'aiec-rag'
|
||||
static_configs:
|
||||
- targets: ['localhost:8100']
|
||||
metrics_path: '/metrics'
|
||||
scrape_interval: 15s
|
||||
```
|
||||
|
||||
### 2. 日志管理
|
||||
|
||||
配置日志轮转:
|
||||
|
||||
```bash
|
||||
# /etc/logrotate.d/aiec-rag
|
||||
/opt/AIEC-RAG/logs/*.log {
|
||||
daily
|
||||
rotate 30
|
||||
compress
|
||||
delaycompress
|
||||
missingok
|
||||
notifempty
|
||||
create 644 aiec aiec
|
||||
sharedscripts
|
||||
postrotate
|
||||
systemctl reload aiec-rag
|
||||
endscript
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 告警配置
|
||||
|
||||
```yaml
|
||||
# alerting_rules.yml
|
||||
groups:
|
||||
- name: aiec_alerts
|
||||
rules:
|
||||
- alert: HighResponseTime
|
||||
expr: http_request_duration_seconds{quantile="0.99"} > 5
|
||||
for: 5m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
summary: "High response time on {{ $labels.instance }}"
|
||||
|
||||
- alert: ServiceDown
|
||||
expr: up{job="aiec-rag"} == 0
|
||||
for: 1m
|
||||
labels:
|
||||
severity: critical
|
||||
annotations:
|
||||
summary: "AIEC-RAG service is down"
|
||||
```
|
||||
|
||||
## 备份恢复
|
||||
|
||||
### 1. 数据备份
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup.sh
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/backup/aiec-rag"
|
||||
|
||||
# 备份Elasticsearch数据
|
||||
curl -X PUT "localhost:9200/_snapshot/backup_repo" -H 'Content-Type: application/json' -d'
|
||||
{
|
||||
"type": "fs",
|
||||
"settings": {
|
||||
"location": "'$BACKUP_DIR'/elasticsearch"
|
||||
}
|
||||
}'
|
||||
|
||||
curl -X PUT "localhost:9200/_snapshot/backup_repo/snapshot_$DATE?wait_for_completion=true"
|
||||
|
||||
# 备份配置文件
|
||||
tar -czf $BACKUP_DIR/config_$DATE.tar.gz \
|
||||
/opt/AIEC-RAG/.env \
|
||||
/opt/AIEC-RAG/rag_config_production.yaml
|
||||
|
||||
echo "Backup completed: $DATE"
|
||||
```
|
||||
|
||||
### 2. 恢复流程
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# restore.sh
|
||||
SNAPSHOT_NAME=$1
|
||||
|
||||
# 恢复Elasticsearch数据
|
||||
curl -X POST "localhost:9200/_snapshot/backup_repo/$SNAPSHOT_NAME/_restore"
|
||||
|
||||
# 恢复配置文件
|
||||
tar -xzf /backup/aiec-rag/config_latest.tar.gz -C /
|
||||
|
||||
# 重启服务
|
||||
systemctl restart aiec-rag
|
||||
|
||||
echo "Restore completed from: $SNAPSHOT_NAME"
|
||||
```
|
||||
|
||||
## 故障处理
|
||||
|
||||
### 常见问题处理
|
||||
|
||||
1. **服务无响应**
|
||||
```bash
|
||||
# 检查服务状态
|
||||
systemctl status aiec-rag
|
||||
# 查看日志
|
||||
journalctl -u aiec-rag -n 100
|
||||
# 重启服务
|
||||
systemctl restart aiec-rag
|
||||
```
|
||||
|
||||
2. **Elasticsearch连接失败**
|
||||
```bash
|
||||
# 检查ES状态
|
||||
curl -X GET "localhost:9200/_cluster/health?pretty"
|
||||
# 检查网络连接
|
||||
telnet localhost 9200
|
||||
```
|
||||
|
||||
3. **内存溢出**
|
||||
```bash
|
||||
# 增加内存限制
|
||||
export PYTHONUNBUFFERED=1
|
||||
export OMP_NUM_THREADS=4
|
||||
```
|
||||
|
||||
## 安全建议
|
||||
|
||||
1. **API密钥管理**
|
||||
- 使用密钥管理服务(如HashiCorp Vault)
|
||||
- 定期轮换API密钥
|
||||
- 不要在代码中硬编码密钥
|
||||
|
||||
2. **网络安全**
|
||||
- 使用防火墙限制访问
|
||||
- 配置SSL/TLS加密
|
||||
- 实施速率限制
|
||||
|
||||
3. **数据安全**
|
||||
- 加密敏感数据
|
||||
- 定期备份
|
||||
- 实施访问控制
|
||||
|
||||
---
|
||||
|
||||
*更多部署问题,请参考项目Wiki或联系技术支持。*
|
||||
Reference in New Issue
Block a user