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"`
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
View File
@@ -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 置换 + 发布前可预览变更
```
+21 -12
View File
@@ -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
View File
@@ -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 检查项