OpenFlare 后端迁移 — AI 接手文档
状态:进行中(阶段 5 收尾)
主线:openflare-server 业务域已迁入 Wavelet/internal/apps/openflare/;管理控制台走 /api/v1/d/* + Wavelet/frontend;节点协议走 /api/v1/agent|relay|tunnel/*
关联计划:实现计划
1. 当前任务状态
主线任务
将 OpenFlare 控制面后端从 openflare-server 迁移至 Wavelet 框架,复用 Wavelet 用户/OAuth/Cap 等平台能力,并完成 Agent/Relay/Tunnel 协议兼容。
架构现状(2026-06-19):原计划「阶段一 /api/* legacy 层 + 旧前端联调」已在 v1 路径切换时撤销。internal/apps/openflare/legacy/、compat/auth.go 已删除;openflare-server/web 不再能对接当前 Wavelet 后端。
开发分支
- 分支:
dev
- 参考对照:旧后端
openflare-server/(待 ETL 验证后归档)
已完成(✅)
进行中(阶段 5)
- [/] B5-3 旧环境数据迁移脚本
support-files/migration/(用户 + 业务表 ETL,含 10 分片观测数据合并)
- [/] B5-4
make swagger + make code-check 全绿
- [/] B5-5 全量 API 回归(对照实现计划 §12 端点表)
待处理
2. 任务队列(委派状态)
| ID |
板块 |
状态 |
负责目录 |
| T-AUTH |
认证/用户/OAuth/Cap |
✅ |
Wavelet apps/user、apps/oauth、apps/cap、apps/admin(无独立 legacy 包) |
| T-OPTION |
状态/公告/Option |
✅ |
openflare/option/,register_option.go |
| T-ORIGIN |
源站 |
✅ |
openflare/origin/,register_origin.go |
| T-APPLYLOG |
应用日志 |
✅ |
openflare/apply_log/,register_apply_log.go |
| T-PROXY |
代理规则 |
✅ |
openflare/proxy_route/,register_proxy_route.go |
| T-NODE |
节点管理 |
✅ |
openflare/node/,register_node.go |
| T-WAF |
WAF |
✅ |
openflare/waf/,register_waf.go |
| T-TLS |
TLS/证书/域名/DNS |
✅ |
openflare/tls/,register_tls.go |
| T-CFGVER |
配置版本 |
✅ |
openflare/config_version/,register_config_version.go |
| T-AGENT |
Agent API + WS |
✅ |
openflare/agent/,register_agent.go |
| T-PAGES |
Pages 托管 |
✅ |
openflare/pages/,register_pages.go |
| T-RELAY |
Relay + Tunnel |
✅ |
openflare/relay/、openflare/flared/,register_relay_flared.go |
| T-OBS |
仪表盘 + 可观测 |
✅ |
openflare/dashboard/、openflare/observability/,register_dashboard.go、register_observability.go |
| T-MISC |
升级/GeoIP/UptimeKuma |
✅ |
openflare/update/、openflare/geoip/、openflare/uptimekuma/,register_update.go、register_option.go |
任务隔离规则
| 规则 |
说明 |
| 文件所有权 |
每个任务 仅修改 自己的 internal/apps/openflare/<module>/、对应 router/v1/openflare/register_<module>.go、internal/model/openflare_<module>.go、goose SQL |
| 禁止修改 |
v1/user.go、v1/admin.go、model/users.go、其他任务的 register_*.go |
| 控制台响应格式 |
{error_msg, data} + response.Abort*(Wavelet 标准) |
| 协议响应格式 |
compat.OK/Fail({success, message, data}),供 Agent/Relay/Tunnel 二进制使用 |
| 控制台鉴权 |
apiutil.AdminRequired()(Session / X-Access-Token,user.IsAdmin + token_admin) |
| Logic 层 |
logics.go 使用 context.Context,不依赖 *gin.Context |
| 数据源 |
db.DB(ctx) 获取 GORM |
| 质量门禁 |
完成后 go build ./... 并通过本模块测试 |
3. 核心文件与上下文
路由注册
| 路径 |
职责 |
Wavelet/internal/router/router.go |
apiGroup → v1.RegisterV1Routes |
Wavelet/internal/router/v1/v1.go |
汇总 User/Admin/OpenFlare 路由 |
Wavelet/internal/router/v1/openflare/v1.go |
RegisterV1Routes → /api/v1/d/* 控制台 |
Wavelet/internal/router/v1/openflare/openflare.go |
RegisterRoutes → `/api/v1/agent |
Wavelet/internal/router/v1/openflare/register_*.go |
各资源路由挂载 |
Wavelet/internal/apps/openflare/*/routers.go |
Handler + Swagger 注解 |
Wavelet/internal/apps/openflare/compat/response.go |
协议层 legacy 信封(仅 Agent/Relay/Tunnel) |
Wavelet/internal/apps/openflare/apiutil/ |
控制台 BindJSON、AdminRequired、RegisterCollection |
后台任务(Asynq)
| 任务名 |
说明 |
openflare:database_auto_cleanup |
可观测数据自动清理(受 Option 开关控制) |
openflare:waf_ip_group_sync |
WAF IP 组周期同步 |
openflare:uptime_kuma_sync |
UptimeKuma 同步 |
openflare:ssl_renew |
ACME 证书自动续期 |
启动链路:wavelet api / wavelet all → bootstrap.Init → Asynq worker/scheduler 执行;任务定义见 async_tasks.go,调度种子见 202606190013。
数据库迁移
| 版本 |
内容 |
202606190001 |
of_options |
202606190002 |
of_origins |
202606190003 |
of_apply_logs |
202606190004 |
of_proxy_routes |
202606190005 |
of_nodes |
202606190006 |
of_waf_* |
202606190007 |
of_tls_* |
202606190008 |
of_config_versions |
202606190009 |
of_pages_* |
202606190010 |
可观测性单表 |
202606190011 |
of_node_access_logs 复合索引 |
202606190012 |
of_node_obs_frpc |
202606190013 |
OpenFlare Asynq 调度种子 |
202606190014 |
Pages upload_id 字段 |
路径:Wavelet/internal/db/migrator/goose/postgres/ 与 sqlite/ 各一份。
近期修复要点(2026-06-19)
| 问题 |
根因 |
修复/处理 |
| Agent 已连接但节点显示「异常」 |
无激活 config version |
运维:发布并激活配置版本 |
| 节点详情无错误日志 |
可观测性表未迁移 |
202606190010 + agent/observability.go |
| WAF IP 组未下发 |
Agent sync 未实装 |
agent/waf_ip_group.go、waf/ip_group_sync.go |
| Pages 包下载 404 |
Agent 路由缺失 |
pages/logics.go、agent/routers.go |
| 访问日志查询空 |
单表查询层缺失 |
model/openflare_access_log.go、202606190011 |
| Relay/Tunnel 观测缺失 |
heartbeat 未持久化 |
relay/observability.go、flared/observability.go、202606190012 |
依赖修复
replace github.com/rain-kl/openflare => ../ 会引入根 go.mod 的 gomodule/redigo v2.0.0+incompatible,与 gin-contrib/sessions/redistore 不兼容。已在 Wavelet/go.mod 添加 exclude 并锁定 redigo v1.9.3。
4. 集成测试
| 测试包 |
场景 |
结果 |
integration/auth_option_test.go |
Access Token 鉴权、option 权限、热重载 |
✅ 5/5 |
integration/core_chain_test.go |
源站→规则→发布→节点→apply-log |
✅ 6/6 |
integration/security_test.go |
WAF/TLS/域名/DNS |
✅ 7/7 |
integration/agent_protocol_test.go |
Agent/Relay/Tunnel 协议 |
✅ 5/5 |
5. 本地启动(Wavelet 后端)
配置
复制 Wavelet/config.example.yaml → config.yaml,关键项:
启动命令
当前联调方式
- 管理控制台:
Wavelet/frontend(pnpm dev 或 embed 构建产物),Session 鉴权,API 前缀 /api/v1/d/*
- 节点二进制:连接
/api/v1/agent/*、/api/v1/relay/*、/api/v1/tunnel/*(legacy {success,message,data} 信封)
- 旧前端
openflare-server/web:已无法对接当前后端(无 /api/* 控制台路由、无 OpenFlare-Token 桥接)
6. 待决策与遗留问题
| 项 |
说明 |
当前处理 |
| 观测数据 10 分片 → 单表 |
旧生产环境有 node_*_XX 分片表 |
v1 单表;B5-3 ETL 脚本待建 |
| 微信登录 |
Wavelet 无内置 |
旧 /api/oauth/wechat* 未保留;评估废弃或补 v1 适配 |
| 三级角色 Root(100) |
旧 RootAuth |
简化为 is_admin + Access Token token_admin |
| 节点「异常」展示 |
连接正常但无激活版本 |
属预期行为;需运维发布配置 |
make code-check |
全仓库静态检查 |
阶段 5 待跑通 |
7. 下一步行动指南
- 确认环境:
cd Wavelet && go build ./... && go test ./internal/apps/openflare/... -count=1
- 跑质量门禁:
make code-check
- 实现 B5-3:
Wavelet/support-files/migration/ ETL 脚本
- API 回归:对照实现计划 §12 端点表逐项验证
- 联调验证:
Wavelet/frontend 登录 → 创建规则 → 发布并激活 config version → Agent 心跳 → 检查节点状态
8. 参考文档