32 KiB
Fonu → Havline 品牌改名实施与影响评估方案
日期:2026-10-01 当前版本:
1.9.0当前 Agent 版本:0.14.1扫描范围:仓库源码、部署文件、脚本、前端、文档、GitHub Actions、迁移与生成配置 扫描结果:227 个包含Fonu / fonu / FONU的文件,共 4032 处匹配 扫描排除:.git、web/node_modules、web/dist、cmd/fonu/web/dist、output、.playwright-cli、Havline Logo 预览页 说明:本方案文档本身不计入上述扫描统计。 执行记录:2026-10-01 已按“无兼容迁移”模式执行全量切换。本文中的兼容迁移设计作为历史设计记录保留,不再代表当前实施状态。
0. 结论速览
品牌改名可以做,但不能做一次无脑全局替换。
真正危险的不是页面文字,而是下面这些会直接影响老用户升级的契约:
| 风险项 | 当前值 | 改名后的风险 |
|---|---|---|
| 数据文件名 | fonu.db |
裸改名后应用会新建空库,用户会认为数据丢失 |
| 环境变量前缀 | FONU_* |
裸改名后老 .env、compose、systemd 配置全部失效 |
| Docker Volume | fonu-data |
裸改名后会创建新空卷 |
| Compose 项目名 | name: fonu |
项目名变化会让容器、网络、卷全部重新创建 |
| Agent 路径 | /etc/fonu-agent、/var/lib/fonu-agent |
服务端与 VPS Agent 版本错配时探测和升级失败 |
| Agent systemd | fonu-agent.service |
新老 Agent 可能同时存在或互相抢端口 |
| 会话 Cookie | fonu_session |
裸改名会让所有已登录用户掉线 |
| 一键升级 | fonu、fonu-updater 服务名与镜像 |
改名后 updater 找不到目标服务或镜像 |
| 前端版本检查 | O96u/Fonu |
仓库改名或常量未同步后,在线版本检查失效 |
推荐采用:
分层渐进改名 + 一个稳定版本周期的兼容层。
推荐目标命名:
| 形态 | 目标值 |
|---|---|
| 显示名 | Havline |
| 小写标识 | havline |
| 环境变量前缀 | HAVLINE_ |
| Go module | github.com/havline/havline |
| 主程序 | havline |
| Agent | havline-agent |
| Updater | havline-updater |
| Docker 镜像 | havline:<version> |
| Updater 镜像 | havline-updater:<version> |
| Compose 项目 | name: havline |
| Compose 服务 | havline、updater |
| 数据卷 | havline-data |
| 数据库 | havline.db |
1. 当前工作区前提
当前工作区不是干净状态,执行正式改名之前必须先处理基线问题。
已存在的未提交或未跟踪内容:
| 类型 | 路径 | 与本次改名关系 |
|---|---|---|
| 已修改 | web/src/layouts/AppLayout.vue |
侧栏已切到 havline-logo.svg,属于品牌展示层改动 |
| 已修改 | web/src/assets/brand/logo.png |
旧品牌资源,改名时必须统一处理 |
| 已修改 | web/public/favicon.png |
旧 favicon,改名时必须统一处理 |
| 已新增 | web/src/assets/brand/havline-logo.svg |
当前侧栏使用的第一版 SVG |
| 已新增 | web/src/assets/brand/havline-logo-v1.svg |
备选或历史 SVG |
| 已新增 | web/src/assets/brand/havline-logo-v2.svg |
当前推荐的第二版 SVG,尚未接入侧栏 |
| 已新增 | web/assets/image/havline-logo.svg |
镜像内资源目录的 SVG |
| 已新增 | docs/havline-logo-preview.html |
第一版 Logo 预览 |
| 已新增 | docs/havline-logo-v2-preview.html |
第二版 Logo 预览 |
| 未跟踪 | docs/fnos-app-packaging-plan.md |
飞牛应用打包方案,与品牌名有关 |
| 已删除 | internal/frp-1.0.2/** |
非本次改名逻辑的一部分,执行前需确认是否保留该删除 |
| 已删除 | web/src/views/FrpView-1.0.2.vue |
非本次改名逻辑的一部分,执行前需确认是否保留该删除 |
建议:
- 先把 Logo V2 和侧栏资源作为独立提交合入。
- 再确认
internal/frp-1.0.2与FrpView-1.0.2.vue的删除是否属于当前基线。 - 然后从干净、可回滚的基线开始兼容层和全仓改名。
2. 全仓扫描结果
2.1 数量统计
| 分类 | 文件数 |
|---|---|
| Go、module、迁移 | 144 |
| 前端 Web | 40 |
| 部署、Docker、脚本 | 9 |
| 文档、README、CHANGELOG | 31 |
GitHub Actions、.gitignore |
3 |
| 合计 | 227 |
匹配总量:4032 处。
2.2 重复率最高的文件
| 文件 | 匹配数 | 说明 |
|---|---|---|
web/src/views/AgentView.vue |
214 | Agent 管理页,包含大量文案、变量和 FonuCard 引用 |
web/src/views/FrpView.vue |
159 | 内网穿透页,包含品牌文案、变量和组件 |
web/src/views/ProxyView.vue |
133 | 反向代理页,主要是 CSS 变量与组件名 |
web/src/views/ProxyRemoteView.vue |
97 | 公网反代页 |
web/src/views/DashboardView.vue |
97 | 仪表盘 |
web/src/views/SettingsView.vue |
87 | 设置页 |
web/src/views/CertificatesView.vue |
80 | 证书页 |
web/src/views/DdnsView.vue |
77 | DDNS 页 |
docs/fnos-app-packaging-plan.md |
65 | 飞牛应用方案 |
docs/improvement-roadmap-2026-09-27.md |
65 | 改进路线图 |
docs/cloudflared-integration-plan.md |
62 | Cloudflare 集成方案 |
CHANGELOG.md |
57 | 历史版本记录 |
docs/brand-rename-plan.md |
57 | 上一版改名评估文档 |
docs/DEPLOYMENT.md |
56 | 部署文档 |
web/src/styles/variables.css |
51 | CSS 品牌变量定义 |
internal/agent/server.go |
48 | Agent 行为与远端路径 |
3. 命名映射表
3.1 用户可见名称
| 当前 | 目标 | 处理方式 |
|---|---|---|
Fonu |
Havline |
页面标题、侧栏、登录页、通知、状态页 |
github.com/O96u/Fonu |
待确认的新 GitHub 地址 | 版本检查、Release 链接 |
Gitea mrlee/-Fonu.git |
待确认的新仓库地址 | Compose Git 构建、Updater |
Fonu Agent |
Havline Agent |
UI、日志、systemd Description |
Fonu 自托管网关管理面板 |
Havline 自托管网关管理面板 |
systemd unit 描述 |
3.2 代码与构建标识
| 类型 | 当前 | 目标 | 风险 |
|---|---|---|---|
| Go module | github.com/fonu/fonu |
github.com/havline/havline |
中 |
| 主程序目录 | cmd/fonu |
cmd/havline |
中 |
| Agent 目录 | cmd/fonu-agent |
cmd/havline-agent |
高 |
| Updater 目录 | cmd/fonu-updater |
cmd/havline-updater |
高 |
| 前端包名 | fonu-web |
havline-web |
低 |
| 嵌入目录 | cmd/fonu/web/dist |
cmd/havline/web/dist |
中 |
| Agent 嵌入文件 | fonu-agent-linux-amd64 |
havline-agent-linux-amd64 |
高 |
| 构建版本注入 | github.com/fonu/fonu/internal/version.Version |
github.com/havline/havline/internal/version.Version |
高 |
| Docker 镜像 | fonu:<version> |
havline:<version> |
高 |
| Updater 镜像 | fonu-updater:<version> |
havline-updater:<version> |
高 |
3.3 运行期契约
| 类型 | 当前 | 目标 | 兼容要求 |
|---|---|---|---|
| 环境变量 | FONU_* |
HAVLINE_* |
新前缀优先,旧前缀兜底 |
| 数据库 | fonu.db |
havline.db |
自动探测并接管旧库 |
| Cookie | fonu_session |
havline_session |
新 Cookie 优先,旧 Cookie 兜底 |
| 本地主题 | fonu-theme |
havline-theme |
读旧值,写新值 |
| Compose 项目 | name: fonu |
name: havline |
需要卷迁移说明 |
| Compose 服务 | fonu |
havline |
Updater 变量必须同步 |
| Updater Socket | /run/fonu-updater/updater.sock |
/run/havline-updater/updater.sock |
Compose 两侧同步 |
| Updater Socket 卷 | fonu-updater-sock |
havline-updater-sock |
需要卷迁移 |
| 数据卷 | fonu-data |
havline-data |
不能直接改名,需要复制或保留旧卷名 |
| Agent 响应字段 | "service": "fonu-agent" |
"service": "havline-agent" |
新服务端同时识别新旧值 |
3.4 Agent 远端契约
| 类型 | 当前 | 目标 | 风险 |
|---|---|---|---|
| 二进制 | /usr/local/bin/fonu-agent |
/usr/local/bin/havline-agent |
高 |
| 配置目录 | /etc/fonu-agent |
/etc/havline-agent |
高 |
| 数据目录 | /var/lib/fonu-agent |
/var/lib/havline-agent |
高 |
| systemd unit | fonu-agent.service |
havline-agent.service |
高 |
| 环境变量 | FONU_AGENT_* |
HAVLINE_AGENT_* |
高 |
| Nginx 标记 | # Managed by fonu-agent. |
# Managed by havline-agent. |
高 |
| Nginx 探针 | fonu-probe.conf |
havline-probe.conf |
高 |
| Nginx 残留 | fonu-*.conf |
havline-*.conf |
高 |
| 证书目录 | /etc/fonu-agent/tls |
/etc/havline-agent/tls |
高 |
4. 分层影响分析
4.1 展示层
主要范围:
| 区域 | 文件 |
|---|---|
| 浏览器标题 | web/index.html |
| 侧栏品牌 | web/src/layouts/AppLayout.vue |
| 登录页 | web/src/views/LoginView.vue |
| 公开状态页 | internal/api/status_page_handler.go、internal/api/status_handler.go |
| 通知 | internal/notify/format.go、internal/notify/service.go、internal/notify/push.go |
| Agent 页面 | web/src/views/AgentView.vue |
| FRP 页面 | web/src/views/FrpView.vue |
| 设置页 | web/src/views/SettingsView.vue |
| 提示文案 | web/src/constants/notifyEvents.ts、web/src/router/index.ts |
高风险文案:
| 路径 | 当前内容 |
|---|---|
web/src/layouts/AppLayout.vue |
Fonu、让 NAS 访问更简单 |
web/src/views/LoginView.vue |
Fonu 标题、旧 Logo、alt="Fonu" |
web/index.html |
<title>Fonu</title> |
web/src/views/AgentView.vue |
Fonu Agent、fonu-agent、删除确认文案 |
web/src/constants/notifyEvents.ts |
VPS 上的 fonu-agent 连续无响应 |
internal/notify/* |
邮件、推送中的品牌前缀 |
internal/api/status_* |
公开状态页标题、页脚 |
4.2 前端资源层
当前品牌资源:
| 路径 | 用途 | 建议 |
|---|---|---|
web/src/assets/brand/logo.png |
侧栏/登录页旧 Logo | 保留至替换完成,随后删除 |
web/src/assets/brand/logo00.png |
历史/备用 Logo | 确认无引用后处理 |
web/src/assets/brand/havline-logo.svg |
当前第一版 SVG | 如决定 V2,替换引用 |
web/src/assets/brand/havline-logo-v1.svg |
第一版 SVG 备份 | 归档或删除 |
web/src/assets/brand/havline-logo-v2.svg |
推荐第二版 SVG | 作为正式 Logo 候选 |
web/assets/image/logo.png |
镜像内旧 Logo | 替换为 SVG 或导出 PNG |
web/assets/image/havline-logo.svg |
镜像内 SVG | 确认与 src/assets 保持一致 |
web/assets/image/banner.png |
品牌 Banner | 需要重绘 |
web/src/assets/brand/banner.png |
前端 Banner | 需要重绘 |
web/public/favicon.png |
浏览器 favicon | 换成 Havline SVG/PNG |
web/public/111favicon.png |
本地备用文件 | 确认是否应该入库 |
4.3 CSS 与组件层
CSS 变量数量:web/src/styles/variables.css 中 51 处 --fonu-*,且被大量 .vue 文件引用。
建议:
| 当前 | 目标 |
|---|---|
--fonu-brand |
--havline-brand |
--fonu-surface |
--havline-surface |
--fonu-text |
--havline-text |
--fonu-space-* |
--havline-space-* |
--fonu-radius* |
--havline-radius* |
组件重命名:
| 当前 | 目标 |
|---|---|
web/src/components/FonuCard.vue |
web/src/components/HavlineCard.vue |
.fonu-card |
.havline-card |
FonuCard import |
HavlineCard import |
影响文件:
web/src/views/AgentView.vue、CertificatesView.vue、CloudflareTunnelConfigView.vue、CloudflareView.vue、DashboardView.vue、DdnsView.vue、ExampleView.vue、FrpView.vue、LogsView.vue、ProxyRemoteView.vue、ProxyView.vue、SettingsView.vue。
4.4 构建与发布层
| 文件 | 影响 |
|---|---|
Dockerfile |
Agent 交叉编译、嵌入目录、主程序路径、Updater 二进制、环境变量 |
docker-compose.yml |
项目名、服务名、镜像、容器名、卷、环境变量 |
docker-compose.hub.yml |
Git 构建地址、镜像、Updater、Socket、卷、服务名 |
docker-compose.host.yml |
项目名、镜像、容器名、卷、host 网络环境变量 |
scripts/build-linux.ps1 |
发布物命名、cmd/fonu、agent 输出路径、ldflags |
scripts/fonu-install.sh |
/opt/fonu、/var/lib/fonu、/etc/fonu、fonu.service |
scripts/agent-install.sh |
Agent 二进制、目录、systemd unit、环境变量 |
scripts/upgrade.sh |
容器名、镜像名、FONU_VERSION |
scripts/upgrade-hub.sh |
Gitea 地址、容器名、镜像名、回滚命令 |
.github/workflows/ci.yml |
cmd/fonu/web/dist 同步路径 |
.github/workflows/docker-release.yml |
Docker Hub 镜像 DOCKERHUB_USERNAME}/fonu |
.github/workflows/github-release.yml |
虽无直接旧名,但 Release 流程需要回归 |
4.5 Go 代码标识层
go.mod:
github.com/fonu/fonu
一旦修改 module path,所有 Go 文件中的 import 都需要更新。
当前受影响 Go 文件包括:
| 目录 | 文件数量 |
|---|---|
cmd |
3 |
internal/acme |
7 |
internal/agent |
5 |
internal/api |
27 |
internal/app |
3 |
internal/auth |
3 |
internal/backup |
4 |
internal/cloudflared |
10 |
internal/config |
2 |
internal/frp |
13 |
internal/nginx |
23 |
internal/notify |
7 |
internal/updater |
6 |
| 其他 internal | 17 |
migrations |
2 |
4.6 运行契约层
| 文件 | 当前契约 | 改名风险 |
|---|---|---|
internal/config/config.go |
FONU_*、fonu.db |
环境变量和数据库路径 |
internal/api/middleware.go |
fonu_session |
登录态 |
internal/api/auth_handler.go |
设置/清除 fonu_session |
登录态 |
web/src/composables/useTheme.ts |
fonu-theme |
主题偏好 |
internal/backup/service.go |
备份名、fonu.db 检查 |
备份兼容 |
internal/backup/archive.go |
fonu-backup-*、fonu.db |
导入旧备份 |
internal/updater/runner.go |
FONU_VERSION、fonu:<version> |
一键升级 |
cmd/fonu-updater/main.go |
Updater 环境变量与默认服务名 | 一键升级 |
internal/frp/agent_installer.go |
/etc/fonu-agent、/usr/local/bin/fonu-agent |
Agent 安装与探测 |
internal/frp/ssh_installer.go |
上传 /tmp/fonu-agent |
Agent 安装 |
internal/agent/server.go |
Agent 版本、远端路径、Nginx 标记 | Agent 兼容 |
internal/agent/transport.go |
/etc/fonu-agent/tls |
HTTPS 直连 |
internal/monitor/monitor.go |
fonu-agent 状态文案与判定 |
监控与通知 |
4.7 数据与备份层
| 数据 | 当前值 | 处理策略 |
|---|---|---|
| SQLite 主库 | <DataDir>/fonu.db |
检测旧库,优先原子重命名,失败则回退旧路径 |
| Session Secret | <DataDir>/session_secret |
文件名不含品牌,不需要改名 |
| 备份文件名 | fonu-backup-YYYYMMDD-HHMMSS-N.tar.gz |
新名生成,旧备份仍允许导入 |
| 备份识别 | 必须存在 fonu.db |
同时兼容 havline.db 与 fonu.db |
| Docker 卷 | fonu-data |
不自动删旧卷,提供复制/挂载迁移 |
| Updater 卷 | fonu-updater-sock |
与 Compose 同步迁移 |
| Agent 数据 | /var/lib/fonu-agent |
安装脚本迁移到新目录,旧目录保留一个版本 |
| Agent 配置 | /etc/fonu-agent/agent.env |
新目录优先,旧目录兼容读取 |
5. 兼容迁移设计
5.1 环境变量
当前读取逻辑:
envOr("FONU_DATA_DIR", defaultDataDir())
目标逻辑:
envOrHavline("HAVLINE_DATA_DIR", "FONU_DATA_DIR", defaultDataDir())
规则:
HAVLINE_*优先。FONU_*作为 fallback。- 命中旧变量时启动日志给出一条迁移提示。
- 至少保留一个 stable 版本后再删除旧前缀。
必须兼容的环境变量:
FONU_DATA_DIR
FONU_LISTEN
FONU_SESSION_SECRET
FONU_NGINX_BIN
FONU_NGINX_PID
FONU_NGINX_MIME_TYPES
FONU_NGINX_HTTP_PORT
FONU_NGINX_HTTPS_PORT
FONU_FRPC_BIN
FONU_FRP_PID
FONU_UPDATER_SOCKET
FONU_AGENT_LISTEN
FONU_AGENT_ALLOW_REMOTE
FONU_AGENT_TOKEN
FONU_AGENT_NGINX_CONF_DIR
FONU_AGENT_NGINX_LOG_DIR
FONU_AGENT_NGINX_BIN
FONU_AGENT_CERTS_DIR
FONU_AGENT_DATA_DIR
FONU_AGENT_FRPS_CONFIG
FONU_AGENT_FRPS_BIN
FONU_UPDATE_PROJECT_DIR
FONU_UPDATE_COMPOSE_FILE
FONU_UPDATE_SERVICE
FONU_UPDATE_MODE
FONU_UPDATE_REPO
FONU_UPDATE_BRANCH
FONU_UPDATE_APP_URL
FONU_UPDATE_HOST_DIR
FONU_UPDATE_PROJECT_NAME
FONU_UPDATE_SELF_IMAGE
FONU_UPDATE_DOCKER_SOCK
FONU_VERSION
FONU_DATA_PATH
5.2 数据库接管
判断顺序:
havline.db存在:直接使用。havline.db不存在且fonu.db存在:尝试原子重命名。- 重命名失败:继续使用
fonu.db,日志提示迁移。 - 两者都不存在:创建
havline.db。
禁止行为:
- 不能在旧库存在时直接创建新空库。
- 不能删除旧库。
- 不能修改
session_secret,否则已有加密凭据无法解密。
5.3 Cookie 与本地偏好
| 项目 | 读策略 | 写策略 |
|---|---|---|
| Session Cookie | havline_session 优先,回退 fonu_session |
只写 havline_session |
| 主题偏好 | havline-theme 优先,回退 fonu-theme |
读到旧值后回写新键 |
5.4 Docker Compose 与 Volume
不能直接把 fonu-data 改成 havline-data 就结束。
推荐策略:
- 新 compose 使用
name: havline。 - 新卷名为
havline-data。 - 文档提供旧卷到新卷的复制命令。
- 升级前先备份旧卷。
- 首版兼容可以直接把
havline-data显式指向旧卷进行阶段性过渡。
示例:
volumes:
havline-data:
name: fonu-data
上述做法只用于过渡版本。完全切换完成后再恢复为 name: havline-data。
5.5 Updater 迁移
一键升级涉及四组变量:
FONU_UPDATE_SERVICE=fonu
FONU_UPDATE_APP_URL=http://fonu:6893
FONU_UPDATE_SELF_IMAGE=fonu-updater:<version>
FONU_UPDATER_SOCKET=/run/fonu-updater/updater.sock
改名时必须一起处理:
| 当前 | 目标 |
|---|---|
Service fonu |
Service havline |
App URL http://fonu:6893 |
http://havline:6893 |
Updater 镜像 fonu-updater |
havline-updater |
| Updater socket 目录 | /run/havline-updater/updater.sock |
| Socket volume | havline-updater-sock |
5.6 Agent 迁移
推荐 Agent 安装脚本流程:
- 检测旧
/etc/fonu-agent/agent.env。 - 停止并禁用
fonu-agent.service。 - 安装新
havline-agent二进制。 - 创建
/etc/havline-agent、/var/lib/havline-agent。 - 迁移或复制旧 token、证书和 frps 配置。
- 安装
havline-agent.service。 - 保留旧目录一个版本,便于回滚。
- 服务端探测同时检查新旧二进制、目录和 systemd unit。
Agent 版本必须递增。当前 AgentVersion = 0.14.1,品牌与路径变更建议递增到 0.15.0。
6. 实施阶段
阶段 0:冻结名称与外部身份
需要确认:
- GitHub 仓库新地址。
- Gitea 仓库新地址。
- Docker Hub 命名空间与仓库名。
- 是否保留旧仓库重定向。
- 是否发布旧镜像名兼容标签。
- 域名与商标状态。
阶段 1:兼容层先行
先不替换全仓品牌,只增加兼容能力:
internal/config/config.go支持HAVLINE_*与FONU_*双读。- 数据库支持
havline.db与fonu.db。 - Session Cookie 支持新旧双读。
useTheme.ts支持新旧 key。- Agent 探测支持新旧路径。
- Backup 导入支持新旧数据库名。
- Updater 支持新旧服务名与镜像名过渡。
阶段 2:展示层改名
web/index.html标题。AppLayout.vue品牌名、标语、Logo。LoginView.vue标题、Logo、说明文案。- 公开状态页和通知品牌名。
web/src/constants/notifyEvents.ts和路由 meta。- 前端资源与 favicon。
FonuCard.vue->HavlineCard.vue。--fonu-*->--havline-*。
阶段 3:代码标识改名
go.modmodule path。- 全仓 Go import。
cmd/fonu->cmd/havline。cmd/fonu-agent->cmd/havline-agent。cmd/fonu-updater->cmd/havline-updater。- Dockerfile ldflags。
- Agent 嵌入文件。
- CI
cmd/fonu/web/dist路径。
阶段 4:交付与升级链改名
- Docker 镜像名。
- Updater 镜像名。
- Compose service、container、volume。
scripts/upgrade.sh、scripts/upgrade-hub.sh。- 一键升级配置。
- Docker Release workflow。
阶段 5:Agent 全量切换
- 新 Agent 二进制。
- 新 systemd unit。
- 新目录和环境变量。
- Nginx 标记兼容。
- 旧 Agent 探测、升级、回滚。
- Agent 版本递增与双架构重编。
阶段 6:文档与历史清理
- README、DEPLOYMENT、容器文档、飞牛打包文档。
- CHANGELOG 只追加,不改历史发布记录。
- 删除旧兼容代码。
- 移除旧 Logo 和旧资源。
- 全仓 grep 验收。
7. 验证矩阵
7.1 构建验证
go build ./...
go vet ./...
go test ./... -count=1
cd web
npx vue-tsc --noEmit
npx vite build
npm test
7.2 Docker 验证
docker-compose.yml新建部署。docker-compose.hub.yml单文件部署。docker-compose.host.ymlhost 网络部署。- 旧
fonu-data卷启动新版本。 - 旧
.env中FONU_*继续生效。 - 新
.env中HAVLINE_*优先。 - 一键升级成功。
- 回滚到旧镜像成功。
7.3 数据验证
- 旧
fonu.db自动接管。 - 旧备份导入。
- 新备份导出与恢复。
session_secret不变,凭据仍能解密。- 旧 Cookie 能继续登录一次并迁移到新 Cookie。
- 旧主题偏好迁移。
7.4 Agent 验证
- 旧 Agent -> 新服务端。
- 新 Agent -> 旧服务端。
- 新 Agent -> 新服务端。
- 旧
/etc/fonu-agent升级到新目录。 - 旧
fonu-agent.service被正确停止和替换。 - 旧
fonu-probe.conf和fonu-*.conf能被识别和清理。
8. 回滚策略
| 阶段 | 回滚方式 |
|---|---|
| 展示层 | Git revert 文案与图片 |
| CSS/组件 | Git revert 组件重命名 |
| 环境变量双读 | 保留旧逻辑,无需回滚 |
| 数据库 | 优先使用旧库,反向重命名需单独文档 |
| Docker Volume | 保留旧卷,不自动删除 |
| Updater | 恢复旧 compose 与旧镜像 |
| Agent | 保留旧目录与旧 unit,重新启用旧服务 |
| Module path | 整体 revert,避免混合 import |
9. 建议提交拆分
| 提交 | 内容 |
|---|---|
| 1 | 增加 Havline Logo 资产与预览 |
| 2 | 品牌改名方案文档 |
| 3 | 环境变量、DB、Cookie、主题兼容层 |
| 4 | 前端展示层与资源替换 |
| 5 | CSS 变量与组件重命名 |
| 6 | Go module、cmd 目录、Agent 嵌入路径 |
| 7 | Docker、Compose、Updater、脚本 |
| 8 | Agent 远端安装与迁移 |
| 9 | 文档全面更新 |
| 10 | 兼容层清理 |
每个提交都必须能独立构建和回滚,不要把 10 个阶段压成一个提交。
10. 完整文件清单
以下文件为当前扫描到包含 Fonu / fonu / FONU 的全部文件。生成目录、node_modules、.git 不在此列表中。
10.1 GitHub Actions 与忽略规则
.github/workflows/ci.yml
.github/workflows/docker-release.yml
.gitignore
10.2 Go、module 与迁移
go.mod
cmd/fonu/main.go
cmd/fonu-agent/main.go
cmd/fonu-updater/main.go
internal/acme/dns_provider.go
internal/acme/dns_provider_test.go
internal/acme/domains.go
internal/acme/download.go
internal/acme/job.go
internal/acme/service.go
internal/acme/volcengine_dns.go
internal/agent/insights.go
internal/agent/route_test.go
internal/agent/server.go
internal/agent/transport.go
internal/agent/versions.go
internal/agent/versions_test.go
internal/api/auth_handler.go
internal/api/auth_handler_test.go
internal/api/backup_handler.go
internal/api/cert_handler.go
internal/api/chinacidr_handler.go
internal/api/cloudflare_handler.go
internal/api/ddns_handler.go
internal/api/deps.go
internal/api/discovery_handler.go
internal/api/frpmulti_handler.go
internal/api/logs_handler.go
internal/api/logs_handler_test.go
internal/api/metrics_handler.go
internal/api/middleware.go
internal/api/middleware_test.go
internal/api/nginx_handler.go
internal/api/notify_handler.go
internal/api/proxy_handler.go
internal/api/proxy_security.go
internal/api/router.go
internal/api/router_auth_test.go
internal/api/settings_handler.go
internal/api/status_handler.go
internal/api/status_page_handler.go
internal/api/token_handler.go
internal/api/update_handler.go
internal/api/version_handler.go
internal/api/version_handler_test.go
internal/app/app.go
internal/app/monitor_source.go
internal/app/monitor_source_test.go
internal/auth/auth.go
internal/auth/auth_test.go
internal/auth/token_test.go
internal/backup/archive.go
internal/backup/auto.go
internal/backup/auto_test.go
internal/backup/service.go
internal/chinacidr/service.go
internal/cloudflared/cloudflare_api.go
internal/cloudflared/config.go
internal/cloudflared/config_test.go
internal/cloudflared/health_test.go
internal/cloudflared/manager.go
internal/cloudflared/model.go
internal/cloudflared/operations.go
internal/cloudflared/routes.go
internal/cloudflared/service.go
internal/cloudflared/settings_test.go
internal/cloudflared/store.go
internal/config/config.go
internal/config/config_test.go
internal/db/db_test.go
internal/ddns/service.go
internal/frp/agent_client.go
internal/frp/agent_insights.go
internal/frp/agent_installer.go
internal/frp/agentbin/embed.go
internal/frp/frps_template.go
internal/frp/manager.go
internal/frp/model.go
internal/frp/route_drift.go
internal/frp/runtime.go
internal/frp/service.go
internal/frp/ssh_installer.go
internal/frp/ssh_installer_test.go
internal/fsutil/fsutil_test.go
internal/logstore/dashboard_access_test.go
internal/logstore/reader.go
internal/monitor/monitor.go
internal/nginx/certs.go
internal/nginx/comments.go
internal/nginx/custom.go
internal/nginx/custom_test.go
internal/nginx/endpoints.go
internal/nginx/endpoints_test.go
internal/nginx/errors.go
internal/nginx/errors_test.go
internal/nginx/generate.go
internal/nginx/generate_china_bypass_test.go
internal/nginx/generate_china_cidr_path_test.go
internal/nginx/generate_comments_test.go
internal/nginx/generate_https_no_cert_test.go
internal/nginx/generate_https_with_cert_test.go
internal/nginx/generate_multi_test.go
internal/nginx/generate_order_test.go
internal/nginx/generate_security_test.go
internal/nginx/generate_seed_mix_test.go
internal/nginx/generate_test.go
internal/nginx/global_framework_test.go
internal/nginx/htpasswd.go
internal/nginx/htpasswd_test.go
internal/nginx/nginx.go
internal/nginx/nginx_integration_test.go
internal/nginx/nginx_unavailable_test.go
internal/nginx/pid_test.go
internal/nginx/realip.go
internal/nginx/security.go
internal/nginx/versions.go
internal/nginx/versions_test.go
internal/nginxtmpl/nginxtmpl_test.go
internal/notify/format.go
internal/notify/format_test.go
internal/notify/push.go
internal/notify/push_test.go
internal/notify/service.go
internal/notify/smtp_test.go
internal/notify/store.go
internal/notify/store_test.go
internal/proxy/custom_endpoints_test.go
internal/proxy/proxy.go
internal/proxy/security.go
internal/proxy/security_test.go
internal/service/nginx_config.go
internal/service/proxy.go
internal/service/proxy_opts.go
internal/sysinfo/sysinfo_windows.go
internal/traffic/collector.go
internal/traffic/collector_test.go
internal/updater/client.go
internal/updater/model.go
internal/updater/remote_version_test.go
internal/updater/runner.go
internal/updater/server.go
internal/updater/server_test.go
migrations/023_frp_server_agent.sql
migrations/035_proxy_exits.sql
10.3 前端 Web
web/index.html
web/package.json
web/package-lock.json
web/src/App.vue
web/src/main.ts
web/src/api/client.ts
web/src/api/types.ts
web/src/components/ConfigDiffView.vue
web/src/components/EmptyState.vue
web/src/components/FonuCard.vue
web/src/components/LoadError.vue
web/src/components/MetricsTrendPanel.vue
web/src/components/NginxCodeEditor.vue
web/src/components/PageHeader.vue
web/src/components/ProxyAccessLogBox.vue
web/src/components/StatCard.vue
web/src/components/StatusBadge.vue
web/src/components/TaskProviderForm.vue
web/src/components/UpdateModal.vue
web/src/composables/useTheme.ts
web/src/constants/app.ts
web/src/constants/notifyEvents.ts
web/src/layouts/AppLayout.vue
web/src/router/index.ts
web/src/styles/variables.css
web/src/utils/clipboard.ts
web/src/views/AgentView.vue
web/src/views/CertificatesView.vue
web/src/views/CloudflareTunnelConfigView.vue
web/src/views/CloudflareView.vue
web/src/views/DashboardView.vue
web/src/views/DdnsView.vue
web/src/views/ExampleView.vue
web/src/views/FrpView.vue
web/src/views/LoginView.vue
web/src/views/LogsView.vue
web/src/views/ProxyRemoteView.vue
web/src/views/ProxyView.vue
web/src/views/SettingsView.vue
web/src/views/StatusPageView.vue
10.4 部署、Docker 与脚本
Dockerfile
docker-compose.yml
docker-compose.hub.yml
docker-compose.host.yml
scripts/agent-install.sh
scripts/build-linux.ps1
scripts/fonu-install.sh
scripts/upgrade.sh
scripts/upgrade-hub.sh
10.5 文档与历史
CHANGELOG.md
README.md
docs/DEPLOYMENT.md
docs/FRP公网暴露操作手册.md
docs/README.md
docs/agent-capability-plan.md
docs/agent-listen-strategy-plan.md
docs/agent-proxy-roadmap.md
docs/agent-proxy-settings-plan.md
docs/agent-view-design-v2.md
docs/agent-view-design.md
docs/agent-view-refactor-plan.md
docs/brand-rename-plan.md
docs/cloudflared-current-features.md
docs/cloudflared-feature-plan.md
docs/cloudflared-fonu-fit-plan.md
docs/cloudflared-github-ux-research.md
docs/cloudflared-integration-plan.md
docs/container-deploy-and-data.md
docs/feature-benchmark-2026-09-24.md
docs/fnos-app-packaging-plan.md
docs/frp-server-list-merge-plan.md
docs/frps-features.md
docs/frps服务端管理方案.md
docs/frps管理方案.md
docs/improvement-roadmap-2026-09-27.md
docs/project-analysis-2026-09-27.md
docs/project-audit-2026-09-24.md
docs/proxy-remote-design.md
docs/system-upgrade.md
docs/upstream-sync-plan.md
10.6 不在 grep 结果中但需要同步处理
| 路径 | 原因 |
|---|---|
web/src/assets/brand/havline-logo-v2.svg |
新 Logo 资源,需要决定最终接入口径 |
web/src/assets/brand/havline-logo-v1.svg |
Logo 历史版本 |
web/src/assets/brand/havline-logo.svg |
当前已接入侧栏 |
web/src/assets/brand/logo00.png |
历史/备用 Logo |
web/src/assets/brand/banner.png |
旧品牌 Banner |
web/src/assets/brand/banner-art.png |
旧品牌 Banner 素材 |
web/assets/image/havline-logo.svg |
镜像资源目录中的 SVG |
web/assets/image/logo.png |
旧品牌图片,需要替换 |
web/assets/image/banner.png |
旧品牌 Banner,需要重绘 |
web/public/favicon.png |
旧 favicon,需要替换 |
web/public/111favicon.png |
未确认用途 |
docs/havline-brand-rename-plan.md |
本方案文档本身 |
docs/havline-logo-preview.html |
第一版 Logo 预览 |
docs/havline-logo-v2-preview.html |
第二版 Logo 预览 |
cmd/fonu/web/dist/** |
生成目录,改名后由构建重新生成 |
internal/frp/agentbin/fonu-agent-linux-amd64 |
生成/嵌入二进制,改名后重新编译 |
internal/frp/agentbin/fonu-agent-linux-arm64 |
生成/嵌入二进制,改名后重新编译 |
fonu-agent.exe |
本地构建产物 |
11. 最终执行顺序
推荐顺序:
- 确认最终 Logo、GitHub、Gitea、Docker Hub 身份。
- 增加兼容层。
- 替换展示层。
- 替换 CSS 与组件。
- 替换 Go module 与 cmd 目录。
- 替换 Docker、Compose、Updater。
- 替换 Agent 远端安装与探测逻辑。
- 全量迁移文档。
- 跑完整回归。
- 保留兼容层一个版本。
- 删除旧兼容代码与旧资源。
12. 验收 grep
改名过程中可重复执行:
rg --hidden -in "fonu" `
--glob '!web/node_modules/**' `
--glob '!web/dist/**' `
--glob '!cmd/havline/web/dist/**' `
--glob '!.git/**' `
--glob '!output/**' `
--glob '!.playwright-cli/**'
分类验收:
rg -n "FONU_"
rg -n "fonu\.db|fonu_session|fonu-theme"
rg -n "fonu-agent|fonu-probe|/etc/fonu|/var/lib/fonu"
rg -n "github\.com/fonu/fonu|O96u/Fonu|/fonu:|fonu-data"
rg -n -- "--fonu-"
最终目标:
- 源码中不再出现旧品牌展示文案。
- 运行时代码不再依赖旧环境变量、旧 Cookie、旧数据库文件名。
- 兼容层只保留明确记录的旧值 fallback。
- 文档历史记录不改写,只新增迁移说明。
- 新安装、旧数据升级、旧 Agent 升级、旧 Compose 回滚四条路径全部通过。