# 把 AI 助手部署到线上（http://121.41.212.97/）

> 模式：**服务器共享 Key**。访客打开网站即可直接提问，无需填任何 Key。
> Key 只存在服务器的 `/root/.ai_env` 文件里，**不进代码、不进 git、不上传远端**。

---

## 架构

```
浏览器(访客) ──http://121.41.212.97/──> nginx(:80)
                                          ├── 其它路径 ──> 容器:3000 (docusaurus serve 静态站点)
                                          └── /api/ai ──> 容器:3001 (ai-proxy 后端代理)
                                                              │ 读取 /root/.ai_env 里的 Key
                                                              ▼
                                                       大模型(DeepSeek 等)
```

容器内同时跑两个进程：`docusaurus serve`(站点,3000) + `ai-proxy`(代理,3001)。
Key 通过 `docker run --env-file /root/.ai_env` 注入，文件只在服务器上。

---

## 一、服务器一次性配置（做一次，之后不用再动）

SSH 登录服务器后执行：

### 1) 创建 Key 文件（**只在本机，不提交**）

```bash
cat > /root/.ai_env << 'EOF'
AI_API_KEY=sk-把这里换成你的真实Key
AI_BASE_URL=https://api.deepseek.com/v1
AI_MODEL=deepseek-chat
EOF
chmod 600 /root/.ai_env
```

> 想换厂商？改 `AI_BASE_URL` 和 `AI_MODEL` 即可，例如：
> - 通义千问：`AI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1`，`AI_MODEL=qwen-plus`
> - 智谱 GLM：`AI_BASE_URL=https://open.bigmodel.cn/api/paas/v4`，`AI_MODEL=glm-4-flash`

### 2) 给 nginx 加一条 `/api/ai` 反代规则

找到你的站点配置（之前是 `/etc/nginx/conf.d/helpcenter.conf`），在 `location /` **之前**加一个 `location /api/ai`：

```bash
cat > /etc/nginx/conf.d/helpcenter.conf << 'EOF'
server {
    listen 80;
    server_name 121.41.212.97;

    # AI 助手后端代理 —— 必须放在 location / 之前
    location /api/ai {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        # 流式响应(SSE)需要：关闭缓冲、延长超时
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 300s;
        chunked_transfer_encoding on;
    }

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        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;
    }
}
EOF

nginx -t && service nginx reload
```

> 关键：`proxy_buffering off;` —— 不关掉的话流式回答会被 nginx 缓存到全部生成完才返回，体感像卡住。

---

## 二、发布代码上线（每次更新都这样）

代码改动已就绪（Dockerfile 会自动构建知识库 + 同时启动站点和代理；流水线会用 `--env-file /root/.ai_env` 注入 Key）。

在你本地（Windows）：

```bash
cd gitlink_help_center
git add Dockerfile .devops/wyx_helpcenter.yml package.json \
        scripts/ src/components/AIAssistant/ ai-proxy/
git commit -m "feat: 新增可拖拽AI助手(服务器共享Key模式)"
# 当前在 fix/wyx-errors 分支；流水线拉的是 master，所以合并到 master 再推
git checkout master
git merge fix/wyx-errors
git push origin master        # 推送后流水线自动构建并部署到 121.41.212.97
```

> 推送后到 GitLink 仓库 →「建木」查看流水线执行情况。
> （若你启用的是 `.devops/helpcenter.yml` 而非 `wyx_helpcenter.yml`，把同样的改动同步过去。）

---

## 三、验证

部署完成后，浏览器打开 http://121.41.212.97/ ：

1. 右下角应出现蓝色 **AI** 按钮（可拖拽）。
2. 点开 → 直接提问「如何创建仓库？」→ 应流式返回基于文档的回答，并带 `📎 相关文档` 链接。
3. 问「今天天气怎么样？」→ 应回复「无关」。
4. 若助手回复「服务器尚未配置 AI_API_KEY…」→ 说明 `/root/.ai_env` 还没填真实 Key，回服务器改好后重新触发一次流水线（或 `docker restart help_center`）即可。

命令行快速自检（在服务器上）：

```bash
docker ps | grep help_center                       # 容器在跑
docker logs help_center 2>&1 | grep ai-proxy       # 看到 [ai-proxy] listening on ...:3001
curl -X POST http://127.0.0.1/api/ai -H "Content-Type: application/json" -d '{"question":"测试","context":[]}'
```

---

## 四、安全说明

- **Key 从不进代码**：`/root/.ai_env` 只在服务器磁盘上，`.devops/wyx_helpcenter.yml` 里只写 `--env-file /root/.ai_env`，不含 Key 明文。`git push` 绝不会泄露。
- 代理端口 3001 仅绑定到 `127.0.0.1`（`-p 127.0.0.1:3001:3001`），公网无法直连，只有本机 nginx 能访问。
- 如担心 Key 被滥用产生费用，可在 DeepSeek 后台设置用量上限。
