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:
ryan
2026-03-10 15:13:28 +08:00
parent e7dc18e6ca
commit 861d759f97
4 changed files with 1322 additions and 1272 deletions
+32
View File
@@ -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
View File
@@ -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 置换 + 发布前可预览变更
``` ```
+21 -12
View File
@@ -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
View File
@@ -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 检查项