---
name: server_deployment_venv
description: 当服务器部署时遇到 venv/pip 损坏、Python 路径错误，或需要更新部署脚本时，应该索引本记忆
---

# 服务器 venv 部署注意事项

## 背景

服务器 `/opt/agent/venv` 最初是从 macOS 复制到 Linux（Ubuntu 24.04）的，导致：

- `python3` 等符号链接指向 macOS 路径（`/Library/Developer/...`）
- `pip`、`flask` 等脚本的 shebang 指向 macOS 路径或错误路径
- 结果：`python3` 可能能用，但 `pip` 无法执行

## 修复方法

### 1. 重建 venv（推荐）

在服务器上用 Linux 系统 Python 重建：

```bash
/usr/bin/python3.12 -m venv --clear /opt/agent/venv
/opt/agent/venv/bin/pip install -r /opt/agent/agents/requirements.txt
```

### 2. 修改后的部署脚本

#### `/opt/agent/start_webapp_new.sh`

`fix_venv()` 同时检查 `python3` 和 `pip` 是否可用：

```bash
fix_venv() {
    if [ -x "$VENV_DIR/bin/python3" ] && "$VENV_DIR/bin/python3" --version &>/dev/null && \
       [ -x "$VENV_DIR/bin/pip" ] && "$VENV_DIR/bin/pip" --version &>/dev/null; then
        return 0
    fi
    # ... 重建 venv ...
}
```

#### `/opt/agent/refresh_agents.sh`

安装依赖前验证 `pip` 是否可执行，不可执行则自动重建 venv：

```bash
VENV_DIR="/opt/agent/venv"
if [ -x "$VENV_DIR/bin/pip" ] && "$VENV_DIR/bin/pip" --version &>/dev/null; then
    "$VENV_DIR/bin/pip" install -r "$AGENTS_DIR/requirements.txt" -q 2>&1 | tail -3
else
    log "venv pip 不可用，重建虚拟环境..."
    sys_python=$(command -v python3.12 2>/dev/null || command -v python3 2>/dev/null || command -v python 2>/dev/null || true)
    if [ -z "$sys_python" ]; then
        log "错误: 找不到系统 Python"
        exit 1
    fi
    "$sys_python" -m venv --clear "$VENV_DIR"
    "$VENV_DIR/bin/pip" install -r "$AGENTS_DIR/requirements.txt" -q 2>&1 | tail -3
    log "虚拟环境重建完成"
fi
```

## 注意事项

- 服务器内存只有 2G，前端构建不在服务器执行，由本地 `deploy_agents.sh` scp 上传 `static/dist/`
- 以后部署不要再从 macOS 复制 venv 到服务器
- 如果 pip 包版本升级引入破坏性变更（如 `openai>=2.40` 强制要求 `api_key`），需要同步修复代码
