From 8017f691a13cf3373169afc7e77cd372f49c7c43 Mon Sep 17 00:00:00 2001 From: ericwyuan Date: Sun, 23 Aug 2026 09:02:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E9=83=A8=E7=BD=B2):=20One-API=20=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=AB=AF=E5=8F=A3=E6=94=B9=E4=B8=BA=E5=B1=80=E5=9F=9F?= =?UTF-8?q?=E7=BD=91=E7=9B=B4=E8=BF=9E=EF=BC=8CSSH=20=E9=9A=A7=E9=81=93?= =?UTF-8?q?=E6=96=B9=E6=A1=88=E4=B8=8D=E5=8F=AF=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发现 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 中的管理端口访问说明 --- PROGRESS.md | 3 ++- README.md | 4 ++-- docker-compose.yml | 6 +++--- docs/02-软件设计文档-SDD.md | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 2f4d0d4..ce05557 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -28,8 +28,9 @@ - **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. 通过 SSH 隧道 `ssh -p 2222 -L 3001:127.0.0.1:3001 ericwyuan@192.168.50.64` 访问 `http://127.0.0.1:3001` 完成 One-API 管理员账号初始化 + 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/` 下的自签名证书) diff --git a/README.md b/README.md index 94f0aa5..1cf08d8 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ NAS 本机(Docker 宿主机) |---|---|---|---| | nginx | nginx:alpine | 8443→443(经 frp 隧道对外) | HTTPS 终止、反向代理 | | lobe-chat | lobehub/lobe-chat:latest | 未发布主机端口,仅容器内网 3210 | 前端对话界面 | -| one-api | justsong/one-api:latest | 127.0.0.1:3001→3000(仅本机回环) | 网关聚合层 | +| one-api | justsong/one-api:latest | 192.168.50.64:3001→3000(仅局域网) | 网关聚合层 | | mysql | mysql:8.0 | 未发布主机端口,仅容器内网 3306 | One-API 数据存储 | > NAS 本机 80/443/3000 已被 Gitea(3000)与其他既有服务(80/443)占用,故 AI 网关容器改用上表端口;甲骨文侧无需改动,frps 按 `frpc.toml` 中新增的 `[[proxies]] name="nexusai"` 动态接受 remotePort 3210。 @@ -95,7 +95,7 @@ NAS 本机(Docker 宿主机) ### 3.2 安全要点 - 对外仅暴露甲骨文服务器 frp 隧道转发的 3210 端口(专属端口,非默认 443,与 Gitea:3000/WordPress:8500/FAM-core:8000 同一约定),NAS 本机不直接暴露公网 -- One-API 后台端口只绑定 `127.0.0.1:3001`,不接入 frp 隧道;远程管理走 SSH 隧道:`ssh -p 2222 -L 3001:127.0.0.1:3001 ericwyuan@192.168.50.64` +- One-API 后台端口只绑定 NAS 局域网 IP `192.168.50.64:3001`,不接入 frp 隧道,不暴露公网;NAS sshd 已关闭 `AllowTcpForwarding`,SSH 隧道方案不可行,故改为局域网直连管理:浏览器打开 `http://192.168.50.64:3001`(需与 NAS 同一局域网) - 所有 API Key 通过服务器 `.env` 注入容器环境变量,`.env` 不入库(见 [SDD 第 5 章](docs/02-软件设计文档-SDD.md#5-安全设计)) - 前端强制 `ACCESS_CODE` 校验;Nginx 全站 HTTPS diff --git a/docker-compose.yml b/docker-compose.yml index 17ccecf..1f5288a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,9 +18,9 @@ services: container_name: one-api restart: always ports: - # 3000 已被 NAS 上的 Gitea 容器占用,改用 3001;仅绑定 127.0.0.1,不对局域网/公网暴露 - # 远程管理走 SSH 隧道:ssh -p 2222 -L 3001:127.0.0.1:3001 ericwyuan@192.168.50.64 - - "127.0.0.1:3001:3000" + # 3000 已被 NAS 上的 Gitea 容器占用,改用 3001 + # NAS sshd 关闭了 AllowTcpForwarding,SSH 隧道方案不可行,改为仅绑定 NAS 局域网 IP(不经 frp,不映射公网) + - "192.168.50.64:3001:3000" volumes: - ./one-api-data:/data environment: diff --git a/docs/02-软件设计文档-SDD.md b/docs/02-软件设计文档-SDD.md index cd61df7..117b6e3 100644 --- a/docs/02-软件设计文档-SDD.md +++ b/docs/02-软件设计文档-SDD.md @@ -374,7 +374,7 @@ networks: ## 8. 待确认事项(2026-08-23 更新:已实际部署,多数事项已给出默认结论) 1. ~~是否需要 Server-Side 模式支持多端对话同步~~ **默认结论**:本期保持 Client-Side(IndexedDB),不额外部署 PostgreSQL;仅单用户/单浏览器使用,暂无多端同步需求。如后续需要,再单独排期 -2. ~~后台管理端口是否需要通过 VPN/SSH 隧道访问~~ **已实施**:One-API 仅绑定 NAS `127.0.0.1:3001`,不接入 frp 隧道,不映射公网;远程管理走 `ssh -p 2222 -L 3001:127.0.0.1:3001 ericwyuan@192.168.50.64` +2. ~~后台管理端口是否需要通过 VPN/SSH 隧道访问~~ **已实施(2026-08-23 修正)**:NAS sshd 关闭了 `AllowTcpForwarding`,SSH 隧道方案实测不可行;改为 One-API 绑定 NAS 局域网 IP `192.168.50.64:3001`,不接入 frp 隧道、不映射公网,同局域网内浏览器直接访问 `http://192.168.50.64:3001` 3. ~~是否需要接入 Prometheus/Grafana~~ **默认结论**:本期不接入,沿用 SDD 6.4 既定的轻量监控(`docker compose ps` + One-API 后台渠道页面);用量不大,暂不需要额外可视化监控栈 4. **域名与证书**:尚未有正式域名,当前用**临时自签名证书**(`certs/fullchain.pem`/`privkey.pem`,CN=nexusai.local)跑通链路,浏览器会提示"不安全"但功能不受影响;若紫川后续购买/已有域名,替换证书为 Let's Encrypt 即可,无需改动其他组件——**此项仍待紫川决定是否购买域名** 5. ~~NAS 到各海外 API 官方域名的直连稳定性验证~~ **已完成(2026-08-23)**:五渠道 TCP/TLS 握手均 2 秒内完成,NAS 出站直连稳定,无需额外代理