Files
opro_demo/DEPLOYMENT.md
leehwui 0b5319b31c Add GPU support and improve Docker deployment
- Add GPU deployment support with NVIDIA runtime
  - Update Dockerfile.allinone with GPU environment variables
  - Add comprehensive GPU_DEPLOYMENT.md guide

- Make port 11434 (Ollama) optional for security
  - Update DEPLOYMENT.md with CPU and GPU deployment options
  - Simplify default docker run commands
  - Update healthcheck to only check web application

- Add memory requirements documentation
  - Create MEMORY_REQUIREMENTS.md with model comparison
  - Add build-8b.sh script for lower memory usage
  - Document OOM troubleshooting steps

- Improve Docker build process
  - Add BUILD_TROUBLESHOOTING.md for common issues
  - Add DISTRIBUTION.md for image distribution methods
  - Update .gitignore to exclude large binary files
  - Improve docker-entrypoint.sh with better diagnostics

- Update .dockerignore to include ollama-linux-amd64.tgz
- Add backup file exclusions to .gitignore
2025-12-08 17:08:45 +08:00

462 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Docker 部署指南
本文档说明如何在无外网访问的服务器上部署系统提示词优化工具。
## 部署方案
本项目提供两种部署方案:
### 方案 A: All-in-One 镜像(推荐,适用于无外网服务器)
**优点**
- 包含所有依赖:应用代码 + Ollama + LLM 模型
- 一个镜像文件,部署简单
- 无需在目标服务器上安装任何额外软件(除了 Docker
**缺点**
- 镜像文件很大10-20GB
- 传输时间较长
### 方案 B: 分离部署(适用于已有 Ollama 的服务器)
**优点**
- 镜像文件较小(~500MB
- 可以复用现有的 Ollama 服务
**缺点**
- 需要在目标服务器上单独安装和配置 Ollama
- 需要手动下载模型
---
## 方案 A: All-in-One 部署(推荐)
### 前置要求
#### 在开发机器上(有外网访问)
1. **Docker** 已安装
2. **Ollama** 已安装并运行
3. **磁盘空间**:至少 30GB 可用空间
4. 已下载所需的 Ollama 模型:
- `qwen3:14b` (主模型,~8GB)
- `qwen3-embedding:4b` (嵌入模型,~2GB)
#### 在目标服务器上(无外网访问)
1. **Docker** 已安装
2. **磁盘空间**:至少 25GB 可用空间
### 部署步骤
#### 步骤 1: 下载所需的 Ollama 模型
在开发机器上,确保已下载所需模型:
```bash
# 下载主模型(约 8GB
ollama pull qwen3:14b
# 下载嵌入模型(约 2GB
ollama pull qwen3-embedding:4b
# 验证模型已下载
ollama list
```
#### 步骤 2: 导出 Ollama 模型
```bash
# 运行导出脚本
./export-ollama-models.sh
```
这将创建 `ollama-models/` 目录,包含所有模型文件。
#### 步骤 3: 构建 All-in-One Docker 镜像
```bash
# 运行构建脚本(推荐)
./build-allinone.sh
# 或手动构建
docker build -f Dockerfile.allinone -t system-prompt-optimizer:allinone .
```
**注意**:构建过程可能需要 10-30 分钟,取决于机器性能。
#### 步骤 4: 导出 Docker 镜像
如果使用 `build-allinone.sh`,镜像已自动导出。否则手动导出:
```bash
# 导出镜像(约 10-20GB
docker save -o system-prompt-optimizer-allinone.tar system-prompt-optimizer:allinone
# 验证文件大小
ls -lh system-prompt-optimizer-allinone.tar
```
#### 步骤 5: 传输到目标服务器
使用 scp、U盘或其他方式传输镜像文件
```bash
# 使用 scp如果网络可达
scp system-prompt-optimizer-allinone.tar user@server:/path/
# 或使用 rsync支持断点续传
rsync -avP --progress system-prompt-optimizer-allinone.tar user@server:/path/
# 或使用 U盘/移动硬盘物理传输
```
#### 步骤 6: 在目标服务器上加载镜像
```bash
# 加载镜像(需要几分钟)
docker load -i system-prompt-optimizer-allinone.tar
# 如果遇到权限错误,使用 sudo
# sudo docker load -i system-prompt-optimizer-allinone.tar
# 验证镜像已加载
docker images | grep system-prompt-optimizer
```
#### 步骤 7: 启动服务
**CPU 模式(默认):**
```bash
# 启动容器(推荐:仅暴露 Web 端口)
docker run -d \
--name system-prompt-optimizer \
-p 8010:8010 \
--restart unless-stopped \
system-prompt-optimizer:allinone
# 查看启动日志
docker logs -f system-prompt-optimizer
```
**GPU 模式(推荐,如果有 NVIDIA GPU:**
```bash
# 使用所有可用 GPU推荐
docker run -d \
--name system-prompt-optimizer \
--gpus all \
-p 8010:8010 \
--restart unless-stopped \
system-prompt-optimizer:allinone
# 或指定特定 GPU
docker run -d \
--name system-prompt-optimizer \
--gpus '"device=0"' \
-p 8010:8010 \
--restart unless-stopped \
system-prompt-optimizer:allinone
# 查看启动日志
docker logs -f system-prompt-optimizer
```
**GPU 部署前提条件**:
- 已安装 NVIDIA 驱动 (`nvidia-smi` 可用)
- 已安装 NVIDIA Container Toolkit
- GPU 显存 ≥ 10GB (14b 模型) 或 ≥ 6GB (8b 模型)
**详细 GPU 部署指南**: 参见 [GPU_DEPLOYMENT.md](GPU_DEPLOYMENT.md)
**重要**
- 首次启动需要等待 30-60 秒CPU或 10-20 秒GPUOllama 服务需要初始化
- GPU 模式下推理速度提升 5-10 倍
- 端口 11434 (Ollama) 是可选的,仅在需要外部访问 Ollama 时暴露
- 不暴露 11434 更安全,因为 Ollama API 没有身份验证
#### 步骤 8: 验证部署
```bash
# 等待服务启动(约 30-60 秒)
sleep 60
# 健康检查
curl http://localhost:8010/health
# 应该返回:
# {"status":"ok","version":"0.1.0"}
# 检查 Ollama 服务
curl http://localhost:11434/api/tags
# 检查可用模型
curl http://localhost:8010/models
# 访问 Web 界面
# 浏览器打开: http://<服务器IP>:8010/ui/opro.html
```
---
## 方案 B: 分离部署
### 前置要求
#### 在目标服务器上
1. **Docker** 已安装
2. **Ollama** 服务已安装并运行
3. 已拉取所需的 Ollama 模型:
- `qwen3:14b` (主模型)
- `qwen3-embedding:4b` (嵌入模型)
### 部署步骤
#### 步骤 1: 构建应用镜像
```bash
# 在开发机器上构建
docker build -t system-prompt-optimizer:latest .
# 导出镜像
docker save -o system-prompt-optimizer.tar system-prompt-optimizer:latest
```
#### 步骤 2: 传输并加载
```bash
# 传输到目标服务器
scp system-prompt-optimizer.tar user@server:/path/
# 在目标服务器上加载
docker load -i system-prompt-optimizer.tar
```
#### 步骤 3: 启动服务
```bash
# 使用 Docker Compose
docker-compose up -d
# 或使用 Docker 命令
docker run -d \
--name system-prompt-optimizer \
-p 8010:8010 \
-e OLLAMA_HOST=http://host.docker.internal:11434 \
-v $(pwd)/outputs:/app/outputs \
--add-host host.docker.internal:host-gateway \
--restart unless-stopped \
system-prompt-optimizer:latest
```
## 配置说明
### 环境变量
`docker-compose.yml``docker run` 命令中可以配置以下环境变量:
- `OLLAMA_HOST`: Ollama 服务地址(默认: `http://host.docker.internal:11434`
- `PYTHONUNBUFFERED`: Python 输出缓冲(默认: `1`
### 端口映射
- **8010**: Web 界面和 API 端口(必需)
- **11434**: Ollama API 端口(可选,仅用于调试或外部访问 Ollama
### 数据持久化
- `./outputs`: 用户反馈日志存储目录(映射到容器内 `/app/outputs`
## 故障排查
### 0. Docker 守护进程连接错误
**问题**: 运行 `docker` 命令时提示 "Cannot connect to the Docker daemon"
**症状**:
```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```
**解决方案**:
**方法 1: 检查 Docker 服务状态**
```bash
# 检查 Docker 是否运行
sudo systemctl status docker
# 如果未运行,启动它
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker
```
**方法 2: 添加用户到 docker 组(推荐)**
```bash
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
# 应用组变更(需要重新登录或使用 newgrp
newgrp docker
# 或者直接注销并重新登录
# 验证
docker info
```
**方法 3: 修复 Docker socket 权限**
```bash
# 检查 socket 权限
ls -l /var/run/docker.sock
# 修复权限
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
```
**方法 4: 临时使用 sudo**
```bash
# 如果上述方法不可行,使用 sudo 运行 Docker 命令
sudo docker load -i system-prompt-optimizer-allinone.tar
sudo docker run -d --name system-prompt-optimizer ...
```
**验证修复**:
```bash
# 应该能正常显示 Docker 信息
docker info
# 应该能看到当前用户在 docker 组中
groups | grep docker
```
---
### 1. 无法连接 Ollama 服务
**问题**: 容器内无法访问宿主机的 Ollama 服务
**解决方案**:
```bash
# 确保使用了 --add-host 参数
--add-host host.docker.internal:host-gateway
# 或者直接使用宿主机 IP
-e OLLAMA_HOST=http://192.168.1.100:11434
```
### 2. 模型不可用All-in-One 部署)
**问题**: 容器内模型未正确加载
**解决方案**:
```bash
# 进入容器检查
docker exec -it system-prompt-optimizer bash
# 在容器内检查模型
ollama list
# 如果模型不存在,检查模型目录
ls -la /root/.ollama/models/
# 退出容器
exit
```
如果模型确实丢失,可能需要重新构建镜像。
### 3. 模型不可用(分离部署)
**问题**: Ollama 模型未安装
**解决方案**:
```bash
# 在宿主机上拉取模型
ollama pull qwen3:14b
ollama pull qwen3-embedding:4b
# 验证模型已安装
ollama list
```
### 4. 容器启动失败
**问题**: 端口被占用或权限问题
**解决方案**:
```bash
# 检查端口占用
netstat -tulpn | grep 8010
netstat -tulpn | grep 11434
# 更换端口All-in-One 需要两个端口)
docker run -p 8011:8010 -p 11435:11434 ...
# 查看容器日志
docker logs system-prompt-optimizer
```
### 5. 性能问题
**问题**: 生成速度慢
**解决方案**:
- 确保 Ollama 使用 GPU 加速
- 使用更小的模型(如 `qwen3:4b`
- 调整 `config.py` 中的 `GENERATION_POOL_SIZE`
## 更新部署
```bash
# 1. 在开发机器上重新构建镜像
docker build -t system-prompt-optimizer:latest .
# 2. 导出新镜像
docker save -o system-prompt-optimizer-new.tar system-prompt-optimizer:latest
# 3. 传输到服务器并加载
docker load -i system-prompt-optimizer-new.tar
# 4. 重启服务
docker-compose down
docker-compose up -d
# 或使用 docker 命令
docker stop system-prompt-optimizer
docker rm system-prompt-optimizer
docker run -d ... # 使用相同的启动命令
```
## 安全建议
1. **网络隔离**: 如果不需要外部访问,只绑定到 localhost
```bash
-p 127.0.0.1:8010:8010
```
2. **防火墙**: 配置防火墙规则限制访问
```bash
# 只允许特定 IP 访问
iptables -A INPUT -p tcp --dport 8010 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 8010 -j DROP
```
3. **日志管理**: 定期清理日志文件
```bash
# 限制 Docker 日志大小
docker run --log-opt max-size=10m --log-opt max-file=3 ...
```
## 联系支持
如有问题,请查看:
- 应用日志: `docker logs system-prompt-optimizer`
- Ollama 日志: `journalctl -u ollama -f`
- API 文档: http://localhost:8010/docs