初始化3
This commit is contained in:
@@ -102,7 +102,7 @@ class DnsService:
|
|||||||
|
|
||||||
def list_records(self, domain_zone, rr_keyword=None, record_type=None):
|
def list_records(self, domain_zone, rr_keyword=None, record_type=None):
|
||||||
"""
|
"""
|
||||||
获取域名解析记录列表
|
获取域名解析记录列表(自动分页,拉取全部记录)
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
domain_zone: 主域名 (如 zgitm.com)
|
domain_zone: 主域名 (如 zgitm.com)
|
||||||
@@ -112,21 +112,36 @@ class DnsService:
|
|||||||
Returns:
|
Returns:
|
||||||
list[dict]: 解析记录列表
|
list[dict]: 解析记录列表
|
||||||
"""
|
"""
|
||||||
params = {'DomainName': domain_zone}
|
params = {
|
||||||
|
'DomainName': domain_zone,
|
||||||
|
'PageSize': '100', # 每页最大100条
|
||||||
|
}
|
||||||
if rr_keyword:
|
if rr_keyword:
|
||||||
params['RRKeyWord'] = rr_keyword
|
params['RRKeyWord'] = rr_keyword
|
||||||
if record_type:
|
if record_type:
|
||||||
params['Type'] = record_type
|
params['Type'] = record_type
|
||||||
|
|
||||||
|
all_records = []
|
||||||
|
page_number = 1
|
||||||
|
total_count = None
|
||||||
|
|
||||||
|
while True:
|
||||||
|
params['PageNumber'] = str(page_number)
|
||||||
resp = self._call('DescribeDomainRecords', params)
|
resp = self._call('DescribeDomainRecords', params)
|
||||||
records = resp.get('DomainRecords', {}).get('Record', [])
|
|
||||||
# 统一转列表
|
domain_records = resp.get('DomainRecords', {})
|
||||||
|
records = domain_records.get('Record', [])
|
||||||
|
|
||||||
|
if total_count is None:
|
||||||
|
total_count = domain_records.get('TotalCount', 0)
|
||||||
|
logger.info(f'DNS 记录总数: {total_count}, 开始分页拉取...')
|
||||||
|
|
||||||
|
# 统一转列表(单条记录时阿里云返回 dict)
|
||||||
if isinstance(records, dict):
|
if isinstance(records, dict):
|
||||||
records = [records]
|
records = [records]
|
||||||
|
|
||||||
result = []
|
|
||||||
for r in records:
|
for r in records:
|
||||||
result.append({
|
all_records.append({
|
||||||
'record_id': r.get('RecordId', ''),
|
'record_id': r.get('RecordId', ''),
|
||||||
'rr': r.get('RR', ''),
|
'rr': r.get('RR', ''),
|
||||||
'type': r.get('Type', 'A'),
|
'type': r.get('Type', 'A'),
|
||||||
@@ -136,7 +151,14 @@ class DnsService:
|
|||||||
'status': r.get('Status', 'ENABLE'),
|
'status': r.get('Status', 'ENABLE'),
|
||||||
'full_domain': (r.get('RR', '') + '.' + domain_zone).strip('.'),
|
'full_domain': (r.get('RR', '') + '.' + domain_zone).strip('.'),
|
||||||
})
|
})
|
||||||
return result
|
|
||||||
|
# 判断是否还有下一页
|
||||||
|
if len(all_records) >= total_count or len(records) < 100:
|
||||||
|
break
|
||||||
|
page_number += 1
|
||||||
|
|
||||||
|
logger.info(f'DNS 记录拉取完成: zone={domain_zone}, 共 {len(all_records)} 条')
|
||||||
|
return all_records
|
||||||
|
|
||||||
def add_record(self, domain_zone, rr, record_type, value, ttl=600):
|
def add_record(self, domain_zone, rr, record_type, value, ttl=600):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
- [会话 2026-07-16 #1](session-20260716-1.md) — 宝塔API返回HTML错误排查(根因:10.1.1.170公网IP变更,白名单过期)
|
- [会话 2026-07-16 #1](session-20260716-1.md) — 宝塔API白名单过期排查 + DNS列表分页修复(阿里云API默认20→72条)
|
||||||
- [会话 2026-06-21 #2](session-20260621-2.md) — DNS解析API从10.1.1.160迁移至101.132.183.138:32210,Java后端改指新地址
|
- [会话 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-21 #1](session-20260621-1.md) — 宝塔面板API接入,Nginx反代管理迁移至宝塔(只读),160 nginx废弃,前端只读改造
|
||||||
- [会话 2026-06-19 #1](session-20260619-1.md) — 审计字段全栈实现:创建人/更新人/时间 + 排序 + DNS本地审计表 + 数据库迁移 + 部署
|
- [会话 2026-06-19 #1](session-20260619-1.md) — 审计字段全栈实现:创建人/更新人/时间 + 排序 + DNS本地审计表 + 数据库迁移 + 部署
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: session-20260716-1
|
name: session-20260716-1
|
||||||
description: 2026-07-16 第1次会话 — 宝塔API返回HTML错误排查(IP白名单变更)
|
description: 2026-07-16 第1次会话 — 宝塔API返回HTML排查(IP白名单)+ DNS列表分页修复(20→72条)
|
||||||
metadata:
|
metadata:
|
||||||
type: session
|
type: session
|
||||||
date: 2026-07-16
|
date: 2026-07-16
|
||||||
@@ -56,6 +56,15 @@ metadata:
|
|||||||
- API Key: ahv5RRcYm3Vi2PzEFvqYsZvsS8LeGkYp
|
- API Key: ahv5RRcYm3Vi2PzEFvqYsZvsS8LeGkYp
|
||||||
- ⚠️ IP 白名单需要与 10.1.1.170 实际出公网 IP 保持一致
|
- ⚠️ IP 白名单需要与 10.1.1.170 实际出公网 IP 保持一致
|
||||||
|
|
||||||
|
### 4. DNS 记录列表只返回 20 条修复
|
||||||
|
- **现象**: `GET /api/dns/records?zone=zgitm.com` 只返回 20 条记录
|
||||||
|
- **调用链路**: Vue前端 → Java后端 → Python DNS API(101.132.183.138:32210) → 阿里云 DescribeDomainRecords API
|
||||||
|
- **根因**: `dns-api/dns_service.py` 的 `list_records()` 调用阿里云 API 时未传 `PageSize` 参数,默认仅返回 20 条
|
||||||
|
- **修复**: 新增分页循环逻辑,`PageSize=100`,逐页拉取直到取完全部 `TotalCount` 条
|
||||||
|
- **改动文件**: `dns-api/dns_service.py` → 已部署到 101.132.183.138:/opt/dns-api/dns_service.py
|
||||||
|
- **验证**: 修复前 20 条 → 修复后 72 条
|
||||||
|
- **部署命令**: `scp` 上传 + `systemctl restart dns-api`(138 SSH 已免密)
|
||||||
|
|
||||||
## 改进建议
|
## 改进建议
|
||||||
- [ ] 考虑添加健康检查端点,主动监控宝塔 API 连通性
|
- [ ] 考虑添加健康检查端点,主动监控宝塔 API 连通性
|
||||||
- [ ] 考虑在 `BTPanelApiClient` 中增加响应 Content-Type 检测,当返回 HTML 时给出更友好的错误提示(而非 `HttpMessageConverter` 的底层错误)
|
- [ ] 考虑在 `BTPanelApiClient` 中增加响应 Content-Type 检测,当返回 HTML 时给出更友好的错误提示(而非 `HttpMessageConverter` 的底层错误)
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ FROM harbor.zgitm.com/library/eclipse-temurin:17-jre
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY target/*.jar app.jar
|
COPY target/*.jar app.jar
|
||||||
EXPOSE 32402
|
EXPOSE 32402
|
||||||
ENTRYPOINT ["java","-jar","app.jar"]
|
#ENTRYPOINT ["java","-jar","app.jar"]
|
||||||
|
ENTRYPOINT ["java","-Xms256m","-Xmx512m","-XX:+UseG1GC","-XX:MaxGCPauseMillis=200","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/app/dump.hprof","-Djava.security.egd=file:/dev/./urandom","-Duser.timezone=Asia/Shanghai","-jar","app.jar"]
|
||||||
Reference in New Issue
Block a user