Merge pull request #1 from Rain-kl/copilot/plan-v2-development-schedule

docs: plan ATSFlare V2 development
This commit is contained in:
Rain
2026-03-10 09:06:24 +08:00
committed by GitHub
3 changed files with 465 additions and 188 deletions
+251 -74
View File
@@ -12,9 +12,9 @@
---
## 2. 第一版范围
## 2. 第一版范围(已完成)
### 要做
### 已做
* Web 管理端维护反代规则
* 配置发布生成版本
@@ -23,7 +23,7 @@
* 节点注册、心跳、在线状态展示
* 展示每个节点当前生效版本和最近一次应用结果
### 不做
### 不做(第一版)
* 多租户
* WAF、限流、Bot、防刷
@@ -38,6 +38,56 @@
---
## 2.5 第二版范围
在 MVP 闭环稳定运行的基础上,第二版聚焦以下增量能力。
### 要做
**2.5.1 HTTPS/TLS 支持**
* `proxy_routes` 增加 HTTPS 相关字段:`enable_https`、`ssl_cert_path`、`ssl_key_path`
* 渲染器根据字段生成 HTTPS `server` 块(443 端口),并可选生成 HTTP → HTTPS 重定向块
* 证书文件仍由节点本地预先准备,控制面只记录路径,不托管证书
**2.5.2 节点分组与差异化下发**
* 新增 `node_groups` 表:管理分组(如 staging、production)
* `nodes` 增加 `group_id` 字段,节点可归属某个分组
* 发布时可选择目标分组,生成面向该分组的版本
* 不指定分组时,默认行为与第一版相同(全量下发)
* Agent 在心跳时携带自身分组信息,Server 按分组返回对应激活版本
**2.5.3 Agent Token 管理**
* 新增 `agent_tokens` 表:支持创建多个命名 Token,记录备注、创建人、过期时间
* 认证中间件改为查表验证,不再依赖单个全局环境变量
* 提供 Token CRUD 管理 API 及前端页面
* 旧的全局 Token 环境变量作为引导 Token,仅在数据库无 Token 记录时生效(bootstrap 模式)
**2.5.4 路由增强**
* `proxy_routes` 增加 `custom_headers` 字段(JSON 格式),支持每条路由追加自定义 `proxy_set_header` 指令
* 渲染器按 `custom_headers` 内容注入到对应 `server` 块
**2.5.5 配置预览与变更摘要**
* 新增"配置预览"接口:在不实际发布的情况下,返回基于当前启用规则渲染的 Nginx 配置
* 新增"变更摘要"接口:对比当前激活版本与新渲染结果,返回新增、删除、修改的域名列表
* 前端发布页接入预览与变更摘要,让管理员在点击发布前确认变化
### 仍不做(第二版)
* 多租户
* WAF、限流、Bot、防刷
* 对象存储、消息队列、Redis、Prometheus
* 证书托管与自动签发
* Purge、中台审计、审批流
* mid-tier / 分层缓存
* 复杂缓存策略配置
---
## 3. 技术约束
### Server
@@ -120,9 +170,7 @@ Agent 使用 Go 单体程序:
## 5. 核心对象
第一版只保留最少的数据模型。
### 5.1 proxy_routes
### 5.1 proxy_routes(第一版)
反代规则表,控制 `Host -> Origin` 映射。
@@ -142,7 +190,15 @@ Agent 使用 Go 单体程序:
* `origin_url` 必须是合法的 `http://` 或 `https://`
* 第一版一条域名只对应一个源站,不做源站池
### 5.2 config_versions
第二版新增字段:
* `enable_https` — 是否启用 HTTPS(bool,默认 false)
* `ssl_cert_path` — 节点本地证书文件路径(string)
* `ssl_key_path` — 节点本地私钥文件路径(string)
* `redirect_http` — 是否将 HTTP 重定向到 HTTPS(bool,默认 false)
* `custom_headers` — 自定义 `proxy_set_header` 指令(JSON 格式,存字符串)
### 5.2 config_versions(第一版)
发布版本表,保存不可变快照。
@@ -163,7 +219,11 @@ Agent 使用 Go 单体程序:
* `rendered_config` 保存渲染后的 Nginx 路由配置
* 第一版直接存 SQLite,不单独上对象存储
### 5.3 nodes
第二版新增字段:
* `group_id` — 关联目标分组(nullable,null 表示全量发布)
### 5.3 nodes(第一版)
节点表,保存当前状态。
@@ -182,7 +242,11 @@ Agent 使用 Go 单体程序:
* `created_at`
* `updated_at`
### 5.4 apply_logs
第二版新增字段:
* `group_id` — 所属节点分组(nullable,无分组时为 null)
### 5.4 apply_logs(第一版)
节点应用记录。
@@ -195,6 +259,33 @@ Agent 使用 Go 单体程序:
* `message`
* `created_at`
### 5.5 node_groups(第二版新增)
节点分组表,用于差异化下发。
建议字段:
* `id`
* `name` — 分组名称,唯一(如 `staging`、`production`)
* `remark` — 备注
* `created_at`
* `updated_at`
### 5.6 agent_tokens(第二版新增)
Agent Token 管理表,替代全局单一 Token。
建议字段:
* `id`
* `token` — Token 值,唯一,不可变
* `name` — Token 备注名称
* `created_by` — 创建人
* `expires_at` — 过期时间(nullable,null 表示永不过期)
* `is_active` — 是否有效
* `created_at`
* `updated_at`
---
## 6. 配置发布模型
@@ -399,49 +490,63 @@ Agent 每次上报:
## 11. API 设计
### 11.1 管理端 API
### 11.1 管理端 API(第一版,已实现)
* `GET /api/routes`
* `POST /api/routes`
* `PUT /api/routes/:id`
* `DELETE /api/routes/:id`
* `GET /api/versions`
* `POST /api/versions/publish`
* `POST /api/versions/:id/activate`
* `GET /api/nodes`
* `GET /api/apply-logs`
* `GET /api/proxy-routes/`
* `POST /api/proxy-routes/`
* `PUT /api/proxy-routes/:id`
* `DELETE /api/proxy-routes/:id`
* `GET /api/config-versions/`
* `GET /api/config-versions/active`
* `POST /api/config-versions/publish`
* `PUT /api/config-versions/:id/activate`
* `GET /api/nodes/`
* `GET /api/apply-logs/`
### 11.2 Agent API
### 11.2 Agent API(第一版,已实现)
* `POST /api/agent/register`
* `POST /api/agent/heartbeat`
* `GET /api/agent/version/active`
* `GET /api/agent/versions/:version`
* `POST /api/agent/apply-result`
* `POST /api/agent/nodes/register`
* `POST /api/agent/nodes/heartbeat`
* `GET /api/agent/config-versions/active`
* `POST /api/agent/apply-logs`
### 11.3 鉴权方案
### 11.3 第二版新增管理端 API
* `GET /api/node-groups/` — 分组列表
* `POST /api/node-groups/` — 创建分组
* `PUT /api/node-groups/:id` — 更新分组
* `DELETE /api/node-groups/:id` — 删除分组
* `GET /api/agent-tokens/` — Token 列表
* `POST /api/agent-tokens/` — 创建 Token
* `DELETE /api/agent-tokens/:id` — 撤销 Token
* `GET /api/config-versions/preview` — 预览当前启用规则的渲染结果(不写库)
* `GET /api/config-versions/diff` — 对比当前激活版本与待发布的变更摘要
### 11.4 鉴权方案
管理端:
* 直接沿用 gin-template 的登录态
Agent:
Agent(第一版):
* 第一版使用预共享 Token
* 例如请求头 `X-Agent-Token`
* 后续再升级 mTLS
* 预共享 Token,请求头 `X-Agent-Token`,Token 值来自环境变量
Agent(第二版):
* Token 改为查 `agent_tokens` 表验证
* 环境变量 Token 仅作 bootstrap 引导 Token,数据库有记录时不再使用
* 后续可升级 mTLS
---
## 12. 页面设计
第一版只保留最少页面。
### 12.1 登录页
沿用 gin-template 现有登录。
### 12.2 反代规则页
### 12.2 反代规则页(第一版,已实现)
展示和编辑:
@@ -450,7 +555,15 @@ Agent:
* 是否启用
* 备注
### 12.3 发布版本页
第二版新增字段:
* 是否启用 HTTPS
* SSL 证书路径
* SSL 私钥路径
* 是否 HTTP → HTTPS 重定向
* 自定义请求头(JSON 编辑器)
### 12.3 发布版本页(第一版,已实现)
展示:
@@ -464,7 +577,12 @@ Agent:
* 立即发布
* 激活旧版本
### 12.4 节点页
第二版新增:
* 发布目标分组选择(可选,不选则全量)
* 发布前展示配置预览与变更摘要
### 12.4 节点页(第一版,已实现)
展示:
@@ -475,7 +593,11 @@ Agent:
* 最后心跳时间
* 最近错误
### 12.5 应用记录页
第二版新增:
* 所属分组
### 12.5 应用记录页(第一版,已实现)
展示:
@@ -485,19 +607,45 @@ Agent:
* 错误信息
* 时间
### 12.6 Token 管理页(第二版新增)
展示:
* Token 名称
* 创建人
* 过期时间
* 是否有效
动作:
* 创建 Token
* 撤销 Token
### 12.7 节点分组页(第二版新增)
展示:
* 分组名称
* 备注
* 该分组下节点数
动作:
* 创建分组
* 编辑分组
* 删除分组
---
## 13. 代码组织建议
### Server
建议直接在现有 `atsf_server` 下新增以下内容:
### Server(第一版,已实现)
```text
atsf_server/
controller/
route.go
version.go
proxy_route.go
config_version.go
node.go
agent.go
model/
@@ -508,58 +656,73 @@ atsf_server/
router/
api-router.go
service/
publisher.go
renderer.go
proxy_route.go
config_version.go
agent.go
```
### Agent
### Server(第二版新增)
建议新建独立目录:
```text
atsf_server/
controller/
node_group.go # 节点分组 CRUD
agent_token.go # Token 管理
model/
node_group.go # NodeGroup 模型
agent_token.go # AgentToken 模型
service/
node_group.go # 分组逻辑
agent_token.go # Token 创建与验证
renderer.go # 抽离渲染逻辑(HTTPS 支持扩展)
middleware/
agent-auth.go # 改为查表验证
```
### Agent(第一版,已实现)
```text
atsf_agent/
cmd/agent/main.go
internal/config/config.go
internal/heartbeat/heartbeat.go
internal/sync/sync.go
internal/nginx/nginx.go
internal/heartbeat/service.go
internal/sync/service.go
internal/nginx/manager.go
internal/state/state.go
internal/httpclient/client.go
internal/protocol/agent_api.go
```
### Agent(第二版)
第二版 Agent 无需新增模块,只需在现有模块内扩展:
* `config`: 新增 `group_id` 配置项
* `heartbeat`: 心跳请求中携带 `group_id`
* `sync`: 按分组获取对应激活版本(Server 端路由区分)
---
## 14. 开发顺序
按下面的顺序最稳。
### 第一版(已完成)
### 第一阶段
1. Server 建表、AutoMigrate
2. 反代规则 CRUD 与发布逻辑
3. Agent API 与节点状态表
4. Agent 同步、落盘、reload、回滚
5. 管理端页面
6. 联调和部署文档
先把 Server 跑通:
### 第二版(当前阶段)
* 建表
* 反代规则 CRUD
* 发布版本表
* 版本渲染逻辑
按以下顺序执行,前项完成后再推进下一项:
### 第二阶段
做 Agent 最小闭环:
* 注册
* 心跳
* 拉取激活版本
* 写入 Nginx 路由配置
* `nginx -t && nginx -s reload`
* 应用结果上报
### 第三阶段
补管理端页面:
* 规则页
* 版本页
* 节点页
* 应用日志页
1. HTTPS/TLS 支持(ProxyRoute 扩展字段 + 渲染器 + 前端表单)
2. Agent Token 管理(agent_tokens 表 + 中间件改造 + 前端 Token 管理页)
3. 节点分组与差异化下发(node_groups 表 + 发布分组逻辑 + Agent 携带 group_id)
4. 路由增强(custom_headers 字段 + 渲染器注入 + 前端表单)
5. 配置预览与变更摘要(preview 接口 + diff 接口 + 前端发布确认弹窗)
---
@@ -580,3 +743,17 @@ atsf_agent/
```
这就是当前阶段最需要的 MVP。
### 第二版取舍
* HTTPS 支持不托管证书,只记录本地路径,避免引入证书存储和签发复杂度
* 节点分组不做跨分组继承,每个分组独立一套激活版本,降低理解负担
* Token 管理不做细粒度权限(如只读 Token),第二版所有 Token 权限一致
* 路由自定义头不做模板变量,只支持静态 key-value,避免过早引入 DSL
* 配置预览只展示渲染结果,不实际验证 Nginx 语法,真实校验仍由 Agent 完成
第二版成功标准:
```text
HTTPS 路由可生效 + 节点可按分组差异化下发 + Token 可在界面管理 + 发布前可预览变更
```
+62 -18
View File
@@ -2,19 +2,27 @@
## 1. 适用范围
本规范适用于 ATSFlare 当前 MVP 阶段。
本规范适用于 ATSFlare 第一版与第二版阶段。
项目当前只做以下能力:
项目第一版已完成以下能力:
* 配置发布与同步
* 节点心跳检测
* Nginx 反向代理配置下发
当前明确不做:
第二版在此基础上新增以下能力:
* HTTPS/TLS 路由支持
* Agent Token 管理
* 节点分组与差异化下发
* 路由自定义请求头
* 配置预览与变更摘要
当前明确仍不做:
* 多租户
* WAF、限流、Bot、防刷
* 灰度发布、分组发布、百分比发布
* 百分比灰度发布
* Redis、MQ、对象存储、Prometheus
* 复杂缓存策略、证书托管、Purge、审批流
* mid-tier、分层缓存、复杂策略编排
@@ -107,32 +115,38 @@ Agent 放在 `atsf_agent`,使用 Go 单体程序开发。
所有实现都必须遵守以下原则:
* 先完成闭环,再做抽象。
* 不为了“以后可能会支持”提前引入复杂模型。
* 不为了"以后可能会支持"提前引入复杂模型。
* Server 只管状态和配置,不直接 SSH 改节点。
* Agent 是唯一落地入口。
* 所有发布都是“新版本激活”,不是在线覆盖编辑。
* 所有节点默认拉同一份全量配置,不做差异化编排。
* 所有发布都是"新版本激活",不是在线覆盖编辑。
* 第一版:所有节点默认拉同一份全量配置;第二版:可按节点分组差异化下发。
* 能用 SQLite 解决的问题,不引入额外中间件。
* 新功能优先复用现有 gin-template 结构,不平行造第二套框架。
## 5. 数据模型规范
第一版只允许引入以下核心实体:
第一版核心实体(已实现):
* `proxy_routes`
* `config_versions`
* `nodes`
* `apply_logs`
约束:
第二版新增实体:
* `node_groups` — 节点分组
* `agent_tokens` — Agent Token 管理
约束(全版本):
* 不新增 `zone`、`origin_pool`、`policy`、`deployment` 这类平台化对象
* `proxy_routes` 一条域名只对应一个 `origin_url`
* `config_versions` 必须保存完整快照和渲染后的 Nginx 路由配置
* 激活版本全局只能有一个
* 回滚通过“激活旧版本”实现,不直接修改历史记录
* 同一分组内激活版本只能有一个;全量版本(group_id = null)全局只能有一个
* 回滚通过"激活旧版本"实现,不直接修改历史记录
* `agent_tokens` 中的 Token 值不可更新,只能创建或撤销
如需新增表,必须先证明它服务于 MVP 主链路。
如需新增表,必须先证明它服务于当前迭代版本的主链路。
## 6. Server 开发规范
@@ -181,12 +195,19 @@ Server 代码按以下职责拆分:
* 继续复用 gin-template 的登录、角色和 session 体系
Agent:
Agent(第一版):
* 第一版使用预共享 Token
* 预共享单 Token,来自环境变量
* 请求头统一使用 `X-Agent-Token`
* Agent 与管理端认证逻辑必须分开
Agent(第二版):
* Token 改为查 `agent_tokens` 表验证
* 环境变量 Token 降级为 bootstrap 模式:数据库存在有效 Token 记录时,环境变量 Token 不再有效
* Token 创建时生成随机值,不允许外部传入
* Token 值不可更新,仅支持撤销(设 `is_active=false`)
注意:
* 不要让 Agent 接口走用户登录态
@@ -339,7 +360,7 @@ MVP 前端只做最小管理界面,不重做整套后台。
## 10. 测试与验收规范
### 10.1 最低测试要求
### 10.1 第一版最低测试要求(已完成)
Server 至少覆盖:
@@ -356,9 +377,21 @@ Agent 至少覆盖:
* `nginx -t` 或 `nginx -s reload` 失败分支
* 本地状态文件读写
### 10.2 联调验收标准
### 10.2 第二版新增测试要求
MVP 完成至少要通过以下手工验证:
Server 新增覆盖:
* HTTPS server 块渲染正确性(`enable_https=true` 时生成 443 块,`redirect_http=true` 时生成重定向块)
* HTTP-only 路由渲染结果不受 HTTPS 字段影响
* `custom_headers` 注入到渲染结果的正确性
* `agent_tokens` 创建与查表验证逻辑
* Token 撤销后验证失败
* bootstrap Token 降级行为(数据库有 Token 时环境变量 Token 失效)
* 分组发布逻辑(group_id 筛选激活版本)
* 预览接口不写库
* diff 接口变更摘要计算正确性
### 10.3 联调验收标准(第一版,已完成)
1. 管理端新增反代规则并成功发布版本
2. Agent 能检测到新版本并拉取
@@ -367,15 +400,26 @@ MVP 完成至少要通过以下手工验证:
5. 节点页能看到当前版本和最后心跳
6. 当 reload 失败时,Agent 能回滚到旧配置并上报失败
### 10.4 联调验收标准(第二版)
1. 创建含 HTTPS 字段的路由并发布,Nginx 能以 HTTPS 正确转发
2. 通过管理界面创建 Token,Agent 使用新 Token 成功访问
3. 撤销 Token 后 Agent 请求返回 401
4. 创建分组并按分组发布,不同分组节点拉到不同版本
5. 路由配置自定义头后,渲染结果包含对应指令
6. 发布页预览展示正确渲染结果
7. 变更摘要正确列出域名变化
## 11. 文档维护规范
出现以下情况时必须同步更新文档:
* MVP 范围变化
* 产品版本范围变化(V1 → V2 → V3)
* API 发生破坏性变更
* 数据模型新增或删除
* Agent 本地文件路径变更
* 部署方式变化
* 新增或撤销对中间件/基础设施的依赖
优先更新:
+152 -96
View File
@@ -8,56 +8,31 @@
后台改规则 -> 点击发布 -> Agent 拉到新版本 -> 写入 Nginx 路由配置 -> nginx 校验并 reload -> 节点状态可见
```
在这个闭环完成之前,不新增高级功能。
MVP 已于第一版完成。当前进入第二版迭代。
## 2. 里程碑
## 2. 第一版里程碑(已完成)
### Phase 1: Server 数据层与发布闭环
目标:
* 完成 `proxy_routes`
* 完成 `config_versions`
* 能从规则生成 Nginx 路由配置
* 能激活一个全局版本
### Phase 1: Server 数据层与发布闭环 ✅
交付:
* 新模型
* 新模型(proxy_routes、config_versions)
* AutoMigrate
* 路由 CRUD API
* 发布 API
* 激活版本 API
* 渲染 service
完成标准:
* 后台能维护规则
* 可以生成并查看版本记录
### Phase 2: Agent API 与节点状态
目标:
* 建立节点注册、心跳、版本查询、应用结果上报链路
### Phase 2: Agent API 与节点状态 ✅
交付:
* `nodes`
* `apply_logs`
* Agent Token 鉴权
* `nodes`、`apply_logs`
* Agent Token 鉴权(全局单 Token)
* 节点在线状态计算
* 节点与应用日志查询接口
完成标准:
* Server 能记录节点和最近状态
### Phase 3: Agent 本体
目标:
* 实现最小可运行 Agent
### Phase 3: Agent 本体 ✅
交付:
@@ -70,15 +45,7 @@
* 配置校验、reload 与失败回滚
* 应用结果上报
完成标准:
* 单节点可跑通“发布到 Nginx 生效”的闭环
### Phase 4: 管理端页面
目标:
* 提供 MVP 所需最小可视化界面
### Phase 4: 管理端页面 ✅
交付:
@@ -87,91 +54,180 @@
* 节点页
* 应用记录页
完成标准:
* 不依赖直接查库即可完成日常操作和排障
### Phase 5: 联调与收尾
目标:
* 完成本地或测试环境联调
* 补齐运行说明
### Phase 5: 联调与收尾 ✅
交付:
* 手工部署说明
* Agent 配置示例
* 最小联调脚本或命令说明
* 问题清单与后续迭代列表
* 联调验证记录
## 3. 第二版里程碑
### V2 Phase 1: HTTPS/TLS 支持
目标:
* 支持通过控制面配置 HTTPS 路由
* 渲染出包含 443 端口的 `server` 块
* 支持 HTTP → HTTPS 重定向块
交付:
* `proxy_routes` 新增字段:`enable_https`、`ssl_cert_path`、`ssl_key_path`、`redirect_http`
* 渲染器支持 HTTPS server 块生成
* 前端反代规则页增加 HTTPS 配置表单
* AutoMigrate 覆盖新字段
完成标准:
* 新环境能按文档手工部署并跑通最小闭环
* 创建含 HTTPS 字段的路由并发布,Agent 拉取后 Nginx 能以 HTTPS 正确转发
* HTTP 重定向配置生效
* 未开启 HTTPS 的路由渲染行为与第一版保持一致
## 3. 当前建议执行顺序
### V2 Phase 2: Agent Token 管理
目标:
* 支持多个命名 Token
* Token 可通过管理界面创建和撤销
* 中间件改为查库验证
交付:
* `agent_tokens` 表与模型
* agent-auth 中间件改造(查表验证)
* 全局 Token 环境变量降级为 bootstrap 模式
* Token CRUD API
* 前端 Token 管理页
完成标准:
* 新建 Token 后 Agent 可用该 Token 访问 Agent API
* 撤销 Token 后 Agent 请求立即返回 401
* 全局环境变量 Token 仅在数据库无有效记录时生效
### V2 Phase 3: 节点分组与差异化下发
目标:
* 节点可按分组管理
* 发布时可选择目标分组,生成分组专属版本
* Agent 按分组拉取对应激活版本
交付:
* `node_groups` 表与模型
* `nodes` 新增 `group_id` 字段
* `config_versions` 新增 `group_id` 字段(nullable,null 表示全量)
* 发布 API 接受可选 `group_id` 参数
* Agent API 按节点分组返回对应激活版本
* Agent `agent.json` 新增 `group_id` 配置项
* 前端节点分组管理页与节点页分组字段
完成标准:
* 同一系统内 staging 和 production 分组各有独立激活版本
* staging 节点拉取 staging 版本,production 节点拉取 production 版本
* 不属于任何分组的节点拉取全量(group_id = null)版本
### V2 Phase 4: 路由自定义头
目标:
* 每条路由支持追加自定义 `proxy_set_header` 指令
交付:
* `proxy_routes` 新增 `custom_headers` 字段(JSON,`[{"key":"X-My-Header","value":"foo"}]`)
* 渲染器按 `custom_headers` 在 `location /` 块中注入额外 header 指令
* 前端反代规则页增加自定义头编辑器
完成标准:
* 路由配置自定义头后发布,渲染结果包含对应 `proxy_set_header` 指令
* 不配置自定义头的路由渲染行为与之前保持一致
### V2 Phase 5: 配置预览与变更摘要
目标:
* 发布前可预览渲染结果
* 发布前可查看与当前激活版本的变更摘要
交付:
* `GET /api/config-versions/preview` 接口(返回渲染后的 Nginx 配置,不写库)
* `GET /api/config-versions/diff` 接口(返回新增/删除/修改的域名列表)
* 前端发布版本页增加"预览"按钮和变更摘要展示弹窗
完成标准:
* 点击预览可查看即将生成的 Nginx 配置文本
* 变更摘要正确列出相对于当前激活版本的域名变化
* 预览和 diff 操作不产生版本记录
## 4. 第二版建议执行顺序
建议严格按以下顺序开发:
1. Server 模型和 `AutoMigrate`
2. 路由 CRUD 与发布逻辑
3. Agent API 与节点状态表
4. Agent 同步、落盘、reload、回滚
5. 管理端页面
6. 联调和部署文档
1. HTTPS/TLS 支持(对现有渲染链路影响最小,独立可测)
2. Agent Token 管理(安全性改善,早做早稳)
3. 节点分组(数据模型扩展,影响面最广,需要 Agent 配合)
4. 路由自定义头(纯增量,对现有结构影响小)
5. 配置预览与变更摘要(纯只读接口,最后补充)
不要先做以下内容:
* 权限扩展
* 缓存策略平台化
* 证书平台化
* 多节点分批发布
* 高级监控接入
* 证书托管
* 灰度百分比发布
* WAF、限流
* Redis、Prometheus
* 多租户
## 4. 每阶段的验收检查
## 5. 第二版每阶段验收检查
### Phase 1 检查项
### V2 Phase 1 检查项
* 可以创建、编辑、删除反代规则
* 可以基于当前规则生成版本
* 可以查看哪个版本处于激活状态
* 激活旧版本时不会修改历史快照
* `enable_https=true` 的路由发布后生成 443 端口 server 块
* `redirect_http=true` 的路由生成 80 → 443 重定向块
* 未开启 HTTPS 的路由渲染结果不受影响
* Agent 拉取后 Nginx reload 成功
### Phase 2 检查项
### V2 Phase 2 检查项
* Agent 可以通过 Token 访问 Agent API
* 节点可以注册并重复心跳
* 节点超过超时时间会显示为离线
* 可以查询节点最近一次应用状态
* 可通过管理界面创建 Token
* 新 Token 可被 Agent 使用
* 撤销 Token 后访问立即失败
* 全局 Token 环境变量在数据库有记录时失效
### Phase 3 检查项
### V2 Phase 3 检查项
* Agent 检测到新版本后会下载配置
* 写入前会备份旧路由配置文件
* `nginx -t` 或 reload 失败后会回滚
* 回滚结果会回传给 Server
* Agent 可使用独立 Nginx 路径或 Docker Nginx 容器运行
* 可创建分组并将节点归入分组
* 可发布面向指定分组的版本
* 分组节点只拉取该分组的激活版本
* 无分组节点拉取全量激活版本
### Phase 4 检查项
### V2 Phase 4 检查项
* 页面可直接完成规则维护和发布
* 页面可查看节点在线状态
* 页面可查看应用失败原因
* 路由可添加自定义头
* 渲染结果中正确包含自定义 header 指令
* 无自定义头的路由渲染结果不受影响
### Phase 5 检查项
### V2 Phase 5 检查项
* 按文档可完成一次从零部署
* 至少完成一次真实联调记录
* 已记录当前遗留问题和下一阶段候选项
* 预览接口返回正确的 Nginx 配置文本
* diff 接口返回正确的域名变更列表
* 两个接口均不产生数据库写入
## 5. 变更控制
## 6. 变更控制
开发中如果出现以下情况,需要先调整计划再继续编码:
* MVP 目标发生变化
* 需要引入新的中间件
* V2 目标发生变化
* 需要引入新的中间件(Redis、MQ 等)
* 需要新增核心数据模型
* 需要把控制面扩展到独立生成的 Nginx 路由配置文件之外
* 需要把控制面扩展到 Nginx 全局配置
计划更新时,应同步修改: