Files
nginxserver/memory/session-20260621-1.md
2026-07-16 13:03:11 +08:00

5.7 KiB
Raw Blame History

name, description, metadata
name description metadata
session-20260621-1 2026-06-21 第1次会话 — 宝塔面板API接入Nginx反代管理从160迁移至宝塔面板只读
type date sessionNumber startTime
session 2026-06-21 1 2026-06-20T23:00:00+08:00

2026-06-21 第1次会话

会话摘要

将 Nginx 转发管理从 10.1.1.160Python 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.9710.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 连接配置

重要信息

宝塔面板连接

部署架构(当前)

组件 机器 端口 说明
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解析管理阿里云APInginx将卸载
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 卸载(用户决定时机)
  • 宝塔面板上创建更多反代项目后验证列表自动刷新