[任务1,3,5] NAS 实际部署 + frp 隧道打通 - 端到端可访问

- 发现 NAS 本机 80/443/3000 已被 Gitea/既有服务占用,调整 docker-compose.yml/nginx.conf 端口:nginx 改 8443(对应容器内 443),one-api 改 127.0.0.1:3001(内网回环,不再冲突 Gitea 的 3000)
- 验证 NAS 到 Gemini/NVIDIA/Groq/OpenRouter/Mistral 五渠道直连稳定(待办任务1完成)
- 确认并实施 Oracle 侧 frp 隧道反代方案:复用已运行的 frps,在 NAS frpc.toml 追加 nexusai 代理(remotePort 443 -> NAS:8443),未影响既有 gitea/wordpress/fam-core 隧道(待办任务3完成)
- NAS 上 docker compose up -d 四容器(mysql/one-api/lobe-chat/nginx)全部启动,https://129.146.203.203/ 端到端验证通过(待办任务5:部署部分完成,渠道配置/Token 待人工在 One-API 后台完成)
This commit is contained in:
ericwyuan
2026-08-23 08:45:03 +08:00
parent 188c02478b
commit 4ed463237d
4 changed files with 56 additions and 33 deletions

View File

@@ -6,11 +6,33 @@
| 服务 | 节点 | 状态 | 说明 | | 服务 | 节点 | 状态 | 说明 |
|------|------|------|------| |------|------|------|------|
| Oracle 反代层 | 甲骨文服务器 129.146.203.203 | ⏳ 未配置 | frp/nginx 反代端口 → NAS 网关入口 | | Oracle frp 隧道 | 甲骨文服务器 129.146.203.203 | ✅ 已配置 | 复用已有 frps新增 `nexusai` 代理remotePort 443 → NAS:8443 |
| Nginx | NAS 192.168.50.64 | ⏳ 未部署 | HTTPS 反向代理层 | | Nginx | NAS 192.168.50.64 | ✅ 已部署 | 容器 `nginx-proxy`,本机端口 844380/443 已被占用) |
| LobeChat | NAS 192.168.50.64 | ⏳ 未部署 | 前端对话界面 | | LobeChat | NAS 192.168.50.64 | ✅ 已部署 | 容器 `lobe-chat`,端到端连通性已验证 |
| One-API | NAS 192.168.50.64 | ⏳ 未部署 | 网关聚合层 | | 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 | 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.localSAN 含两台服务器 IP`docker compose up -d` 后四容器全部 UpMySQL 首次初始化耗时导致 one-api 短暂重启几次,符合预期,之后自愈)
- **端到端验证通过**`curl -sk https://129.146.203.203/` 与 NAS 本机 `curl -sk https://127.0.0.1:8443/` 均返回 HTTP 307LobeChat 正常重定向),链路 浏览器→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 ## 2026-08-23 部署骨架生成docker-compose.yml / nginx.conf / .env.example

View File

@@ -76,24 +76,26 @@ NAS 本机Docker 宿主机)
## 3. 部署概览 ## 3. 部署概览
- **部署位置**NAS 本机Synology DSM 7Docker Compose / ContainerManager - **部署位置**NAS 本机Synology DSM 7Docker Compose / ContainerManager
- **对外访问**甲骨文服务器129.146.203.203frp/nginx 反向代理端口 → NAS 的 Nginx 443 - **对外访问**甲骨文服务器129.146.203.203frp 隧道frps 已运行,`frpc.toml` 追加 `nexusai` 代理)转发公网 443 → NAS 的 Nginx 容器NAS 本机端口 8443
- **方式**:所有服务在同一 `ai-network`,仅 Nginx 80/443 对局域网暴露 - **方式**:所有服务在同一 `ai-network`NAS 本机 80/443/3000 已被 Gitea/DSM 等既有服务占用AI 网关改用 8443nginx与 3001one-api仅 127.0.0.1
- **目录结构**`docker-compose.yml` / `.env`(敏感变量,不入库)/ `nginx.conf` / `certs/` / `one-api-data/` / `mysql-data/` - **目录结构**`docker-compose.yml` / `.env`(敏感变量,不入库)/ `nginx.conf` / `certs/` / `one-api-data/` / `mysql-data/`
- **详细部署步骤**:见 [SDD 第 6 章](docs/02-软件设计文档-SDD.md#6-部署设计) - **详细部署步骤**:见 [SDD 第 6 章](docs/02-软件设计文档-SDD.md#6-部署设计)
### 3.1 容器服务 ### 3.1 容器服务
| 服务 | 镜像 | 端口 | 说明 | | 服务 | 镜像 | 端口NAS 本机) | 说明 |
|---|---|---|---| |---|---|---|---|
| nginx | nginx:alpine | 80/443NAS 局域网 | HTTPS 终止、反向代理 | | nginx | nginx:alpine | 8443→443经 frp 隧道对外 | HTTPS 终止、反向代理 |
| lobe-chat | lobehub/lobe-chat:latest | 3210(内网) | 前端对话界面 | | lobe-chat | lobehub/lobe-chat:latest | 未发布主机端口,仅容器内网 3210 | 前端对话界面 |
| one-api | justsong/one-api:latest | 3000内网 | 网关聚合层 | | one-api | justsong/one-api:latest | 127.0.0.1:3001→3000仅本机回环 | 网关聚合层 |
| mysql | mysql:8.0 | 3306(内网) | One-API 数据存储 | | mysql | mysql:8.0 | 未发布主机端口,仅容器内网 3306 | One-API 数据存储 |
> NAS 本机 80/443/3000 已被 Gitea3000与其他既有服务80/443占用故 AI 网关容器改用上表端口甲骨文侧无需改动frps 按 `frpc.toml` 中新增的 `[[proxies]] name="nexusai"` 动态接受 remotePort 443。
### 3.2 安全要点 ### 3.2 安全要点
- 对外仅暴露甲骨文服务器反代端口NAS 本机不直接暴露公网 - 对外仅暴露甲骨文服务器 frp 隧道转发的 443 端口NAS 本机不直接暴露公网
- One-API 后台端口3000不映射公网远程管理走 SSH 隧道 / VPN - 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-安全设计) - 所有 API Key 通过服务器 `.env` 注入容器环境变量,`.env` 不入库(见 [SDD 第 5 章](docs/02-软件设计文档-SDD.md#5-安全设计)
- 前端强制 `ACCESS_CODE` 校验Nginx 全站 HTTPS - 前端强制 `ACCESS_CODE` 校验Nginx 全站 HTTPS
@@ -184,18 +186,19 @@ NAS 本机Docker 宿主机)
- 软件需求文档SRS V1.0与软件设计文档SDD V1.0)入库(`docs/` - 软件需求文档SRS V1.0与软件设计文档SDD V1.0)入库(`docs/`
- 项目仓库初始化Gitea: ericwyuan/NexusAI - 项目仓库初始化Gitea: ericwyuan/NexusAI
- NAS→各渠道直连稳定性验证、frp 隧道打通、四容器mysql/one-api/lobe-chat/nginx部署上线端到端 `https://129.146.203.203/` 已可访问(详见 [PROGRESS.md](PROGRESS.md)
### 待办(见 SDD 第 8 章待确认事项) ### 待办(见 SDD 第 8 章待确认事项)
| # | 任务 | 优先级 | | # | 任务 | 优先级 | 说明 |
|---|------|--------| |---|------|--------|---|
| 1 | 验证 NAS 到各海外 API 官方域名的直连稳定性 | 高 | | 1 | ~~验证 NAS 到各海外 API 官方域名的直连稳定性~~ 已完成 | 高 | 五渠道均直连正常 |
| 2 | 申请新 Gemini / NVIDIA API Key | 高 | | 2 | 申请新 Gemini / NVIDIA API Key | 高 | 需用户在对应厂商控制台自行申请 |
| 3 | 确认 Oracle 反代方式frp 隧道 vs nginx 反代) | 高 | | 3 | ~~确认 Oracle 反代方式frp 隧道 vs nginx 反代)~~ 已完成 | 高 | 复用既有 frps新增 nexusai 代理 |
| 4 | ~~生成部署骨架docker-compose.yml / nginx.conf / .env.example~~ 已完成 | 高 | | 4 | ~~生成部署骨架docker-compose.yml / nginx.conf / .env.example~~ 已完成 | 高 | |
| 5 | NAS 实际部署 + One-API 渠道配置 + Failover 验证 | 高 | | 5 | NAS 实际部署 + One-API 渠道配置 + Failover 验证 | 高 | 容器已部署上线;管理员账号/渠道/Token 需用户在 One-API Web UI 手动完成涉及密钥输入AI 不代做) |
| 6 | 确认 HTTPS 域名与证书方案 | 中 | | 6 | 确认 HTTPS 域名与证书方案 | 中 | 当前为临时自签名证书,浏览器会提示不安全 |
| 7 | 确认 Server-Side 模式 / 管理端口访问方式 / 监控方案 | 中 | | 7 | 确认 Server-Side 模式 / 管理端口访问方式 / 监控方案 | 中 | 管理端口访问方式已定SSH 隧道 3001 |
--- ---

View File

@@ -18,9 +18,9 @@ services:
container_name: one-api container_name: one-api
restart: always restart: always
ports: ports:
# 仅绑定 127.0.0.1,不对局域网/公网暴露;远程管理走 SSH 隧道: # 3000 已被 NAS 上的 Gitea 容器占用,改用 3001仅绑定 127.0.0.1,不对局域网/公网暴露
# ssh -p 2222 -L 3000:127.0.0.1:3000 ericwyuan@192.168.50.64 # 远程管理走 SSH 隧道:ssh -p 2222 -L 3001:127.0.0.1:3001 ericwyuan@192.168.50.64
- "127.0.0.1:3000:3000" - "127.0.0.1:3001:3000"
volumes: volumes:
- ./one-api-data:/data - ./one-api-data:/data
environment: environment:
@@ -51,8 +51,9 @@ services:
container_name: nginx-proxy container_name: nginx-proxy
restart: always restart: always
ports: ports:
- "80:80" # NAS 本机 80/443 已被其他服务占用DSM/其他容器),改用 8443
- "443:443" # 甲骨文 frp 隧道frpc.toml [[proxies]] name=nexusai将公网 443 转发到 NAS 的 8443
- "8443:443"
volumes: volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro - ./certs:/etc/nginx/certs:ro

View File

@@ -44,9 +44,6 @@ http {
} }
} }
server { # 未映射 80 端口NAS 本机 80 已被其他服务占用,见 docker-compose.yml 注释)
listen 80; # 公网仅通过甲骨文 frp 隧道转发 443 → 本机 8443暂不做 HTTP→HTTPS 跳转
server_name _;
return 301 https://$host$request_uri;
}
} }