From c377405696a4d7385d2ec0b6a607739511d861a0 Mon Sep 17 00:00:00 2001 From: mrlee <470349233@qq.com> Date: Thu, 1 Oct 2026 13:12:37 +0800 Subject: [PATCH] =?UTF-8?q?chore(release):=20=E5=8F=91=E5=B8=83=20v1.9.0?= =?UTF-8?q?=20=E5=B9=B6=E6=9B=B4=E6=96=B0=20Cloudflare=20=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 32 ++++++++++++++++++++ VERSION | 2 +- docs/README.md | 2 +- docs/cloudflared-current-features.md | 4 +-- docs/system-upgrade.md | 8 ++--- web/package-lock.json | 4 +-- web/package.json | 2 +- web/src/views/CloudflareTunnelConfigView.vue | 29 +++++++++--------- web/src/views/ExampleView.vue | 16 +++++----- 9 files changed, 65 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9918b39..8768a58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,38 @@ All notable changes to this project will be documented in this file. +## [v1.9.0] - 2026-10-01 + +### 新增 + +- **Cloudflare 隧道出口抽象**:反向代理规则新增 `local` / `cloudflare` 出口选择,支持同时使用本机 Nginx 与 Cloudflare 隧道;托管隧道从服务发布规则自动派生 ingress,规则新增、修改、删除、启停时自动同步 Cloudflare 云端与 DNS +- **Cloudflare 独立配置页**:隧道「编辑」改为独立普通页面 `/cloudflare/:id/config`,包含指标、基础配置、拓扑图、路由列表和运行控制;基础配置通过按钮打开弹窗,不再直接堆叠在页面中 +- **Cloudflare 路由管理增强**:新增路由添加、编辑、删除、上移、下移、复制和源服务 TCP 连通性测试;通配路径 `*` 只在界面显示,不再作为非法正则发送给 Cloudflare +- **Cloudflare 接入向导与预检**:新增 cloudflared、Account ID、API Token、Zone 权限检查,并在 Cloudflare 页面提供接入向导入口 +- **Cloudflare 调和中心**:隧道列表显示“调和”状态;检测本地规则与云端 ingress 漂移,支持以本地规则一键覆盖修复 +- **Cloudflare 运维能力**:新增隧道健康巡检、24 小时可用率、断连/恢复通知、状态页事故记录、仪表盘摘要、日志中心分页、漂移检测、一键诊断、Access 只读检测、Zone 列表和 DNS 记录归属管理 +- **cloudflared 二进制管理**:支持查询最新版本、指定版本下载、保留上一版回滚;Cloudflare 页面显示当前版本并支持检查更新 +- **NAS 服务发现增强**:服务发现目录新增 Home Assistant、Immich、AdGuard Home、Synology DSM 等常见 NAS 应用;扫描后可按 Cloudflare 出口预填服务发布规则 +- **备份恢复增强**:备份归档加入 `cloudflared/tunnels`,保留隧道 `config.yml`、`creds.json` 与相关数据库记录 +- **Cloudflare 拓扑图**:按“域名 → 出口 → 隧道 → 服务”展示服务发布链路,支持点阵画布、节点和曲线连接 + +### 修复 + +- **Cloudflare 全局启动策略**:全局托管开启或 Fonu 启动时,默认启动全部隧道;关闭时停止全部隧道并阻止应用重启自动拉起 +- **Cloudflare 路由保存提示**:规则本体保存成功但 Cloudflare 同步失败时返回 `sync_warning` 并在前端提示,不再把已保存的规则判为完全失败 +- **Cloudflare metrics 端口识别**:兼容 `Starting metrics server...` 大小写日志格式,修复 metrics 端口、连接数、传输协议无法采集的问题 +- **Cloudflare DNS 安全清理**:只删除 Fonu 接管或创建的 DNS 记录,不覆盖用户已有的其他目标 CNAME +- **Cloudflare 隧道删除保护**:仍被反向代理规则引用的托管隧道不允许删除或切换为手工隧道 + +### 测试 + +- 新增 Cloudflare 出口默认值与持久化、托管规则生成 ingress、健康状态与可用率、路由解析、通配 path、DNS 记录归属、漂移比较、备份包含隧道配置等测试 +- `go test ./...`、`go vet ./...`、`npm run typecheck`、`npm test -- --run`、`npm run build` 通过 + +### 变更 + +- 版本号提升到 1.9.0;`AgentVersion` 保持 **0.14.1**,本次无 Agent 行为变化 + ## [v1.8.0] - 2026-09-30 ### 新增 diff --git a/VERSION b/VERSION index 27f9cd3..f8e233b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.8.0 +1.9.0 diff --git a/docs/README.md b/docs/README.md index 122f1db..6cb5e32 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ # Fonu 文档索引 > 维护约定:新增方案 / 审查文档时在下方登记;方案落地后在「状态」列标注实施结果,并给已被推翻的描述加时效说明。 -> 最近更新:2026-10-01(v1.8.0) +> 最近更新:2026-10-01(v1.9.0) ## 方案与设计(本目录) diff --git a/docs/cloudflared-current-features.md b/docs/cloudflared-current-features.md index 96db018..aab2abb 100644 --- a/docs/cloudflared-current-features.md +++ b/docs/cloudflared-current-features.md @@ -1,7 +1,7 @@ # Cloudflare 隧道当前功能说明 -> 日期:2026-09-30 -> 状态:阶段 1-3 主体已落地。本文描述**当前代码实际实现的能力**,不是早期规划稿。 +> 日期:2026-10-01 +> 状态:v1.9.0 实测功能基线。本文描述**当前代码实际实现的能力**,不是早期规划稿。 > 相关文档: > - `cloudflared-integration-plan.md`:早期融合方案 > - `cloudflared-feature-plan.md`:官方与参考项目功能全集,用于查漏 diff --git a/docs/system-upgrade.md b/docs/system-upgrade.md index d743736..831cc39 100644 --- a/docs/system-upgrade.md +++ b/docs/system-upgrade.md @@ -238,16 +238,16 @@ FONU_VERSION=<旧版本> docker compose up -d --no-deps --force-recreate fonu ## 10. 在线升级验证 -示例页面用于验证升级结果。v1.8.0 的验证流程: +示例页面用于验证升级结果。v1.9.0 的验证流程: 1. 确认当前线上实例为 v1.3.0,且 `fonu-updater` sidecar 已运行。 -2. 确认远端 `main` 分支的 `VERSION` 为 `1.8.0`。 +2. 确认远端 `main` 分支的 `VERSION` 为 `1.9.0`。 3. 在侧栏看到「一键升级」后点击并确认。 4. 等待升级弹窗显示成功,页面自动刷新。 5. 打开侧栏「示例页面」,确认: - 页面路由为 `/example`; - - 页面显示的版本为 `1.8.0`; - - 页面显示验证标识 `v1.8.0-example-page`; + - 页面显示的版本为 `1.9.0`; + - 页面显示验证标识 `v1.9.0-example-page`; - 页面显示独立的「本次升级验证」区块; - 「升级验证」显示为「通过」。 diff --git a/web/package-lock.json b/web/package-lock.json index a920127..1463de0 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "fonu-web", - "version": "1.8.0", + "version": "1.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "fonu-web", - "version": "1.8.0", + "version": "1.9.0", "dependencies": { "@codemirror/commands": "^6.11.1", "@codemirror/lang-javascript": "^6.2.5", diff --git a/web/package.json b/web/package.json index 1300487..00dc6e5 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "fonu-web", "private": true, - "version": "1.8.0", + "version": "1.9.0", "packageManager": "npm@10.9.4", "type": "module", "scripts": { diff --git a/web/src/views/CloudflareTunnelConfigView.vue b/web/src/views/CloudflareTunnelConfigView.vue index 35d68c8..69a4fc5 100644 --- a/web/src/views/CloudflareTunnelConfigView.vue +++ b/web/src/views/CloudflareTunnelConfigView.vue @@ -266,7 +266,7 @@ const routeEditingIndex = ref(null) const routeForm = ref({ subdomain: '', domain: '', type: 'http', target: '' }) const loadError = ref('') const form = ref({ name: '', subdomain: '', domain: '', type: 'http', target: '', autoStart: false }) -const TOPOLOGY_WIDTH = 820 +const TOPOLOGY_WIDTH = 880 const TOPOLOGY_ROW_HEIGHT = 54 const TOPOLOGY_START_Y = 38 @@ -298,15 +298,15 @@ function serviceY(index: number) { } function domainToExitPath(sourceY: number) { - return `M 220 ${sourceY} C 250 ${sourceY}, 265 ${centerY.value}, 292 ${centerY.value}` + return `M 280 ${sourceY} C 295 ${sourceY}, 305 ${centerY.value}, 320 ${centerY.value}` } function exitToTunnelPath() { - return `M 392 ${centerY.value} L 470 ${centerY.value}` + return `M 420 ${centerY.value} L 460 ${centerY.value}` } function tunnelToServicePath(targetY: number) { - return `M 578 ${centerY.value} C 610 ${centerY.value}, 625 ${targetY}, 660 ${targetY}` + return `M 570 ${centerY.value} C 585 ${centerY.value}, 598 ${targetY}, 610 ${targetY}` } async function load() { @@ -568,7 +568,7 @@ onMounted(load) } .topology-graph { position: relative; - width: 820px; + width: 880px; height: 100%; margin: 0 auto; } @@ -579,13 +579,10 @@ onMounted(load) display: flex; align-items: center; gap: 8px; - width: 220px; + width: 280px; height: 44px; } .topology-domain__name { - max-width: 125px; - overflow: hidden; - text-overflow: ellipsis; white-space: nowrap; color: var(--fonu-brand-text); text-decoration: underline; @@ -599,7 +596,7 @@ onMounted(load) position: absolute; inset: 0; z-index: 1; - width: 820px; + width: 880px; height: 100%; pointer-events: none; } @@ -628,16 +625,17 @@ onMounted(load) box-shadow: var(--fonu-shadow); white-space: nowrap; } -.topology-exit { left: 292px; min-width: 100px; } -.topology-tunnel { left: 470px; min-width: 108px; } +.topology-exit { left: 320px; min-width: 100px; } +.topology-tunnel { left: 460px; min-width: 110px; } .topology-service { position: absolute; - left: 660px; + left: 610px; z-index: 2; display: flex; align-items: center; gap: 8px; - width: 150px; + width: max-content; + min-width: 260px; height: 44px; padding: 7px 8px; border: 1px solid var(--fonu-border); @@ -645,8 +643,9 @@ onMounted(load) background: var(--fonu-surface); color: var(--fonu-text-secondary); font-size: 12px; - overflow-wrap: anywhere; + white-space: nowrap; } +.topology-service .mono { white-space: nowrap; } .topology-service :deep(.n-icon) { flex: none; color: var(--fonu-brand); } .config-form { max-width: 780px; } .config-form__grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 12px; } diff --git a/web/src/views/ExampleView.vue b/web/src/views/ExampleView.vue index 60b6f38..5d2158e 100644 --- a/web/src/views/ExampleView.vue +++ b/web/src/views/ExampleView.vue @@ -8,7 +8,7 @@ - + 当前页面由 v{{ version }} 提供,验证标识为 {{ verificationMarker }}。 如果你是在升级后首次看到这行内容,说明前端构建、镜像重建和服务重启均已成功。 @@ -19,7 +19,7 @@ {{ verificationRound }}
- 看到这个新区块,说明前端资源已经从旧版本切换到 v1.8.0。 + 看到这个新区块,说明前端资源已经从旧版本切换到 v1.9.0。
@@ -33,16 +33,16 @@ - +
    -
  • 页面版本提示更新为 v1.8.0。
  • -
  • 「本次升级验证」区块和页面状态同步更新为 v1.8.0。
  • -
  • 验证标识更新为 v1.8.0-example-page。
  • +
  • 页面版本提示更新为 v1.9.0。
  • +
  • 「本次升级验证」区块和页面状态同步更新为 v1.9.0。
  • +
  • 验证标识更新为 v1.9.0-example-page。
@@ -87,8 +87,8 @@ const message = useMessage() const version = ref(__APP_VERSION__) const checkedAt = ref('') const refreshing = ref(false) -const verificationRound = 'v1.8.0' -const verificationMarker = 'v1.8.0-example-page' +const verificationRound = 'v1.9.0' +const verificationMarker = 'v1.9.0-example-page' async function refreshVersion() { refreshing.value = true