初始化1

This commit is contained in:
zg
2026-07-16 13:03:11 +08:00
parent 0bdfcbc1c8
commit e6b0f287cc
100 changed files with 12184 additions and 0 deletions

6
memory/.session-last Normal file
View File

@@ -0,0 +1,6 @@
{
"projectPath": "E:\\AI\\claude\\new\\nginxServer",
"endedAt": "2026-06-21T04:00:00+08:00",
"sessionFile": "memory/session-20260621-2.md",
"summary": "DNS解析API从10.1.1.160迁移至101.132.183.138:32210。新建dns-api精简版4文件部署到138systemd开机自启Java配置改1行指新地址编译部署到Docker全链路验证通过。数据库10.1.1.122→10.20.1.122未完成(网络不通已回滚)。"
}

11
memory/MEMORY.md Normal file
View File

@@ -0,0 +1,11 @@
- [会话 2026-06-21 #2](session-20260621-2.md) — DNS解析API从10.1.1.160迁移至101.132.183.138:32210Java后端改指新地址
- [会话 2026-06-21 #1](session-20260621-1.md) — 宝塔面板API接入Nginx反代管理迁移至宝塔只读160 nginx废弃前端只读改造
- [会话 2026-06-19 #1](session-20260619-1.md) — 审计字段全栈实现:创建人/更新人/时间 + 排序 + DNS本地审计表 + 数据库迁移 + 部署
- [会话 2026-06-18 #1](session-20260618-1.md) — 网络架构讨论nginx是否迁阿里云+ 宝塔API调用方法
- [会话 2026-06-14 #2](session-20260614-2.md) — 编辑弹窗新增"内容压缩"Tabgzip配置+ "日志"Tab响应/错误日志)
- [会话 2026-06-14 #1](session-20260614-1.md) — HTTPS OPTIONS跨域修复 + 转发规则编辑弹窗Tab改造转发信息/配置文件/SSL查看
- [会话 2026-06-13 #1](session-20260613-1.md) — Mokee Gateway统一登录全栈接入前端动态菜单/Widget/鉴权 + 后端CORS/UserContext + Python中间件 + SQL
- [会话 2026-06-12 #1](session-20260612-1.md) — Nginx端口修复、证书列表同步、前端移动端适配、网关邮件测试
- [会话 2026-06-12 #2](session-20260612-2.md) — 修复HTTPS证书列表不显示 + Python API部署 + JPA→MyBatis-Plus迁移 + 服务器迁移文档
- [会话 2026-06-11 #2](session-20260611-2.md) — Let's Encrypt证书管理全栈实现zgitm.com正式证书签发邮件通知定时任务
- [会话 2026-06-11 #1](session-20260611-1.md) — Nginx 全局 gzip 压缩配置,前端 JS/CSS 加载加速

View File

@@ -0,0 +1,51 @@
---
name: session-20260611-1
description: 2026-06-11 第1次会话 — Nginx 全局 gzip 压缩配置
metadata:
type: session
date: 2026-06-11
sessionNumber: 1
startTime: 2026-06-11T00:40+08:00
endTime: 2026-06-11T01:00+08:00
---
# 2026-06-11 第1次会话
## 会话摘要
用户反馈前端 JS 文件加载非常慢,需要在 Nginx 添加 gzip 压缩。通过 paramiko 连接到 10.1.1.160,在 nginx.conf 的 http 块中添加了全局 gzip 配置,测试验证通过后重载。
## 关键操作
### Nginx gzip 压缩配置
- **做了什么**: 在 /etc/nginx/nginx.conf 的 http 块中添加 gzip 压缩配置
- **原因**: 前端 JS 文件通过 Nginx 代理转发时未压缩,加载非常慢
- **结果**: gzip 生效Content-Encoding: gzip所有代理转发的资源CSS/JS/JSON/SVG 等)自动压缩
- **具体配置**:
```
gzip on;
gzip_vary on;
gzip_proxied any; # 关键:对代理内容也压缩
gzip_comp_level 6;
gzip_min_length 1000; # 小于1KB不压缩
gzip_types text/plain text/css text/xml application/json
application/javascript text/javascript application/xml+rss
application/x-font-ttf image/svg+xml;
```
### 服务器操作
- 备份文件: /etc/nginx/nginx.conf.bak.gzip
- nginx -t 语法检查: ✅ 通过
- systemctl reload nginx: ✅ 成功Nginx active
- curl 测试: Content-Encoding: gzip 正常返回
### 本地代码更新
- `nginx-python-api/services/nginx_service.py`: 模块文档中添加 gzip 配置说明
## 重要信息
- 连接方式: paramiko (root / mokee.)
- gzip 是全局生效的http 块级别),所有 conf.d/*.conf 的域名配置都自动受益
- gzip_min_length=1000小于 1KB 的文件不会被压缩
## 待处理
- [ ] 用户提到"容器当前的配置"——如果是指 Docker 容器内的独立 Nginx需另外配置
- [ ] 清除浏览器缓存后测试前端 JS 加载速度是否改善

View File

@@ -0,0 +1,76 @@
---
name: session-20260611-2
description: 2026-06-11 第2次会话 — Let's Encrypt证书管理全栈实现
metadata:
type: session
date: 2026-06-11
sessionNumber: 2
startTime: 2026-06-11T22:00+08:00
endTime: 2026-06-11T22:40+08:00
---
# 2026-06-11 第2次会话
## 会话摘要
为 zgitm.com阿里云购买域名实现 Let's Encrypt DNS-01 证书管理全栈功能:
- acme.sh + 阿里云 DNS API 自动签发/续期
- 系统内置域名保护(不可在页面创建/修改/删除)
- 证书管理独立页面(签发/续期/通知设置)
- Java 端 @Scheduled 定时任务到期前15天每日10点发邮件提醒连续15天
- 邮件通过 Mokee Gateway 对外开放 API 发送systemCode: nginxServer
## 关键操作
### 数据库变更
- `certificates` 表新增字段: cert_type, notify_email, notify_enabled, notify_days_before, last_renew_time, renew_log
- 新建 `cert_notify_log` 表: 记录通知发送日志
- 插入 zgitm.com / www.zgitm.com 为 letsencrypt 类型证书
### 服务器 (10.1.1.160)
- 安装 acme.sh v3.1.4GitHub clone绕过 get.acme.sh 被墙)
- 设置默认 CA: Let's Encrypt
- 阿里云 AccessKey 配置在 /root/.bashrc: Ali_Key / Ali_Secret
- 正式签发 zgitm.com 和 www.zgitm.com Let's Encrypt 证书
- 证书安装至 /etc/nginx/ssl/{domain}.pem + .key
- 到期时间: 2026-09-09自动续期: 2026-08-10
### Python API
- `ssl_service.py`: +约120行LE_DOMAINS 列表ensure_le_certificate()renew_le_certificate()get_le_cert_info()
- `app.py`: 新增 4 个证书管理端点 + add_rule 中系统域名拦截
### Java 后端(新建/修改共8个文件
- `Certificate.java`: 新实体
- `CertificateRepository.java`: JPA Repository
- `CertificateService.java`: CRUD + 签发 + 续期 + 通知配置
- `CertificateController.java`: /api/certificates REST API
- `CertNotifyScheduler.java`: @Scheduled(cron="0 0 10 * * ?") 每天10点检查+发邮件
- `PythonApiClient.java`: +4个证书API方法签发/续期用 certRestTemplate(210s超时)
- `ForwardingRuleService.java`: 系统域名保护(增删改拦截)
- `RestTemplateConfig.java`: 新增 certRestTemplate Bean
- `application.yml`: +gateway 配置段
### 前端(新建/修改共5个文件
- `CertManagement.vue`: 证书管理页面(列表/签发/续期/通知设置)
- `router/index.js`: +/cert-management 路由
- `MainLayout.vue`: +SSL证书管理菜单Key图标
- `nginxApi.js`: +5个证书API方法
- `NginxForwarding.vue`: 系统域名保护(操作按钮置灰+Lock图标创建时拦截
## 架构要点
- 证书签发流程: Vue → Java → Python API → acme.sh → 阿里云DNS API + Let's Encrypt
- 邮件通知: Java @Scheduled → Mokee Gateway API → 邮件发送
- 系统域名 zgitm.com/www.zgitm.com 三层保护: 前端拦截 + Java校验 + Python API拒绝
- 手动创建域名保持内部CA签发原有逻辑不变
## 配置信息
- Mokee Gateway: https://gw.server.mokee.com (gw.base-url 可配置)
- SystemCode: nginxServer
- 阿里云 AccessKey: LTAI5t98jUxLUadZM1LkaSa8 / K2HyLLXizAgvOMOa0Mzc7ebs4gbAZs
- acme.sh 路径: /root/.acme.sh/acme.sh
- 证书目录: /etc/nginx/ssl/
## 待处理
- [ ] 部署 Java 新版本到服务器并重启
- [ ] 前端构建部署
- [ ] 测试邮件通知(可临时改 cron 表达式触发)
- [ ] 确认收件人邮箱(当前默认 admin@mokee.com

View File

@@ -0,0 +1,73 @@
---
name: session-20260612-1
description: 2026-06-12 第1次会话 — Nginx故障修复、证书列表同步、前端移动端适配、网关邮件测试
metadata:
type: session
date: 2026-06-12
sessionNumber: 1
startTime: 2026-06-12T01:00+08:00
---
# 2026-06-12 第1次会话
## 会话摘要
本次会话完成多项修复和优化nginx 80/443端口不监听修复、SSL证书列表从Python API自动同步到DB、前端移动端响应式适配、网关邮件接口连通性验证。
## 关键操作
### 1. Nginx 80/443 端口不监听修复
- **问题**: 所有域名访问不了nginx 进程在跑但不监听 80/443
- **根因**: `/etc/nginx/nginx.conf``http {}` 块缺少 `include /etc/nginx/conf.d/*.conf;`(上次加 gzip 时误删)
- **修复**: 在 gzip_min_length 行后补回 include 指令,`nginx -t` 通过后 reload
- **结果**: 80/443 恢复监听,域名访问正常
- **备份**: `/etc/nginx/nginx.conf.bak.20260612`
### 2. 删除 wg.server.zgitm.com 转发规则
- **原因**: 用户新增时提示"规则已存在",选择删除重建
- **操作**: 通过 Python API `DELETE /api/nginx/rules/wg.server.zgitm.com`
- **结果**: 规则和 nginx conf 文件同时删除
### 3. SSL 证书列表不显示修复 (Java)
- **问题**: 证书管理页面只显示 2 条zgitm.com/www.zgitm.com转发规则创建的 HTTPS 证书不显示
- **根因**: `CertificateService.listCertificates()` 只查 MySQL certificates 表,转发规则创建时未写入该表
- **修复**: `listCertificates()` 改为从 Python API 全量同步
- 调用 `pythonApiClient.listCerts()` 获取文件系统所有证书
- 自动发现 → 根据 issuer 判断 certType → 写入/更新 DB
- 已有记录保留通知配置,只刷新文件路径/到期时间
- **文件**: `CertificateService.java`
### 4. 证书列表性能优化
- **方案**: 5 分钟缓存 (CACHE_TTL_SECONDS=300)
- 首次同步后 5 分钟内直接读数据库
- 签发/续期成功后自动失效缓存 (`lastSyncTime = null`)
- **线程安全**: `synchronized` + 双重检查 `isSyncNeeded()`
### 5. 前端修改
- **通知设置默认邮箱**: `CertManagement.vue` — 空邮箱时默认 `zg@zgitm.com`
- **API 地址**: `.env.development` / `.env.production``https://nginx.server.zgitm.com`
### 6. 前端移动端适配
- **MainLayout.vue**: 汉堡菜单按钮 + CSS 动画侧边栏 + 遮罩层 + resize 监听
- **NginxForwarding.vue**: 工具栏垂直排列、表格横向滚动 (overflow-x: auto)、对话框 95% 宽
- **CertManagement.vue**: 同上 + 通知对话框适配
- **DnsManagement.vue**: 工具栏折叠、表格滚动
- **App.vue**: 全局消除点击高亮、触摸区增大、字号缩小
- 断点: ≤768px 自动切换移动布局
### 7. 网关邮件接口连通性验证
- **Token**: `POST https://gw.server.zgitm.com/zgapi/v1/open/token` — 200 OK
- **发邮件**: `POST .../zgapi/v1/open/email/send` — 重启后 200 OK
- **网关后端**: `http://10.10.1.170:9000`
- **systemCode**: nginxServersystemName: nginx配置管理平台
## 重要信息
- 网关: `https://gw.server.zgitm.com``http://10.10.1.170:9000`
- Java 后端: `10.10.1.170:4002` (`nginx.server.zgitm.com`)
- Python API: `10.1.1.160:5000`
- MySQL: `10.1.1.122:3306` (nginxserver/mokee.)
- 用户自己用 IDEA 部署 Java/前端
## 待处理
- [ ] 网关邮件接口确认 10.10.1.170:9000 服务稳定
- [ ] 用户自行部署 JavaCertificateService 改动)
- [ ] 用户自行构建部署前端MainLayout + 3页面 + 邮箱默认值)

View File

@@ -0,0 +1,83 @@
---
name: session-20260612-2
description: 2026-06-12 第2次会话 — 修复HTTPS转发规则创建后证书列表不显示
metadata:
type: session
date: 2026-06-12
sessionNumber: 2
startTime: 2026-06-12T12:00+08:00
---
# 2026-06-12 第2次会话
## 会话摘要
修复核心Bug创建 HTTPS 转发规则后,证书管理页面看不到对应证书。根因是 `ForwardingRuleService.addRule()` 只写 `forwarding_rules` 表没写 `certificates` 表,且 Python API 证书列表接口只扫描 `*.zgitm.com.pem` 文件。
## 关键操作
### 1. CertificateService 新增 syncCertificateRecord() + invalidateCache()
- **做了什么**:
- 新增 `syncCertificateRecord(domain, certPath, keyPath)` 方法upsert 证书记录
- 新增 `public void invalidateCache()` 暴露缓存失效
- **原因**: 创建/更新转发规则时需要同步写入 certificates 表
- **结果**: ForwardingRuleService 可调用此方法写入证书记录并立即失效缓存
- **文件**: `CertificateService.java`
### 2. ForwardingRuleService 注入 CertificateService
- **做了什么**:
- 注入 `CertificateService`(新增 `@Autowired`
- `addRule()`: HTTPS 协议时调用 `certificateService.syncCertificateRecord()`
- `updateRule()`: 同上
- **原因**: 修复创建/修改 HTTPS 规则时证书不写入 certificates 表的 Bug
- **结果**: 创建 HTTPS 规则后,证书管理页面立即显示对应证书
- **文件**: `ForwardingRuleService.java`
### 3. Python API 扩展证书扫描范围
- **做了什么**:
- `/api/nginx/certs`: 从只扫描 `*.zgitm.com.pem` 改为扫描全部 `*.pem` 文件
- `/api/nginx/certs/<domain>`: 移除 `is_zgitm_domain()` 限制,支持查询任意域名证书
- 排除 CA 根证书文件ca.pem, ca.crt
- **原因**: 内部 CA 签发的非 zgitm 域名证书无法通过同步机制发现
- **文件**: `app.py`
## 数据流(修复后)
```
创建 HTTPS 规则 → addRule()
├── Python API 签发证书 ✅
├── forwarding_rules 表 ✅
└── certificates 表 ✅ 新增syncCertificateRecord + invalidateCache
证书管理页面 → listCertificates()
└── 缓存已失效 → 直接查 DB → 立即显示 ✅
```
## 邮件通知架构确认
邮件通知和定时器已在 Java 后端实现:
- `CertNotifyScheduler.java`: @Scheduled(cron="0 0 10 * * ?") 每天10点
- 通过网关 API (`gw.server.zgitm.com`) 发送 HTML 邮件
- 只通知 letsencrypt 类型证书(含 notify 配置)
### 4. JPA → MyBatis-Plus 迁移
- **做了什么**: 全栈替换 Java 持久层框架23 个文件改动
- **原因**: 用户要求使用 MyBatis-Plus 替代 JPA
- **结果**: mvn clean compile BUILD SUCCESS零错误
- **文件**: pom.xml, application.yml, 3 Entity, 3 Mapper(新), 1 MetaObjectHandler(新), 3 Service, 1 Controller, 删除 3 Repository
### 6. Vue 前端移动端深度适配
- **做了什么**: 3 个页面表格→卡片视图,新增 useMobile composableMainLayout 复用 + 侧滑关闭App.vue 全局移动样式
- **原因**: 6-7列表格在手机上严重挤压需卡片化显示
- **结果**: BUILD SUCCESS移动端 Table→Card桌面端不变
- **文件**:
- 新增 `src/composables/useMobile.js`
- 修改 3 个 views (NginxForwarding/CertManagement/DnsManagement) — +卡片模板 + 卡片样式
- 修改 MainLayout.vue — 复用 useMobile + 侧滑关闭
- 修改 App.vue — 全局移动端增强(安全区域、字号、触摸优化)
### 7. gzip 修复 + proxy_buffering 优化
- **问题1**: nginx.conf 缺少 `gzip_types`,只压缩 text/htmlJS/CSS 完全不压缩
- **修复**: 添加 `gzip_types` 14 种 MIME 类型nginx -t 通过后 reload`Content-Encoding: gzip` 生效
- **问题2**: `web.gw.zgitm.com` 代理访问 40s vs 直连 3-10s
- **根因**: proxy_buffering 默认开启nginx 等后端全部返回后才发给客户端,延迟叠加
- **修复**: 全部 17 个 conf.d 配置加 `proxy_buffering off`Python API 模板同步更新4处确保未来新增规则也生效

View File

@@ -0,0 +1,96 @@
---
session_id: 20260613-1
date: 2026-06-13
summary: Mokee Gateway统一登录接入 - 全栈改造 + 多个Bug修复
status: 进行中 - Widget未显示其他功能正常
---
# Mokee Gateway 统一登录接入改造
系统编码: `nginxServer`,网关: `https://gw.server.zgitm.com`,登录: `https://login.user.zgitm.com`
## 最终改动的文件(汇总)
### 前端 (9 files)
| 文件 | 操作 | 说明 |
|------|------|------|
| `.env.development` | 改 | VITE_GATEWAY_URL / VITE_LOGIN_URL / VITE_SYSTEM_CODE |
| `.env.production` | 改 | 同上 |
| `index.html` | 改 | 引入 Widget CSSJS 改在 main.js 动态加载) |
| `src/main.js` | 重写 | bootstrap() 鉴权→拉菜单→挂载→加载 Widget |
| `src/utils/request.js` | 新增 | 网关 axios 实例,带 Token/X-System-Code兼容双 code 格式,错误消息提取 |
| `src/api/nginxApi.js` | 改 | 换新 request路径加 /api 前缀 |
| `src/router/index.js` | 重写 | 路由守卫,扁平路由注册,导出 menuTree |
| `src/layout/MainLayout.vue` | 改 | 侧边栏从 menuTree 渲染支持目录层级ICON_MAP 字符串→组件映射Widget 占位 |
| `index.html` | 改 | Widget CSS已移除静态 JS改动态加载 |
### 后端 (5 files)
| 文件 | 操作 | 说明 |
|------|------|------|
| `config/CorsConfig.java` | 新增 | allowedOriginPatterns("https://*.zgitm.com","http://localhost:*") + allowCredentials |
| `context/UserContext.java` | 新增 | ThreadLocal 工具类(修复 JDK 17 兼容:不用 getOrDefault |
| `filter/UserContextFilter.java` | 新增 | Servlet Filter 提取网关注入的 X-User-Id 等请求头 |
| `entity/ForwardingRule.java` | 改 | status 字段加 @TableLogic(value="1", delval="0") |
| `entity/DnsZoneConfig.java` | 改 | status 字段加 @TableLogic(value="1", delval="0") |
| `config/RestTemplateConfig.java` | **未改** | 保持原样Spring Boot 直连 Python API |
### 控制器 (3 files)
| 文件 | 操作 | 说明 |
|------|------|------|
| `ForwardingRuleController.java` | 改 | 删除 @CrossOrigin(origins="*")CORS 统一由 CorsConfig 管 |
| `CertificateController.java` | 改 | 同上 |
| `DnsController.java` | 改 | 同上 |
### 配置 (1 file)
| 文件 | 操作 | 说明 |
|------|------|------|
| `application.yml` | 改 | **删除全局 logic-delete-field: status**这是证书重复键Bug的根因 |
### Python API (1 file)
| 文件 | 操作 | 说明 |
|------|------|------|
| `nginx-python-api/app.py` | 改 | 添加 before_request 中间件提取用户请求头到 Flask g**未部署到服务器** |
### SQL (1 file)
| 文件 | 操作 | 说明 |
|------|------|------|
| `sql/gateway_init.sql` | 新增 | UUID 变量方式菜单Nginx代理管理→三个业务页面角色admin/user管理员admin_nginxServer |
## 踩过的坑
### 1. `@CrossOrigin(origins="*")` + `CorsConfig.allowCredentials(true)` 冲突
- 三个 Controller 原来有 `@CrossOrigin(origins="*")`,与全局 CorsConfig 的 `allowCredentials(true)` 合并后产生非法组合
- **修复**:删除三个 Controller 的 `@CrossOrigin`CORS 统一由 CorsConfig 管理
### 2. 网关菜单返回字段和前端预期不一致
- 网关实际返回:`{path, name, component, meta:{title,icon}, children}``component="Layout"` 表示目录
- 前端最初判断 `menuType`/`menu_name` 等字段,全部对不上
- **修复**`addDynamicRoutes()` 改为判断 `component==='Layout'`,路由扁平注册到 `/`,侧边栏从 `menuTree` 渲染
### 3. Widget `process is not defined`
- Widget JS 内部引用了 `process.env`,浏览器环境无此全局变量
- **修复**`main.js` 中加载 Widget 前加 `window.process = { env: {} }`
### 4. 路由嵌套导致菜单不显示
- 最初 `addDynamicRoutes` 把页面路由嵌套在 `/nginx/nginx-forwarding`redirect `/nginx-forwarding` 找不到
- **修复**:页面路由全部扁平注册到 `/`,侧边栏层级单独从 menuTree 渲染
### 5. 证书列表查询触发 INSERT 重复键 — 全局 logic-delete-field 误伤
- **根因**`application.yml` 全局 `logic-delete-field: status`MyBatis-Plus 给所有实体加 `AND status = 1`
- `Certificate.status` 是 String "active"`WHERE status = 1` 永远不成立 → selectOne 返回 null → 走 INSERT → 重复键
- `ForwardingRule.status``DnsZoneConfig.status` 是 Integer 0/1不受影响
- **修复**:删除全局 logic-delete-field在 ForwardingRule 和 DnsZoneConfig 的 status 字段加 `@TableLogic(value="1", delval="0")`
### 6. 前端错误消息丢失
-`request.js` 错误拦截器直接透传 axios error前端拿到 "Request failed with status code 500"
- 旧代码从 `error.response.data.message` 提取后端实际消息
- **修复**:错误拦截器追加 `new Error(error.response?.data?.message || error.message || '网络错误')`
### 7. Widget 动态加载时机
- Widget 脚本在 `index.html` 同步加载时 Vue 未渲染,找不到 `#mokee-user-chip`
- 移到 `main.js``app.mount()` 之后动态加载
- **当前状态Widget 仍未显示,待排查**
## 待解决
- [ ] Widget 用户头像组件不显示(右上角)
- [ ] Python API `app.py` 中间件需部署到 10.1.1.160

View File

@@ -0,0 +1,81 @@
---
name: session-20260614-1
description: 2026-06-14 第1次会话 — HTTPS OPTIONS跨域修复 + 转发规则编辑弹窗Tab改造转发信息/配置文件/SSL
metadata:
type: session
date: 2026-06-14
sessionNumber: 1
startTime: 2026-06-14T09:00:00+08:00
---
# 2026-06-14 第1次会话
## 会话摘要
修复了 `file.wg.zgitm.com` 的 CORS 跨域问题OPTIONS 预检无 CORS 头),并将转发规则编辑弹窗改为宝塔风格的三 Tab 布局(转发信息/配置文件/SSL新增配置文件在线编辑和 SSL 证书密钥查看功能。
## 关键操作
### 1. HTTPS 模板 OPTIONS 预检 CORS 修复
- **做了什么**: 在 `nginx_service.py` HTTPS_TEMPLATE 的 server 级别添加 CORS add_header`always` 参数),确保 `if ($request_method = OPTIONS) { return 204; }` 拦截时也能带上 CORS 响应头
- **根因**: OPTIONS 请求被 server 级 `if` 拦截返回 204但 CORS add_header 只在 location 块内,没机会执行
- **验证**: 修复前 OPTIONS 返回 `204` 无任何 CORS 头;修复后返回 `access-control-allow-*` 三个头
- **结果**: 已验证通过,模板已修复并部署到 10.1.1.160
### 2. 新增配置文件查看/编辑接口
- **做了什么**: Python API 新增 `GET/PUT /api/nginx/rules/<domain>/config`,后端 Java 新增透传方法,前端编辑弹窗新增"配置文件"Tab
- **GET**: 读取 `/etc/nginx/conf.d/{domain}.conf` 返回原始内容
- **PUT**: 写入配置 → `nginx -t` 语法检查 → 失败自动回滚 → 成功则 reload
- **结果**: Python API 已部署到 10.1.1.160,后端和前端待用户部署
### 3. 新增 SSL 证书/密钥查看接口
- **做了什么**: Python API 新增 `GET /api/nginx/rules/<domain>/ssl`,读取 `.pem``.key` 文件内容返回,前端 SSL Tab 只读显示
- **结果**: Python API 已部署,后端和前端待用户部署
### 4. 编辑弹窗改为 Tab 布局900px 宽)
- **做了什么**: NginxForwarding.vue 弹窗改为 `el-tabs` 三标签页:
- **转发信息**: 协议类型/域名/转发目标原有表单HTTPS 规则不可切换回 HTTP
- **配置文件**: nginx.conf 查看、编辑(黄色背景标识编辑模式)、保存并重载
- **SSL**: 仅 HTTPS 规则显示,证书(PEM)和密钥(KEY)只读查看
- **原因**: 用户要宝塔面板风格的配置编辑体验
- **结果**: 前端代码已改完,待用户构建部署
## 涉及文件
### Python API已部署到 10.1.1.160:/opt/nginx-api/
| 文件 | 操作 | 说明 |
|------|------|------|
| `services/nginx_service.py` | 改 | HTTPS_TEMPLATE server 级加 CORS add_header |
| `app.py` | 改 | 新增 config 查看/编辑 + SSL 查看接口 |
### 后端 Java待用户部署
| 文件 | 操作 | 说明 |
|------|------|------|
| `service/PythonApiClient.java` | 改 | 新增 getRuleConfig/updateRuleConfig/getSslFiles |
| `service/ForwardingRuleService.java` | 改 | 新增 getConfig/updateConfig/getSslFiles |
| `controller/ForwardingRuleController.java` | 改 | 新增 GET/PUT /{id}/config + GET /{id}/ssl |
### 前端 Vue待用户部署
| 文件 | 操作 | 说明 |
|------|------|------|
| `api/nginxApi.js` | 改 | 新增 getRuleConfig/updateRuleConfig/getRuleSslFiles |
| `views/NginxForwarding.vue` | 重写弹窗 | Tab 布局(转发信息/配置文件/SSL |
## 重要信息
### 服务器架构(本次确认)
- **10.1.1.160**: Nginx 反向代理 + Python API (`/opt/nginx-api/`, systemd: `nginx-api`)
- **10.1.1.170**: Mokee Gateway (9000端口) + 前端静态文件 (`/opt/mokee/web/`, 通过 docker-proxy 3002 暴露) + 部署服务 (4003端口)
- **10.1.1.160 上的域名配置**: /etc/nginx/conf.d/ 下各 .conf 文件
- **10.1.1.160 SSL 证书目录**: /etc/nginx/ssl/{domain}.pem + {domain}.key
### SSH 连接方式
- 10.1.1.160: root / mokee. (需密码,通过 Python paramiko
- 10.1.1.170: root / mokee. (需密码,通过 Python paramiko
### Python 远程操作
- Python 路径: `C:\Users\Administrator\AppData\Local\Programs\Python\Python312\python.exe`
- 使用 paramiko 连接 SSHpymysql 连接 MySQL
## 待处理
- [ ] 用户自行部署 Java 后端和 Vue 前端
- [ ] 验证前端 Tab 布局弹窗完整功能

View File

@@ -0,0 +1,107 @@
---
name: session-20260614-2
description: 2026-06-14 第2次会话 — 转发规则编辑弹窗新增"内容压缩"和"日志"两个Tab页
metadata:
type: session
date: 2026-06-14
sessionNumber: 2
startTime: 2026-06-14T22:30:00+08:00
endTime: 2026-06-15T00:40:00+08:00
---
# 2026-06-14 第2次会话
## 会话摘要
在Nginx转发管理编辑弹窗中新增了"内容压缩"仿宝塔gzip配置和"日志"(响应日志/错误日志两个Tab页。全栈实现数据库 → Python API → Java后端 → Vue前端。Python API已部署到10.1.1.160并测试通过。
## 关键操作
### 1. 新增"内容压缩"Tab第4个标签页
- **做了什么**: 在编辑弹窗新增"内容压缩"Tab包含gzip开关、12种MIME类型复选框与宝塔一致、压缩级别(1-9)、最小压缩长度(支持k/m单位)
- **涉及文件**:
- `sql/gzip_migration.sql` — 4个新字段
- `ForwardingRule.java` — gzipEnabled/gzipTypes/gzipCompLevel/gzipMinLength
- `nginx_service.py` — parse_gzip_config()/set_gzip_config() 方法
- `app.py` — GET/PUT `/api/nginx/rules/<domain>/gzip`
- `PythonApiClient.java` — getGzipConfig/updateGzipConfig
- `ForwardingRuleService.java` — getGzipConfig/updateGzipConfig同步DB+Nginx
- `ForwardingRuleController.java` — GET/PUT `/{id}/gzip`
- `nginxApi.js` — getRuleGzip/updateRuleGzip
- `NginxForwarding.vue` — 内容压缩Tabel-switch + el-checkbox-group + el-select
- **实现方式**: Python API直接修改Nginx配置文件中的gzip指令正则删除旧的→插入新的→nginx -t→reload失败自动回滚
- **结果**: 10.1.1.160已验证gzip配置读写正常nginx语法检查通过
### 2. 新增"日志"Tab第5个标签页
- **做了什么**: 新增"日志"Tab通过el-radio-button切换"响应日志"(access.log)/"错误日志"(error.log)支持最近50/100/200/500行
- **涉及文件**:
- `nginx_service.py` — get_domain_logs() 方法tail + grep过滤域名
- `app.py` — GET `/api/nginx/rules/<domain>/logs?lines=N`
- `PythonApiClient.java` — getDomainLogs
- `ForwardingRuleService.java` — getDomainLogs
- `ForwardingRuleController.java` — GET `/{id}/logs`
- `nginxApi.js` — getRuleLogs
- `NginxForwarding.vue` — 日志Tabel-radio-group + el-textarea只读
- **结果**: 10.1.1.160已验证,日志读取正常
### 3. Bug修复
- **问题**: set_gzip_config首次插入后再次更新时旧的`# 内容压缩gzip`注释不会被删除,导致重复
- **修复**: 在删除正则中增加对`# 内容压缩`注释行的清理
- **结果**: 已修复并重新部署,确认干净
## 涉及文件清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `sql/gzip_migration.sql` | 新增 | 安全迁移脚本(存储过程检查列是否存在) |
| `ForwardingRule.java` | 改 | 新增4个gzip字段 |
| `services/nginx_service.py` | 改 | 新增parse_gzip_config/set_gzip_config/get_domain_logs |
| `app.py` | 改 | 新增gzip GET/PUT + logs GET 端点 |
| `PythonApiClient.java` | 改 | 新增getGzipConfig/updateGzipConfig/getDomainLogs |
| `ForwardingRuleService.java` | 改 | 新增gzip业务方法同步DB+Nginx+ logs方法 |
| `ForwardingRuleController.java` | 改 | 新增 GET/PUT `/{id}/gzip` + GET `/{id}/logs` |
| `api/nginxApi.js` | 改 | 新增getRuleGzip/updateRuleGzip/getRuleLogs |
| `views/NginxForwarding.vue` | 改 | 新增内容压缩Tab + 日志Tab |
## 重要信息
### 部署状态
- **Python API (10.1.1.160)**: 已部署已验证gzip和logs端点 ✓
- **备份**: `/opt/nginx-api-backup-20260614-224351`
- **数据库迁移**: sql/gzip_migration.sql 待执行MySQL 10.1.1.122
- **Java后端**: 编译通过,待用户部署
- **Vue前端**: 编译通过npm build 3.85s),待用户部署
### 编辑弹窗Tab结构现在共5个Tab
1. 转发信息 — 始终可见
2. 配置文件 — 仅编辑模式
3. SSL — 仅编辑+HTTPS模式
4. 内容压缩 — 仅编辑模式(新增)
5. 日志 — 仅编辑模式(新增)
### gzip默认值
- 开关: 关闭
- MIME类型: 12种与宝塔一致
- 压缩级别: 6
- 最小长度: 1000字节
### 4. 全局gzip决策变更
- **做了什么**: 用户要求去掉nginx.conf全局gzip让每个域名通过页面独立控制。后又改为保留全局、隐藏Tab最终又改回去掉全局、保留Tab
- **最终结果**: 全局gzip已从 /etc/nginx/nginx.conf 移除(备份: nginx.conf.bak-20260615-002300"内容压缩"Tab保留 `v-if="isEditing"`
### 5. 前端Bug修复 — gzipLoadedOnce未重置
- **问题**: 开启gzip保存后关闭弹窗再打开开关显示"关闭"
- **根因**: `resetConfigState()` 重置了表单数据但没重置 `gzipLoadedOnce = false`,导致 `onTabChange` 跳过 `loadGzipConfig()`
- **修复**: 在 `resetConfigState()` 添加 `gzipLoadedOnce = false`,同时简化 `onTabChange` 条件判断
- **结果**: 每次打开弹窗都重新从服务器加载gzip配置
### 6. 未部署导致的"配置文件无gzip"问题
- **现象**: 页面上开启压缩后配置文件Tab看不到gzip指令
- **根因**: Java后端未部署更新版旧版无 /{id}/gzip 端点PUT请求到不了Python API
- **验证**: 直接在10.1.1.160上curl测试Python APIgzip读写均正常nginx -t通过
- **解决**: 需用户部署Java后端jar + Vue前端dist
## 待处理
- [x] MySQL 数据库迁移已完成4列添加成功gzip_enabled/gzip_types/gzip_comp_level/gzip_min_length
- [x] 全局gzip已从nginx.conf移除
- [ ] 用户部署Java后端和Vue前端
- [ ] 验证完整前端→后端→Python API链路

View File

@@ -0,0 +1,46 @@
---
name: session-20260618-1
description: 2026-06-18 第1次会话 — 网络架构讨论nginx是否迁到阿里云 + 宝塔API调用方法
metadata:
type: session
date: 2026-06-18
sessionNumber: 1
startTime: 2026-06-18T10:00:00+08:00
---
# 2026-06-18 第1次会话
## 会话摘要
本次会话主要是技术咨询,讨论了网络架构优化方案和宝塔面板 API 调用方法。无代码改动。
## 关键操作
### 1. 网络架构讨论 — nginx 是否迁到阿里云
- **做了什么**: 分析了当前架构用户→阿里云VPN→160 nginx→170应用与迁移方案nginx迁到阿里云→170应用的延迟差异
- **拓扑梳理**:
- 阿里云 VPN 服务器作为中转枢纽,所有 VPN 客户端流量经过它转发
- 160/170 都在办公网内网环境,通过 VPN 连接阿里云
- 用户必须连 VPN 才能访问内网服务
- **结论**: 两种方案物理路径相同(用户→阿里云→办公网),延迟差异在个位数毫秒级,体感无差别
- **决策**: 不迁移。迁移的真正收益是"用户不用连VPN"(体验提升),而非速度提升。既然核心诉求是更快,没必要折腾
### 2. 宝塔面板 API 调用方法
- **做了什么**: 介绍了宝塔面板 HTTP API 的调用方式
- **签名规则**: `request_token = MD5(request_time + api_key)`
- **必须参数**: request_token、request_time
- **常用接口**: 站点管理、数据库管理、服务重启、系统信息获取
- **注意事项**:
- 需在面板设置中开启API并配置白名单IP
- 旧版7.x以前API路径不同`/ajax?action=xxx`
- 建议面板端口不暴露公网通过SSH隧道或内网调用
- **结果**: 用户了解后未要求实际操作
## 重要信息
- 当前架构: 阿里云VPN ←VPN隧道→ 10.10.1.160(nginx) ─内网→ 10.1.1.170(应用)
- 域名绑定在 VPN 网络 IP (10.10.1.160) 上
- 上次部署状态(来自 6/14 会话): gzip+日志功能Python API已部署Java后端+Vue前端编译通过待部署
## 待处理
- [ ] 部署 Java 后端 jar含 gzip/logs 端点)
- [ ] 部署 Vue 前端 dist
- [ ] 验证完整前端→后端→Python API 链路

View File

@@ -0,0 +1,88 @@
---
name: session-20260619-1
description: 2026-06-19 第1次会话 — 审计字段全栈实现:创建人/更新人/时间 + 按创建时间倒序 + DNS本地审计表
metadata:
type: session
date: 2026-06-19
sessionNumber: 1
startTime: 2026-06-19T23:00:00+08:00
---
# 2026-06-19 第1次会话
## 会话摘要
全栈实现了审计字段功能Nginx转发管理和DNS解析管理两张表增加创建人/时间/更新人/时间字段前端显示并按创建时间倒序排列。数据库迁移已执行Java后端和Vue前端已编译部署到10.1.1.170的Docker容器。
## 关键操作
### 1. 数据库迁移
- **做了什么**: 给 `forwarding_rules``dns_zone_config``certificates` 三张表新增 `created_by VARCHAR(100)``updated_by VARCHAR(100)` 列;新建 `dns_records` 本地审计表
- **SQL文件**: `sql/audit_migration.sql`(用存储过程+INFORMATION_SCHEMA安全检查列是否已存在
- **执行方式**: Python pymysql 脚本直连 10.1.1.122
- **结果**: 6个审计列全部添加成功dns_records表已创建
### 2. Java实体层改动
- **做了什么**: ForwardingRule.java、DnsZoneConfig.java、Certificate.java 三个实体新增 `createdBy`/`updatedBy` 字段(@TableField + FieldFill自动填充新建 DnsRecord.java 实体和 DnsRecordMapper.java
- **结果**: 编译通过
### 3. MyMetaObjectHandler 自动填充
- **做了什么**: 新增 `resolveOperator()` 方法从 UserContext 获取当前用户优先级userName > userId > "系统"insertFill 同时填充 createdAt/updatedAt/createdBy/updatedByupdateFill 同时填充 updatedAt/updatedBy
- **结果**: 用户操作自动记录创建人/更新人;定时任务等无用户上下文场景写入"系统"
### 4. 业务层改动
- **ForwardingRuleService.java**: listRules() 增加 `.orderByDesc(ForwardingRule::getCreatedAt)` — 最近创建排最前
- **新建 DnsRecordService.java**: 核心理念"阿里云DNS为权威数据源本地dns_records仅做审计追踪"listRecords()合并阿里云记录+本地审计字段addRecord/updateRecord/deleteRecord先操作阿里云再同步本地
- **DnsController.java**: 注入 DnsRecordService 替代直接调 PythonApiClient
### 5. 前端改动
- **NginxForwarding.vue**: 桌面表格新增"创建人"(width:100)和"创建时间"(width:160)列;移动端卡片新增创建人和创建时间行;新增 formatDate() 函数
- **DnsManagement.vue**: 同上
- **结果**: 历史数据(null)显示"-",新数据正确显示创建人名称和格式化时间
### 6. 部署
- **数据库**: 已在10.1.1.122:3306/nginxserver执行迁移QA/PROD同一数据库
- **Java后端**: JAR编译后部署到10.1.1.170 Docker容器 `nginx-server-nginx-server`重启成功端口4002正常
- **Vue前端**: dist编译后部署到10.1.1.170 Docker容器 `nginx-web-nginx-web`端口3002正常
- **Python API**: 无需改动
## 重要信息
### 部署架构10.1.1.170 Docker
| 容器 | 端口 | 镜像 |
|------|------|------|
| nginx-server-nginx-server | 4002 | mokee-nginx-server-nginx-server |
| nginx-web-nginx-web | 3002 | mokee-nginx-web-nginx-web |
| mokeegateway-mokee-gateway-gateway | 9000 | Mokee Gateway |
### 数据库
- MySQL 10.1.1.122:3306/nginxserverQA和PROD共用
- 新增表 `dns_records` — DNS记录本地审计
- 3张表新增审计列forwarding_rules、dns_zone_config、certificates
### 审计字段自动填充逻辑
- 优先取 UserContext.getUserName()网关X-User-Name头
- 其次取 UserContext.getUserId()网关X-User-Id头
- 都没有则填"系统"(定时任务场景)
## 涉及文件清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `sql/audit_migration.sql` | 新增 | SQL迁移脚本安全添加列+建表) |
| `scripts/run_audit_migration.py` | 新增 | Python数据库迁移执行脚本 |
| `entity/DnsRecord.java` | 新增 | DNS记录本地审计实体 |
| `mapper/DnsRecordMapper.java` | 新增 | DNS记录Mapper |
| `service/DnsRecordService.java` | 新增 | DNS记录业务服务阿里云+本地合并) |
| `entity/ForwardingRule.java` | 改 | 新增 createdBy/updatedBy |
| `entity/DnsZoneConfig.java` | 改 | 新增 createdBy/updatedBy |
| `entity/Certificate.java` | 改 | 新增 createdBy/updatedBy |
| `config/MyMetaObjectHandler.java` | 改 | 新增 createdBy/updatedBy 自动填充 |
| `service/ForwardingRuleService.java` | 改 | listRules() 加 ORDER BY created_at DESC |
| `controller/DnsController.java` | 改 | 改用 DnsRecordService |
| `views/NginxForwarding.vue` | 改 | 新增创建人/创建时间列 + formatDate |
| `views/DnsManagement.vue` | 改 | 新增创建人/创建时间列 + formatDate |
## 待处理
- [ ] 用户通过网关登录后新增一条转发规则,验证创建人显示为实际用户名(而非"系统"
- [ ] 用户新增一条DNS记录验证创建人/时间正确显示
- [ ] 后续可考虑清理策略dns_records表中status=0的记录定期归档

View File

@@ -0,0 +1,99 @@
---
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 卸载(用户决定时机)
- [ ] 宝塔面板上创建更多反代项目后验证列表自动刷新

View File

@@ -0,0 +1,94 @@
---
name: session-20260621-2
description: 2026-06-21 第2次会话 — DNS解析API从10.1.1.160迁移至101.132.183.138:32210
metadata:
type: session
date: 2026-06-21
sessionNumber: 2
startTime: 2026-06-21T03:45:00+08:00
endTime: 2026-06-21T04:00:00+08:00
---
# 2026-06-21 第2次会话
## 会话摘要
将 DNS 解析 Python API 从 10.1.1.160:5000 迁移至 101.132.183.138:32210。创建了精简版独立 DNS API去掉了 Nginx/SSL 依赖),通过 systemd 部署到 138 上Java 后端改指新地址,已编译部署到 Docker。全链路验证通过。
## 关键操作
### 1. 创建独立 DNS Python API
- **做了什么**: 新建 `dns-api/` 目录,包含 4 个文件:`app.py`(精简 Flask仅 DNS 路由+健康检查)、`dns_service.py`(复制自原项目,零依赖改动)、`requirements.txt`flask 2.0.3 + gunicorn 20.1.0,兼容 Python 3.6)、`gunicorn_config.py`(端口 32210
- **原因**: 10.1.1.160 将停用138 上只需要 DNS 功能,不需要 Nginx/SSL 管理
- **关键改动**: `zone` 默认值从 `ssl_service.get_le_root_domain()` 改为环境变量 `DNS_DEFAULT_ZONE`(默认 zgitm.com彻底解除对 ssl_service 的依赖
- **结果**: 4 个文件已上传至 138
### 2. 部署 DNS API 到 101.132.183.138
- **做了什么**: SSH 到 138安装依赖flask 2.0.3 + gunicorn 20.1.0,适配 Python 3.6.8),创建 systemd 服务 `/etc/systemd/system/dns-api.service`,设置开机自启
- **阿里云 AK**: `LTAI5t98jUxLUadZM1LkaSa8` / `K2HyLLXizAgvOMOa0Mzc7ebs4gbAZs`(从 160 systemd 文件获取,已写入 138 服务 Environment
- **端口**: 32210HTTP
- **结果**: 服务正常运行健康检查通过DNS 记录查询正常
### 3. 修改 Java 后端配置
- **application.yml**: `python-api.base-url``http://10.1.1.160:5000``http://101.132.183.138:32210`
- **原因**: Java 通过 RestTemplate rootUri 自动拼接路径,只需改配置
- **无需改动**: RestTemplateConfig.java、PythonApiClient.java、DnsRecordService.java、DnsController.java、前端任何文件
### 4. 编译部署 Java 后端
- **编译**: `mvn clean package -Pprod -DskipTests` → BUILD SUCCESS
- **部署**: JAR 上传到 10.1.1.170docker cp 到 nginx-server-nginx-server:/app/app.jar重启容器
- **结果**: 服务正常启动API 响应正常
### 5. 全链路验证
- **列表查询**: 通过 Java → 138:32210 → 阿里云,记录正常返回(含审计字段)
- **添加测试**: `verify-dns-migration.zgitm.com` 创建成功record_id 返回正确
- **删除测试**: 测试记录已清理,列表确认已删除
- **结果**: DNS 添加/删除/列表 全链路通过
## 重要信息
### 新 DNS API 部署信息
| 项目 | 详情 |
|------|------|
| 服务器 | 101.132.183.138 |
| 端口 | 32210 |
| 协议 | HTTP |
| Python 版本 | 3.6.8 |
| 服务名 | dns-api |
| 目录 | /opt/dns-api/ |
| 启动 | `systemctl start dns-api` |
| 日志 | `journalctl -u dns-api` |
| 环境变量 | Ali_Key, Ali_Secret, DNS_DEFAULT_ZONE=zgitm.com |
| 默认 zone | zgitm.com可通过 DNS_DEFAULT_ZONE 环境变量修改) |
### 当前架构
```
Vue前端 → Mokee Gateway → Java后端(10.1.1.170:4002)
↓ DnsRecordService
↓ PythonApiClient
↓ RestTemplate rootUri: http://101.132.183.138:32210
Python Flask (101.132.183.138:32210)
↓ dns_service.py → 阿里云 DNS API (alidns.aliyuncs.com)
```
### 数据库地址变更(未完成)
- 用户要求将数据库从 10.1.1.122 改为 10.20.1.122
- **问题**: 10.20.1.122 从 10.1.1.170Docker 主机ping 不通3306 端口不可达
- **处理**: 已回滚,仍使用 10.1.1.122
- **待办**: 网络/防火墙打通后再次修改并部署
### 涉及文件清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `dns-api/app.py` | **新建** | 精简版 Flask DNS API4个DNS路由+健康检查) |
| `dns-api/dns_service.py` | **新建** | 阿里云DNS服务核心复制自原项目 |
| `dns-api/requirements.txt` | **新建** | flask==2.0.3, gunicorn==20.1.0 (Python 3.6兼容) |
| `dns-api/gunicorn_config.py` | **新建** | 端口32210 |
| `application.yml` | **改1行** | python-api.base-url → 101.132.183.138:32210 |
| `application-qa.yml` | 无净变更 | 数据库地址改了又回滚 |
| `application-prod.yml` | 无净变更 | 数据库地址改了又回滚 |
## 待处理
- [ ] 数据库地址 10.1.1.122 → 10.20.1.122(需网络打通 / 连得上数据库)
- [ ] 160 机器停用后清理旧 nginx-api 服务