mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-12 18:26:36 +08:00
feat: Update development guidelines and plan for ATSFlare V2
- Revised development guidelines to include new features for V2, such as Agent management and automatic discovery. - Expanded the data model to support agent tokens and discovery tokens. - Updated the development plan to reflect changes in Agent management, including CRUD operations and token replacement. - Enhanced the requirements for the second phase of development, focusing on security improvements and user experience.
This commit is contained in:
@@ -7,6 +7,8 @@ type Node struct {
|
||||
NodeID string `json:"node_id" gorm:"uniqueIndex;size:64;not null"`
|
||||
Name string `json:"name" gorm:"size:128;not null"`
|
||||
IP string `json:"ip" gorm:"size:64;not null"`
|
||||
AgentToken string `json:"-" gorm:"size:128;uniqueIndex"`
|
||||
DiscoveryToken string `json:"-" gorm:"size:128;uniqueIndex"`
|
||||
AgentVersion string `json:"agent_version" gorm:"size:64;not null"`
|
||||
NginxVersion string `json:"nginx_version" gorm:"size:64"`
|
||||
Status string `json:"status" gorm:"size:16;not null;default:'offline'"`
|
||||
@@ -27,3 +29,33 @@ func GetNodeByNodeID(nodeID string) (*Node, error) {
|
||||
err := DB.Where("node_id = ?", nodeID).First(node).Error
|
||||
return node, err
|
||||
}
|
||||
|
||||
func GetNodeByID(id uint) (*Node, error) {
|
||||
node := &Node{}
|
||||
err := DB.First(node, id).Error
|
||||
return node, err
|
||||
}
|
||||
|
||||
func GetNodeByAgentToken(token string) (*Node, error) {
|
||||
node := &Node{}
|
||||
err := DB.Where("agent_token = ?", token).First(node).Error
|
||||
return node, err
|
||||
}
|
||||
|
||||
func GetNodeByDiscoveryToken(token string) (*Node, error) {
|
||||
node := &Node{}
|
||||
err := DB.Where("discovery_token = ?", token).First(node).Error
|
||||
return node, err
|
||||
}
|
||||
|
||||
func (node *Node) Insert() error {
|
||||
return DB.Create(node).Error
|
||||
}
|
||||
|
||||
func (node *Node) Update() error {
|
||||
return DB.Save(node).Error
|
||||
}
|
||||
|
||||
func (node *Node) Delete() error {
|
||||
return DB.Delete(node).Error
|
||||
}
|
||||
|
||||
+37
-32
@@ -57,12 +57,13 @@
|
||||
* 控制面新增证书管理与域名管理页面
|
||||
* 在反代规则编辑时,输入域名后自动匹配可用证书(包含通配符匹配)
|
||||
|
||||
**2.5.3 Agent Token 管理**
|
||||
**2.5.3 Agent 管理与自动发现**
|
||||
|
||||
* 新增 `agent_tokens` 表:支持创建多个命名 Token,记录备注、创建人、过期时间
|
||||
* 认证中间件改为查表验证,不再依赖单个全局环境变量
|
||||
* 提供 Token CRUD 管理 API 及前端页面
|
||||
* 旧的全局 Token 环境变量作为引导 Token,仅在数据库无 Token 记录时生效(bootstrap 模式)
|
||||
* 管理端支持手工创建节点、编辑节点名、删除节点
|
||||
* `nodes` 表增加 Agent 鉴权 Token 与自动发现 Token 字段
|
||||
* 首次接入不再依赖全局环境变量 Token,而是依赖管理端为节点生成的自动发现 Token
|
||||
* Agent 首次注册成功后,Server 下发节点专属 Agent Token,Agent 本地完成 Token 置换
|
||||
* Agent 默认自动探测主机名与 IP,也允许通过配置覆盖
|
||||
|
||||
**2.5.4 路由增强**
|
||||
|
||||
@@ -284,20 +285,20 @@ Agent 使用 Go 单体程序:
|
||||
* `created_at`
|
||||
* `updated_at`
|
||||
|
||||
### 5.7 agent_tokens(第二版新增)
|
||||
### 5.7 nodes(第二版扩展)
|
||||
|
||||
Agent Token 管理表,替代全局单一 Token。
|
||||
节点表在第二版增加节点管理与自动发现字段。
|
||||
|
||||
建议字段:
|
||||
新增字段建议:
|
||||
|
||||
* `id`
|
||||
* `token` — Token 值,唯一,不可变
|
||||
* `name` — Token 备注名称
|
||||
* `created_by` — 创建人
|
||||
* `expires_at` — 过期时间(nullable,null 表示永不过期)
|
||||
* `is_active` — 是否有效
|
||||
* `created_at`
|
||||
* `updated_at`
|
||||
* `agent_token` — 节点专属 Agent Token,用于注册完成后的正式鉴权
|
||||
* `discovery_token` — 自动发现 Token,仅用于首次接入
|
||||
|
||||
约束:
|
||||
|
||||
* `agent_token` 与 `discovery_token` 都应为随机生成值
|
||||
* `discovery_token` 仅用于首次接入,注册成功后应失效或清空
|
||||
* 删除节点后,该节点关联的 Token 必须立即失效
|
||||
|
||||
---
|
||||
|
||||
@@ -553,8 +554,9 @@ Agent(第一版):
|
||||
|
||||
Agent(第二版):
|
||||
|
||||
* Token 改为查 `agent_tokens` 表验证
|
||||
* 环境变量 Token 仅作 bootstrap 引导 Token,数据库有记录时不再使用
|
||||
* Agent 正式鉴权改为查 `nodes.agent_token`
|
||||
* 首次注册使用 `nodes.discovery_token`
|
||||
* 不再依赖全局环境变量 Agent Token
|
||||
* 后续可升级 mTLS
|
||||
|
||||
---
|
||||
@@ -620,19 +622,23 @@ Agent(第二版):
|
||||
* 错误信息
|
||||
* 时间
|
||||
|
||||
### 12.6 Token 管理页(第二版新增)
|
||||
### 12.6 节点管理页(第二版增强)
|
||||
|
||||
展示:
|
||||
|
||||
* Token 名称
|
||||
* 创建人
|
||||
* 过期时间
|
||||
* 是否有效
|
||||
* 节点名
|
||||
* Node ID
|
||||
* 自动发现 Token(仅待接入节点展示)
|
||||
* 在线状态
|
||||
* 当前版本
|
||||
* 最后心跳时间
|
||||
* 最近错误
|
||||
|
||||
动作:
|
||||
|
||||
* 创建 Token
|
||||
* 撤销 Token
|
||||
* 创建节点
|
||||
* 编辑节点名
|
||||
* 删除节点
|
||||
|
||||
### 12.7 证书管理页(第二版新增)
|
||||
|
||||
@@ -697,18 +703,17 @@ atsf_server/
|
||||
controller/
|
||||
tls_certificate.go # 证书管理
|
||||
managed_domain.go # 域名管理
|
||||
agent_token.go # Token 管理
|
||||
node.go # 节点管理
|
||||
model/
|
||||
tls_certificate.go # TLSCertificate 模型
|
||||
managed_domain.go # ManagedDomain 模型
|
||||
agent_token.go # AgentToken 模型
|
||||
service/
|
||||
tls_certificate.go # 证书导入与匹配逻辑
|
||||
managed_domain.go # 域名管理逻辑
|
||||
agent_token.go # Token 创建与验证
|
||||
node.go # 节点管理与自动发现逻辑
|
||||
renderer.go # 抽离渲染逻辑(HTTPS 支持扩展)
|
||||
middleware/
|
||||
agent-auth.go # 改为查表验证
|
||||
agent-auth.go # 改为查节点专属 Token 验证
|
||||
```
|
||||
|
||||
### Agent(第一版,已实现)
|
||||
@@ -751,7 +756,7 @@ atsf_agent/
|
||||
|
||||
1. HTTPS/TLS 支持(ProxyRoute 扩展字段 + 渲染器 + 前端表单)
|
||||
2. 域名管理与证书托管(managed_domains/tls_certificates + 证书导入 + 自动匹配)
|
||||
3. Agent Token 管理(agent_tokens 表 + 中间件改造 + 前端 Token 管理页)
|
||||
3. Agent 管理(节点 CRUD + discovery token + 节点专属 agent token)
|
||||
4. 路由增强(custom_headers 字段 + 渲染器注入 + 前端表单)
|
||||
5. 配置预览与变更摘要(preview 接口 + diff 接口 + 前端发布确认弹窗)
|
||||
|
||||
@@ -779,12 +784,12 @@ atsf_agent/
|
||||
|
||||
* HTTPS 支持由控制面托管证书,但只支持导入,不做自动签发与自动续期
|
||||
* 第二版不做节点分组,所有节点继续消费同一份激活版本
|
||||
* Token 管理不做细粒度权限(如只读 Token),第二版所有 Token 权限一致
|
||||
* 节点专属 Token 不做额外权限分级,第二版仅区分 discovery token 与 agent token 两种用途
|
||||
* 路由自定义头不做模板变量,只支持静态 key-value,避免过早引入 DSL
|
||||
* 配置预览只展示渲染结果,不实际验证 Nginx 语法,真实校验仍由 Agent 完成
|
||||
|
||||
第二版成功标准:
|
||||
|
||||
```text
|
||||
HTTPS 路由可生效 + 控制面可托管证书并按域名自动匹配(含通配符)+ Token 可在界面管理 + 发布前可预览变更
|
||||
HTTPS 路由可生效 + 控制面可托管证书并按域名自动匹配(含通配符)+ 节点可通过 discovery token 自动接入并完成 token 置换 + 发布前可预览变更
|
||||
```
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* HTTPS/TLS 路由支持
|
||||
* 证书托管(手动导入与文件导入)
|
||||
* 域名管理与证书自动匹配(支持 `*.example.com`)
|
||||
* Agent Token 管理
|
||||
* Agent 管理与自动发现
|
||||
* 路由自定义请求头
|
||||
* 配置预览与变更摘要
|
||||
|
||||
@@ -141,7 +141,10 @@ Agent 放在 `atsf_agent`,使用 Go 单体程序开发。
|
||||
|
||||
* `tls_certificates` — 证书托管
|
||||
* `managed_domains` — 域名管理与证书绑定
|
||||
* `agent_tokens` — Agent Token 管理
|
||||
|
||||
第二版扩展实体:
|
||||
|
||||
* `nodes` — 增加 `agent_token`、`discovery_token`,用于节点管理与自动发现
|
||||
|
||||
约束(全版本):
|
||||
|
||||
@@ -150,8 +153,9 @@ Agent 放在 `atsf_agent`,使用 Go 单体程序开发。
|
||||
* `config_versions` 必须保存完整快照和渲染后的 Nginx 路由配置
|
||||
* 激活版本全局只能有一个,不引入分组维度
|
||||
* 回滚通过"激活旧版本"实现,不直接修改历史记录
|
||||
* `agent_tokens` 中的 Token 值不可更新,只能创建或撤销
|
||||
* 域名到证书匹配必须支持精确匹配和通配符匹配(如 `*.example.com`)
|
||||
* `nodes.discovery_token` 仅用于首次接入,接入成功后必须失效
|
||||
* 删除节点必须立即使该节点凭证失效
|
||||
|
||||
如需新增表,必须先证明它服务于当前迭代版本的主链路。
|
||||
|
||||
@@ -210,10 +214,10 @@ Agent(第一版):
|
||||
|
||||
Agent(第二版):
|
||||
|
||||
* Token 改为查 `agent_tokens` 表验证
|
||||
* 环境变量 Token 降级为 bootstrap 模式:数据库存在有效 Token 记录时,环境变量 Token 不再有效
|
||||
* Token 创建时生成随机值,不允许外部传入
|
||||
* Token 值不可更新,仅支持撤销(设 `is_active=false`)
|
||||
* 首次接入使用 `discovery_token`
|
||||
* 注册成功后下发节点专属 `agent_token`
|
||||
* 后续请求改为查 `nodes.agent_token` 验证
|
||||
* 不再依赖全局环境变量 Agent Token
|
||||
|
||||
注意:
|
||||
|
||||
@@ -284,6 +288,8 @@ atsf_agent/
|
||||
Agent 必须满足以下行为:
|
||||
|
||||
* 启动后生成或读取本地 `node_id`
|
||||
* 未显式配置 `node_name` 时自动获取主机名
|
||||
* 未显式配置 `node_ip` 时自动获取本机 IP
|
||||
* 周期性心跳
|
||||
* 周期性检查激活版本
|
||||
* 发现新版本后先备份旧文件
|
||||
@@ -296,6 +302,7 @@ Agent 必须满足以下行为:
|
||||
* 未配置 `nginx_path` 时自动准备并使用 Docker Nginx 容器
|
||||
* 启动时先校验本地路由文件 checksum 与控制面激活版本是否一致
|
||||
* Docker 模式启动时应重建容器,而不是继续复用异常停止的旧容器
|
||||
* 若本地 `agent_token` 为空且配置了 `discovery_token`,则应自动发起首次注册并完成 Token 置换
|
||||
|
||||
### 7.3 容错规范
|
||||
|
||||
@@ -393,9 +400,11 @@ Server 新增覆盖:
|
||||
* 证书导入逻辑(手动导入、文件导入)和 PEM 校验逻辑
|
||||
* 域名证书匹配逻辑(精确匹配与 `*.example.com` 通配符匹配)
|
||||
* `custom_headers` 注入到渲染结果的正确性
|
||||
* `agent_tokens` 创建与查表验证逻辑
|
||||
* Token 撤销后验证失败
|
||||
* bootstrap Token 降级行为(数据库有 Token 时环境变量 Token 失效)
|
||||
* 节点创建、编辑、删除逻辑
|
||||
* `discovery_token` 首次接入成功后失效
|
||||
* 删除节点后 Agent 请求立即返回 401
|
||||
* Agent 自动探测主机名与 IP,且允许配置覆盖
|
||||
* Agent 首次注册成功后完成本地 token 置换
|
||||
* 预览接口不写库
|
||||
* diff 接口变更摘要计算正确性
|
||||
|
||||
@@ -413,8 +422,8 @@ Server 新增覆盖:
|
||||
1. 创建含 HTTPS 字段的路由并发布,Nginx 能以 HTTPS 正确转发
|
||||
2. 控制面可手动导入和文件导入证书,导入后可被路由选择
|
||||
3. 反代规则输入域名后可自动匹配证书,且支持 `*.example.com`
|
||||
4. 通过管理界面创建 Token,Agent 使用新 Token 成功访问
|
||||
5. 撤销 Token 后 Agent 请求返回 401
|
||||
4. 通过管理界面创建节点并生成 discovery token,Agent 使用 discovery token 成功接入
|
||||
5. 删除节点后 Agent 请求返回 401
|
||||
6. 路由配置自定义头后,渲染结果包含对应指令
|
||||
7. 发布页预览展示正确渲染结果
|
||||
8. 变更摘要正确列出域名变化
|
||||
|
||||
+20
-16
@@ -111,27 +111,30 @@ MVP 已于第一版完成。当前进入第二版迭代。
|
||||
* 通配符证书可匹配子域名(如 `api.example.com` 匹配 `*.example.com`)
|
||||
* 无匹配证书时前端给出明确提示
|
||||
|
||||
### V2 Phase 3: Agent Token 管理
|
||||
### V2 Phase 3: Agent 管理
|
||||
|
||||
目标:
|
||||
|
||||
* 支持多个命名 Token
|
||||
* Token 可通过管理界面创建和撤销
|
||||
* 中间件改为查库验证
|
||||
* 实现对节点的增删改查
|
||||
* 实现节点自动发现机制
|
||||
|
||||
|
||||
交付:
|
||||
|
||||
* `agent_tokens` 表与模型
|
||||
* agent-auth 中间件改造(查表验证)
|
||||
* 全局 Token 环境变量降级为 bootstrap 模式
|
||||
* Token CRUD API
|
||||
* 前端 Token 管理页
|
||||
* 移除全局 Token 环境变量, 节点不再通过该方式连接server
|
||||
* 引入自动发现TOKEN, 需要用户手动在节点页创建, 持有该TOKEN的节点会自动连接到SERVER
|
||||
* Node CRUD API
|
||||
* 前端 节点 管理页
|
||||
|
||||
完成标准:
|
||||
|
||||
* 新建 Token 后 Agent 可用该 Token 访问 Agent API
|
||||
* 撤销 Token 后 Agent 请求立即返回 401
|
||||
* 全局环境变量 Token 仅在数据库无有效记录时生效
|
||||
* 用户启动server后需要手动在节点页添加节点, 此时会生成随机TOKEN, 持有该TOKEN的节点可以加入server. server可以修改节点的名称
|
||||
* 用户可以编辑节点, 包括节点名
|
||||
* 删除节点后 Agent 请求立即返回 401
|
||||
* 节点配置文件不再要求填写节点名和IP地址, 节点名默认从主机名获取, IP也是自动获取. 手动指定则为覆盖
|
||||
* 节点配置文件agent_token为空, 自动发现TOKEN配置为server生成值后, 会自己向server注册, 注册后会进行TOKEN置换, 更新节点配置文件agent_token
|
||||
|
||||
|
||||
### V2 Phase 4: 路由自定义头
|
||||
|
||||
@@ -175,7 +178,7 @@ MVP 已于第一版完成。当前进入第二版迭代。
|
||||
|
||||
1. HTTPS/TLS 支持(对现有渲染链路影响最小,独立可测)
|
||||
2. 域名管理与证书自动匹配(与 HTTPS 强相关,尽早完成闭环)
|
||||
3. Agent Token 管理(安全性改善,早做早稳)
|
||||
3. Agent 管理(节点 CRUD + 自动发现 + token 置换)
|
||||
4. 路由自定义头(纯增量,对现有结构影响小)
|
||||
5. 配置预览与变更摘要(纯只读接口,最后补充)
|
||||
|
||||
@@ -205,10 +208,11 @@ MVP 已于第一版完成。当前进入第二版迭代。
|
||||
|
||||
### V2 Phase 3 检查项
|
||||
|
||||
* 可通过管理界面创建 Token
|
||||
* 新 Token 可被 Agent 使用
|
||||
* 撤销 Token 后访问立即失败
|
||||
* 全局 Token 环境变量在数据库有记录时失效
|
||||
* 可通过管理界面创建节点并生成 discovery token
|
||||
* Agent 可使用 discovery token 自动接入并完成 agent token 置换
|
||||
* 用户可编辑节点名并删除节点
|
||||
* 删除节点后 Agent 请求立即失败
|
||||
* Agent 在未显式配置节点名/IP 时可自动探测
|
||||
|
||||
### V2 Phase 4 检查项
|
||||
|
||||
|
||||
Reference in New Issue
Block a user