初始化1
This commit is contained in:
6
memory/.session-last
Normal file
6
memory/.session-last
Normal 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文件),部署到138(systemd开机自启),Java配置改1行指新地址,编译部署到Docker,全链路验证通过。数据库10.1.1.122→10.20.1.122未完成(网络不通已回滚)。"
|
||||
}
|
||||
11
memory/MEMORY.md
Normal file
11
memory/MEMORY.md
Normal file
@@ -0,0 +1,11 @@
|
||||
- [会话 2026-06-21 #2](session-20260621-2.md) — DNS解析API从10.1.1.160迁移至101.132.183.138:32210,Java后端改指新地址
|
||||
- [会话 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) — 编辑弹窗新增"内容压缩"Tab(gzip配置)+ "日志"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 加载加速
|
||||
51
memory/session-20260611-1.md
Normal file
51
memory/session-20260611-1.md
Normal 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 加载速度是否改善
|
||||
76
memory/session-20260611-2.md
Normal file
76
memory/session-20260611-2.md
Normal 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.4(GitHub 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)
|
||||
73
memory/session-20260612-1.md
Normal file
73
memory/session-20260612-1.md
Normal 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**: nginxServer,systemName: 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 服务稳定
|
||||
- [ ] 用户自行部署 Java(CertificateService 改动)
|
||||
- [ ] 用户自行构建部署前端(MainLayout + 3页面 + 邮箱默认值)
|
||||
83
memory/session-20260612-2.md
Normal file
83
memory/session-20260612-2.md
Normal 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 composable,MainLayout 复用 + 侧滑关闭,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/html,JS/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处),确保未来新增规则也生效
|
||||
96
memory/session-20260613-1.md
Normal file
96
memory/session-20260613-1.md
Normal 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 CSS(JS 改在 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
|
||||
81
memory/session-20260614-1.md
Normal file
81
memory/session-20260614-1.md
Normal 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 连接 SSH,pymysql 连接 MySQL
|
||||
|
||||
## 待处理
|
||||
- [ ] 用户自行部署 Java 后端和 Vue 前端
|
||||
- [ ] 验证前端 Tab 布局弹窗完整功能
|
||||
107
memory/session-20260614-2.md
Normal file
107
memory/session-20260614-2.md
Normal 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` — 内容压缩Tab(el-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` — 日志Tab(el-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 API,gzip读写均正常,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链路
|
||||
46
memory/session-20260618-1.md
Normal file
46
memory/session-20260618-1.md
Normal 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 链路
|
||||
88
memory/session-20260619-1.md
Normal file
88
memory/session-20260619-1.md
Normal 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/updatedBy;updateFill 同时填充 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/nginxserver(QA和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的记录定期归档
|
||||
99
memory/session-20260621-1.md
Normal file
99
memory/session-20260621-1.md
Normal 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.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 卸载(用户决定时机)
|
||||
- [ ] 宝塔面板上创建更多反代项目后验证列表自动刷新
|
||||
94
memory/session-20260621-2.md
Normal file
94
memory/session-20260621-2.md
Normal 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)
|
||||
- **端口**: 32210(HTTP)
|
||||
- **结果**: 服务正常运行,健康检查通过,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.170,docker 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.170(Docker 主机)ping 不通,3306 端口不可达
|
||||
- **处理**: 已回滚,仍使用 10.1.1.122
|
||||
- **待办**: 网络/防火墙打通后再次修改并部署
|
||||
|
||||
### 涉及文件清单
|
||||
|
||||
| 文件 | 操作 | 说明 |
|
||||
|------|------|------|
|
||||
| `dns-api/app.py` | **新建** | 精简版 Flask DNS API(4个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 服务
|
||||
Reference in New Issue
Block a user