- 发现 NAS sshd 关闭了 AllowTcpForwarding,SSH -L 隧道会报 administratively prohibited,此前文档里的隧道方案实际不可用 - one-api 端口绑定改为 192.168.50.64:3001(NAS 局域网 IP),不再绑定 127.0.0.1;仍不接入 frp、不暴露公网,只是访问方式从"SSH隧道转发"改为"同局域网直连" - 已在 NAS 上应用并验证 http://192.168.50.64:3001 可正常访问(HTTP 200) - 同步修正 README/PROGRESS/SDD 中的管理端口访问说明
87 lines
8.5 KiB
Markdown
87 lines
8.5 KiB
Markdown
# 项目进度追踪
|
||
|
||
> 最后更新: 2026-08-23
|
||
|
||
## 服务运行状态
|
||
|
||
| 服务 | 节点 | 状态 | 说明 |
|
||
|------|------|------|------|
|
||
| Oracle frp 隧道 | 甲骨文服务器 129.146.203.203 | ✅ 已配置 | 复用已有 frps;新增 `nexusai` 代理,remotePort 3210 → NAS:8443 |
|
||
| Nginx | NAS 192.168.50.64 | ✅ 已部署 | 容器 `nginx-proxy`,本机端口 8443(80/443 已被占用) |
|
||
| LobeChat | NAS 192.168.50.64 | ✅ 已部署 | 容器 `lobe-chat`,端到端连通性已验证 |
|
||
| One-API | NAS 192.168.50.64 | ✅ 已部署(未初始化) | 容器 `one-api`,本机 127.0.0.1:3001;管理员密码/渠道/Token 待用户在 Web UI 完成 |
|
||
| MySQL | NAS 192.168.50.64 | ✅ 已部署 | 容器 `one-api-mysql`,随机生成 root 密码存于 NAS `~/ai-gateway/.env`(不入库) |
|
||
|
||
## 2026-08-23 NAS 实际部署 + frp 隧道打通(端到端验证通过)
|
||
|
||
- **发现的端口冲突**:NAS 本机 80/443/3000 均已被既有服务占用(3000=Gitea 容器;80/443=DSM 或其他既有服务),docker-compose 中 one-api/nginx 的端口设计不可直接用于该 NAS,据此调整:
|
||
- `nginx`:本机端口改为 `8443:443`(容器内仍监听 443),不再映射 80
|
||
- `one-api`:本机端口改为 `127.0.0.1:3001:3000`(仅回环访问,不占用已被 Gitea 用掉的 3000)
|
||
- `nginx.conf` 移除了无用的 80 端口跳转 server 块(本机未映射 80,该块永远不可达)
|
||
- **NAS → 各 AI 官方域名连通性验证(待办任务1,已完成)**:从 NAS 直接 curl 五个渠道域名,TCP/TLS 握手均在 2 秒内完成,无超时无阻断:
|
||
- Gemini (generativelanguage.googleapis.com) HTTP 404(预期,根路径无内容)
|
||
- NVIDIA NIM (integrate.api.nvidia.com) HTTP 404(预期)
|
||
- Groq (api.groq.com) HTTP 200
|
||
- OpenRouter (openrouter.ai) HTTP 200
|
||
- Mistral (api.mistral.ai) HTTP 404(预期)
|
||
- 结论:NAS 出站直连稳定,无需额外代理
|
||
- **Oracle 反代方式确认(待办任务3,已完成)**:确认沿用 frp 隧道方案(与 FAM 一致)。Oracle 上 `frps` 服务已在运行(`/etc/frp/frps.toml`,7000 控制端口),NAS 上 `frpc`(`/etc/frp/frpc.toml`)已有 gitea/wordpress/fam-core 三个代理在跑;本次仅追加第 4 个 `[[proxies]] name="nexusai"`(localPort 8443 → remotePort 3210),修改前按现有约定做了时间戳备份(`/etc/frp/frpc.toml.bak.*`),重启 frpc 后四个代理全部 `start proxy success`,未影响既有 gitea/wordpress/fam-core 隧道
|
||
- **NAS 实际部署(待办任务5,部分完成)**:`~/ai-gateway/` 目录下已放置 `docker-compose.yml`/`nginx.conf`/`.env`(`MYSQL_ROOT_PASSWORD`、`LOBE_ACCESS_CODE` 已用 `openssl rand` 生成强随机值,仅存于 NAS,未入库、未在对话记录外泄露);证书为临时自签名(`certs/`,CN=nexusai.local,SAN 含两台服务器 IP),`docker compose up -d` 后四容器全部 Up(MySQL 首次初始化耗时导致 one-api 短暂重启几次,符合预期,之后自愈)
|
||
- **端到端验证通过**:`curl -sk https://129.146.203.203:3210/` 与 NAS 本机 `curl -sk https://127.0.0.1:8443/` 均返回 HTTP 307(LobeChat 正常重定向),链路 浏览器→Oracle frps:3210→frp隧道→NAS nginx:8443→lobe-chat:3210 完全打通
|
||
- **管理端口访问方式修正(2026-08-23)**:NAS sshd 关闭了 `AllowTcpForwarding`,SSH 隧道方案实测不可行(`channel N: open failed: administratively prohibited`);改为 One-API 端口直接绑定 NAS 局域网 IP(`192.168.50.64:3001:3000`,非 `127.0.0.1`),同局域网内浏览器可直接访问,仍不经 frp、不暴露公网
|
||
- **仍需用户在浏览器里手动完成(不由 AI 代做,涉及创建账号/输入密钥)**:
|
||
1. 浏览器直接打开 `http://192.168.50.64:3001`(需与 NAS 同一局域网)完成 One-API 管理员账号初始化
|
||
2. 后台按渠道设计表添加 5 个渠道(需要 Gemini/NVIDIA 新 Key,待办任务2)
|
||
3. 创建对外 Token,写入 NAS `~/ai-gateway/.env` 的 `ONE_API_TOKEN`,然后 `docker compose restart lobe-chat`
|
||
4. 访问 `https://129.146.203.203:3210`(当前为自签名证书,浏览器会显示不安全警告;Access Code 已随机生成,存于 NAS `~/ai-gateway/.env` 的 `LOBE_ACCESS_CODE`,未写入版本库,见对话记录/自行 `cat` 查看)进行实际对话/图片问答/Failover 验证(待办任务5 收尾)、并决定正式域名与证书方案(待办任务6,届时替换 `certs/` 下的自签名证书)
|
||
|
||
## 2026-08-23 部署骨架生成:docker-compose.yml / nginx.conf / .env.example
|
||
|
||
- **产出**:仓库根目录新增 `docker-compose.yml`(mysql / one-api / lobe-chat / nginx 四服务)、`nginx.conf`(443 SSL + 80→443 跳转 + SSE 流式透传配置)、`.env.example`(含 MYSQL_ROOT_PASSWORD / ONE_API_TOKEN / LOBE_ACCESS_CODE / 各渠道 Key 占位)。
|
||
- **相对 SDD 草稿的两处安全加固**:
|
||
1. `one-api` 端口改为 `127.0.0.1:3000:3000`(原草稿是 `3000:3000` 全网卡暴露),管理需通过 SSH 隧道(`ssh -p 2222 -L 3000:127.0.0.1:3000 ericwyuan@192.168.50.64`)转发后本地访问,符合 SRS FR-5.2 / SDD 第5章"后台管理端口不映射公网"的要求。
|
||
2. `lobe-chat` 不再发布主机端口(原草稿 `3210:3210`),仅通过 `ai-network` 容器网络被 nginx 访问,进一步收敛暴露面。
|
||
- **nginx.conf 待确认项**:`server_name` 暂用 `_` 通配(域名与证书方案见 SDD 8.4 待确认事项,任务 6);`certs/fullchain.pem` / `privkey.pem` 尚未生成,需任务 6 确认证书方案后补充。
|
||
- **尚未做**:实际登录 NAS 部署(依赖新 Gemini/NVIDIA Key 与 Oracle 反代方式确认,任务 1-3, 5, 6)。
|
||
|
||
## 2026-08-23 项目启动:文档入库 + 仓库初始化
|
||
|
||
- **决策**:采用成熟开源组件(Nginx + LobeChat + One-API + MySQL)容器化搭建,不重复造轮子;网关对外统一暴露 `auto-vision` / `auto-text` 两个聚合模型名。
|
||
- **部署方案(用户 2026-08-23 确认)**:部署于 NAS 本机(Docker Compose),由甲骨文服务器(129.146.203.203)frp/nginx 反向代理端口对外提供访问(与 FAM 项目 frp 方案一致);NAS 出站直连各海外 API。
|
||
- **文档**:`docs/01-软件需求文档-SRS.md`(V1.0)+ `docs/02-软件设计文档-SDD.md`(V1.0)入库;README 汇总架构/服务器访问信息/提交规范。
|
||
- **安全**:Gemini 与 NVIDIA 的旧 API Key 不写入仓库(将申请新值);所有 Key 计划通过服务器 `.env` 管理(已加入 .gitignore)。
|
||
- **仓库**:本地初始化,推送 Gitea `http://192.168.50.64:3000/ericwyuan/NexusAI`。
|
||
|
||
## 任务进度
|
||
|
||
### 已完成
|
||
|
||
| # | 任务 | 日期 |
|
||
|---|------|------|
|
||
| 1 | 软件需求文档(SRS V1.0)入库 | 2026-08-23 |
|
||
| 2 | 软件设计文档(SDD V1.0)入库 | 2026-08-23 |
|
||
| 3 | README(架构/服务器信息/提交规范) | 2026-08-23 |
|
||
| 4 | 仓库初始化 + 推送 Gitea | 2026-08-23 |
|
||
| 5 | 生成部署骨架(docker-compose.yml / nginx.conf / .env.example) | 2026-08-23 |
|
||
|
||
### 待完成
|
||
|
||
| # | 任务 | 依赖 | 优先级 |
|
||
|---|------|------|--------|
|
||
| 1 | 验证 NAS 到各海外 API 官方域名的直连稳定性 | - | 高 |
|
||
| 2 | 申请新 Gemini / NVIDIA API Key | - | 高 |
|
||
| 3 | 确认 Oracle 反代方式(frp 隧道 vs nginx 反代) | 决策 | 高 |
|
||
| 5 | NAS 实际部署 + One-API 渠道配置(5 家)+ Failover 验证 | Key | 高 |
|
||
| 6 | 配置 Oracle 反代端口 → NAS 网关入口 | 反代方式 | 高 |
|
||
| 7 | HTTPS 域名与证书 | NAS | 中 |
|
||
| 8 | 确认 Server-Side 模式 / 管理端口访问方式 / 监控方案 | 决策 | 中 |
|
||
|
||
## 技术决策记录
|
||
|
||
1. **不重复造轮子** - 网关用 One-API、前端用 LobeChat,仅做配置层工作;前端、网关、各 AI 渠道间均走 OpenAI 兼容接口,任一组件可替换
|
||
2. **模型映射** - 前端只感知 `auto-vision`(图文)与 `auto-text`(纯文本)两个聚合模型名,多渠道不同模型映射到统一对外模型名
|
||
3. **优先级路由** - 渠道优先级数字越小越优先,同优先级内按权重轮询分摊负载
|
||
4. **冷却恢复** - 渠道连续失败超阈值(5 次/5 分钟)进入冷却禁用,冷却期(10 分钟)后自动恢复参与路由
|
||
5. **最小暴露面** - 对外仅暴露甲骨文服务器反代端口,NAS 本机不直接暴露公网;One-API 后台与 MySQL 端口仅容器内网可访问
|
||
6. **部署位置** - NAS 本机 Docker Compose(Synology ContainerManager),甲骨文服务器 frp/nginx 反代公网端口 → NAS 网关入口;NAS 出站直连海外 API
|