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

100 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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.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.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.9710.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解析管理阿里云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 卸载(用户决定时机)
- [ ] 宝塔面板上创建更多反代项目后验证列表自动刷新