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