- 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
462 lines
10 KiB
Markdown
462 lines
10 KiB
Markdown
# 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 秒(GPU),Ollama 服务需要初始化
|
||
- 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
|
||
|