--- name: session-20260621-1 description: 2026-06-21 第1次会话 — 宝塔面板API接入,Nginx反代管理从160迁移至宝塔面板(只读) metadata: type: session date: 2026-06-21 sessionNumber: 1 startTime: 2026-06-20T23:00:00+08:00 --- # 2026-06-21 第1次会话 ## 会话摘要 将 Nginx 转发管理从 10.1.1.160(Python API 直接操作配置文件)迁移至宝塔面板 API 只读模式。新增 `BTPanelApiClient` 替代原 Python API 调用,前端改为只读展示。用户决定 160 机器 nginx 卸载,反代操作统一在宝塔面板上进行。 ## 关键操作 ### 1. 宝塔面板 API 客户端实现 - **做了什么**: 新建 `BTPanelApiClient.java`,封装宝塔 API 签名逻辑(`MD5(request_time + MD5(api_key))`),实现 5 个接口 - **接口清单**: - `POST /data?action=getData&table=sites` → 站点列表(12个站点) - `POST /site?action=GetProxyList&sitename=xxx` → 反代列表 - `POST /acme?action=get_orders` → ACME 证书订单列表 - `POST /files?action=GetFileBody` → 读取文件内容(nginx 配置文件) - `getNginxConfig(domain)` → 获取指定域名的 nginx 配置文件 - **原因**: 10.1.1.160 nginx 卸载,反代功能迁至宝塔面板,平台改为只读看板 - **结果**: 三个核心 API 在 curl 测试全部通过,Java 编译部署成功 ### 2. 宝塔 API 调试过程 - **问题1**: 最初API路径用错(`/site?action=GetSiteList` 返回404),根据官方文档 `api-doc.pdf` 修正为 `/data?action=getData&table=sites` - **问题2**: IP白名单拦截 → 用户添加 `183.192.136.97`(10.1.1.170 出公网IP)后解决 - **问题3**: Java POST form body 返回404 → 改为 URL query string 方式传参解决 - **问题4**: 自签名SSL证书 → RestTemplate 配置跳过证书校验 ### 3. ForwardingRuleService 改造 - **做了什么**: `listRules()` 改为从宝塔 API 拉数据,遍历站点列表 → 对每个站点调 GetProxyList → 组装 ForwardingRule;所有写入方法(add/update/delete/reload)改为 `@Deprecated` 抛出 `UnsupportedOperationException` - **原因**: 反代操作统一在宝塔面板进行,平台仅做列表查看 - **结果**: 转发管理页面展示宝塔12个站点中的反代项目 ### 4. CertificateService 改造 - **做了什么**: `listCertificates()` 改为从宝塔 `get_orders` 拉 ACME 证书数据,合并本地数据库 `certificates` 表中的邮件通知配置;`issueCertificate()`/`renewCertificate()` 禁用 - **修复**: 第一版未合并本地通知配置,修复后按域名匹配本地DB记录合并 `notifyEmail/notifyEnabled/notifyDaysBefore` - **结果**: 证书列表从宝塔拉取,邮件通知配置可正常读写 ### 5. Vue 前端只读改造 - **NginxForwarding.vue**: - 去掉"新增规则"和"重载Nginx"按钮,替换为提示标签"新增/修改/删除请在宝塔面板上操作" - 操作列"修改"/"删除"改为"查看" - 编辑弹窗改为只读详情弹窗,调用 `GET /api/rules/{id}/config` 加载配置文件内容和 SSL 证书信息 - 移除配置文件Tab、SSL Tab、gzip Tab、日志Tab、LE签发弹窗 - **CertManagement.vue**: 去掉"签发证书"和"一键续期"按钮,保留"通知设置" - **结果**: 前端编译通过,部署到 nginx-web-nginx-web 容器 ### 6. ForwardingRuleController 改造 - **做了什么**: GET/POST/PUT/DELETE 接口调整,写入端点返回 405/410 错误并提示去宝塔操作;`GET /{id}/config` 改为返回配置文件内容 + SSL证书信息 - **结果**: 编译通过 ### 7. RestTemplateConfig 修改 - **做了什么**: 新增 `btRestTemplate` Bean,使用 JDK 原生 `SSLContext` + `TrustManager` 跳过宝塔自签名证书校验 - **原因**: 宝塔面板使用自签名 SSL 证书 ### 8. 配置文件修改 - **application.yml**: 新增 `bt-panel` 配置节(base-url: https://101.132.183.138:18888, api-key: ahv5RRcYm3Vi2PzEFvqYsZvsS8LeGkYp) - **原因**: 宝塔 API 连接配置 ## 重要信息 ### 宝塔面板连接 - 面板地址: https://101.132.183.138:18888 - API Key: ahv5RRcYm3Vi2PzEFvqYsZvsS8LeGkYp - 白名单IP: 183.192.136.97(10.1.1.170 出公网IP) ### 部署架构(当前) | 组件 | 机器 | 端口 | 说明 | |------|------|------|------| | Vue 前端 | 10.1.1.170 Docker (nginx-web-nginx-web) | 3002 | Nginx转发管理/SSL证书管理/DNS解析管理 | | Java 后端 | 10.1.1.170 Docker (nginx-server-nginx-server) | 4002 | 宝塔API接入 + 阿里云DNS | | Python API | 10.1.1.160 | 5000 | 仅DNS解析管理(阿里云API),nginx将卸载 | | MySQL | 10.1.1.122 | 3306 | DNS审计记录 + 证书通知配置 | ### 涉及文件清单 | 文件 | 操作 | 说明 | |------|------|------| | `service/BTPanelApiClient.java` | **新增** | 宝塔面板 API 客户端(5个接口) | | `service/ForwardingRuleService.java` | **重写** | 数据源从Python API切换至宝塔API | | `service/CertificateService.java` | **重写** | 数据源从Python API切换至宝塔API | | `controller/ForwardingRuleController.java` | **重写** | 只保留GET,写入返回405/410 | | `controller/CertificateController.java` | **改** | 签发/续期返回405 | | `config/RestTemplateConfig.java` | **改** | 新增btRestTemplate(跳过SSL校验) | | `application.yml` | **改** | 新增bt-panel配置 | | `views/NginxForwarding.vue` | **重写** | 只读模式,查看弹窗含配置+SSL | | `views/CertManagement.vue` | **改** | 去掉签发/续期按钮 | ## 待处理 - [ ] 用户验证前端页面:转发管理列表 + 查看弹窗(配置文件 + SSL证书) - [ ] 用户验证证书管理页面:邮件通知配置是否正常显示 - [ ] 160 机器 nginx 卸载(用户决定时机) - [ ] 宝塔面板上创建更多反代项目后验证列表自动刷新