diff --git a/PROGRESS.md b/PROGRESS.md index 5e44d16..bfb458e 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -6,11 +6,33 @@ | 服务 | 节点 | 状态 | 说明 | |------|------|------|------| -| Oracle 反代层 | 甲骨文服务器 129.146.203.203 | ⏳ 未配置 | frp/nginx 反代端口 → NAS 网关入口 | -| Nginx | NAS 192.168.50.64 | ⏳ 未部署 | HTTPS 反向代理层 | -| LobeChat | NAS 192.168.50.64 | ⏳ 未部署 | 前端对话界面 | -| One-API | NAS 192.168.50.64 | ⏳ 未部署 | 网关聚合层 | -| MySQL | NAS 192.168.50.64 | ⏳ 未部署 | One-API 数据存储 | +| Oracle frp 隧道 | 甲骨文服务器 129.146.203.203 | ✅ 已配置 | 复用已有 frps;新增 `nexusai` 代理,remotePort 443 → 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 443),修改前按现有约定做了时间戳备份(`/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/` 与 NAS 本机 `curl -sk https://127.0.0.1:8443/` 均返回 HTTP 307(LobeChat 正常重定向),链路 浏览器→Oracle frps:443→frp隧道→NAS nginx:8443→lobe-chat:3210 完全打通 +- **仍需用户在浏览器里手动完成(不由 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 管理员账号初始化 + 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`(当前为自签名证书,浏览器会显示不安全警告;Access Code 已随机生成,存于 NAS `~/ai-gateway/.env` 的 `LOBE_ACCESS_CODE`,未写入版本库,见对话记录/自行 `cat` 查看)进行实际对话/图片问答/Failover 验证(待办任务5 收尾)、并决定正式域名与证书方案(待办任务6,届时替换 `certs/` 下的自签名证书) ## 2026-08-23 部署骨架生成:docker-compose.yml / nginx.conf / .env.example diff --git a/README.md b/README.md index 34fb0ce..3eb6dbe 100644 --- a/README.md +++ b/README.md @@ -76,24 +76,26 @@ NAS 本机(Docker 宿主机) ## 3. 部署概览 - **部署位置**:NAS 本机(Synology DSM 7,Docker Compose / ContainerManager) -- **对外访问**:甲骨文服务器(129.146.203.203)frp/nginx 反向代理端口 → NAS 的 Nginx 443 -- **方式**:所有服务在同一 `ai-network` 内,仅 Nginx 80/443 对局域网暴露 +- **对外访问**:甲骨文服务器(129.146.203.203)frp 隧道(frps 已运行,`frpc.toml` 追加 `nexusai` 代理)转发公网 443 → NAS 的 Nginx 容器(NAS 本机端口 8443) +- **方式**:所有服务在同一 `ai-network` 内;NAS 本机 80/443/3000 已被 Gitea/DSM 等既有服务占用,AI 网关改用 8443(nginx)与 3001(one-api,仅 127.0.0.1) - **目录结构**:`docker-compose.yml` / `.env`(敏感变量,不入库)/ `nginx.conf` / `certs/` / `one-api-data/` / `mysql-data/` - **详细部署步骤**:见 [SDD 第 6 章](docs/02-软件设计文档-SDD.md#6-部署设计) ### 3.1 容器服务 -| 服务 | 镜像 | 端口 | 说明 | +| 服务 | 镜像 | 端口(NAS 本机) | 说明 | |---|---|---|---| -| nginx | nginx:alpine | 80/443(NAS 局域网) | HTTPS 终止、反向代理 | -| lobe-chat | lobehub/lobe-chat:latest | 3210(内网) | 前端对话界面 | -| one-api | justsong/one-api:latest | 3000(内网) | 网关聚合层 | -| mysql | mysql:8.0 | 3306(内网) | One-API 数据存储 | +| 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(仅本机回环) | 网关聚合层 | +| mysql | mysql:8.0 | 未发布主机端口,仅容器内网 3306 | One-API 数据存储 | + +> NAS 本机 80/443/3000 已被 Gitea(3000)与其他既有服务(80/443)占用,故 AI 网关容器改用上表端口;甲骨文侧无需改动,frps 按 `frpc.toml` 中新增的 `[[proxies]] name="nexusai"` 动态接受 remotePort 443。 ### 3.2 安全要点 -- 对外仅暴露甲骨文服务器反代端口,NAS 本机不直接暴露公网 -- One-API 后台端口(3000)不映射公网,远程管理走 SSH 隧道 / VPN +- 对外仅暴露甲骨文服务器 frp 隧道转发的 443 端口,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` - 所有 API Key 通过服务器 `.env` 注入容器环境变量,`.env` 不入库(见 [SDD 第 5 章](docs/02-软件设计文档-SDD.md#5-安全设计)) - 前端强制 `ACCESS_CODE` 校验;Nginx 全站 HTTPS @@ -184,18 +186,19 @@ NAS 本机(Docker 宿主机) - 软件需求文档(SRS V1.0)与软件设计文档(SDD V1.0)入库(`docs/`) - 项目仓库初始化(Gitea: ericwyuan/NexusAI) +- NAS→各渠道直连稳定性验证、frp 隧道打通、四容器(mysql/one-api/lobe-chat/nginx)部署上线,端到端 `https://129.146.203.203/` 已可访问(详见 [PROGRESS.md](PROGRESS.md)) ### 待办(见 SDD 第 8 章待确认事项) -| # | 任务 | 优先级 | -|---|------|--------| -| 1 | 验证 NAS 到各海外 API 官方域名的直连稳定性 | 高 | -| 2 | 申请新 Gemini / NVIDIA API Key | 高 | -| 3 | 确认 Oracle 反代方式(frp 隧道 vs nginx 反代) | 高 | -| 4 | ~~生成部署骨架(docker-compose.yml / nginx.conf / .env.example)~~ 已完成 | 高 | -| 5 | NAS 实际部署 + One-API 渠道配置 + Failover 验证 | 高 | -| 6 | 确认 HTTPS 域名与证书方案 | 中 | -| 7 | 确认 Server-Side 模式 / 管理端口访问方式 / 监控方案 | 中 | +| # | 任务 | 优先级 | 说明 | +|---|------|--------|---| +| 1 | ~~验证 NAS 到各海外 API 官方域名的直连稳定性~~ 已完成 | 高 | 五渠道均直连正常 | +| 2 | 申请新 Gemini / NVIDIA API Key | 高 | 需用户在对应厂商控制台自行申请 | +| 3 | ~~确认 Oracle 反代方式(frp 隧道 vs nginx 反代)~~ 已完成 | 高 | 复用既有 frps,新增 nexusai 代理 | +| 4 | ~~生成部署骨架(docker-compose.yml / nginx.conf / .env.example)~~ 已完成 | 高 | | +| 5 | NAS 实际部署 + One-API 渠道配置 + Failover 验证 | 高 | 容器已部署上线;管理员账号/渠道/Token 需用户在 One-API Web UI 手动完成(涉及密钥输入,AI 不代做) | +| 6 | 确认 HTTPS 域名与证书方案 | 中 | 当前为临时自签名证书,浏览器会提示不安全 | +| 7 | 确认 Server-Side 模式 / 管理端口访问方式 / 监控方案 | 中 | 管理端口访问方式已定(SSH 隧道 3001) | --- diff --git a/docker-compose.yml b/docker-compose.yml index 00780fa..8409dba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,9 +18,9 @@ services: container_name: one-api restart: always ports: - # 仅绑定 127.0.0.1,不对局域网/公网暴露;远程管理走 SSH 隧道: - # ssh -p 2222 -L 3000:127.0.0.1:3000 ericwyuan@192.168.50.64 - - "127.0.0.1:3000:3000" + # 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" volumes: - ./one-api-data:/data environment: @@ -51,8 +51,9 @@ services: container_name: nginx-proxy restart: always ports: - - "80:80" - - "443:443" + # NAS 本机 80/443 已被其他服务占用(DSM/其他容器),改用 8443 + # 甲骨文 frp 隧道(frpc.toml [[proxies]] name=nexusai)将公网 443 转发到 NAS 的 8443 + - "8443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./certs:/etc/nginx/certs:ro diff --git a/nginx.conf b/nginx.conf index ca4b968..758ad92 100644 --- a/nginx.conf +++ b/nginx.conf @@ -44,9 +44,6 @@ http { } } - server { - listen 80; - server_name _; - return 301 https://$host$request_uri; - } + # 未映射 80 端口(NAS 本机 80 已被其他服务占用,见 docker-compose.yml 注释) + # 公网仅通过甲骨文 frp 隧道转发 443 → 本机 8443,暂不做 HTTP→HTTPS 跳转 }