Files
OpenFlare/docs/development-guidelines.md
T

309 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ATSFlare 开发规范(V3)
## 1. 适用范围
本规范适用于当前代码基线以及第三版的所有开发工作。
当前系统状态:
* 第一版、第二版功能已完成
* 第三版聚焦运维体验优化
* 超出 `docs/design.md` 当前边界的需求,必须先补设计,再编码
---
## 2. 技术基线
### 2.1 Server
`atsf_server` 继续作为单体控制面:
* Gin
* GORM
* SQLite
* 现有 ATSFlare 登录体系
* 现有 `atsf_server/web` 前端
约束:
* 默认不依赖 Redis
* 默认不依赖 MQ
* 默认不依赖对象存储
* 不为第三版预埋平台化基础设施
### 2.2 Agent
`atsf_agent` 继续作为 Go 单体程序:
* 单二进制
* 本地执行
* `nginx_path` 优先
* 无 `nginx_path` 时默认 Docker Nginx
* 生成资源默认放在 `./data`,由 `data_dir` 统一覆盖
### 2.3 前端
前端改造专项以 `atsf_server/web` 新版工程为基线:
* 使用 Next.js App Router + TypeScript + Tailwind CSS
* 按 [docs/frontend-development-guidelines.md](./frontend-development-guidelines.md) 执行目录分层与组件规范
* 首期仍以静态导出产物交由 Go Server 托管为前提
---
## 3. 分层与目录约束
### 3.1 Server 分层
* `controller/`:参数解析、调用 service、返回响应
* `service/`:业务逻辑、校验、渲染、事务编排
* `model/`:模型定义与持久化
* `router/`:路由注册
* `middleware/`:认证、鉴权、限流等横切逻辑
* `common/`:通用配置与工具
禁止:
* 在 `controller/` 堆积业务逻辑
* 在 `middleware/` 中写业务流程
* 为简单需求新增平台层抽象
### 3.2 Agent 分层
保持现有模块边界:
* `config`
* `heartbeat`
* `sync`
* `nginx`
* `state`
* `httpclient`
* `protocol`
要求:
* 每个模块职责单一
* 外部命令调用集中封装
* 状态落盘与配置落盘保持分离
---
## 4. 数据模型规范
当前有效实体:
* `proxy_routes`
* `config_versions`
* `nodes`
* `apply_logs`
* `tls_certificates`
* `managed_domains`
通用约束:
* 不新增平台化对象,除非第三版设计明确要求
* `proxy_routes` 仍保持一条域名对应一个 `origin_url`
* `config_versions` 必须保存完整快照与渲染结果
* 全局同时只能有一个激活版本
* 回滚通过重新激活旧版本实现
* 域名证书匹配必须同时支持精确匹配与通配符匹配
* 节点专属 `agent_token` 必须可立即失效
新增表或关键字段前,必须先回答两个问题:
1. 是否服务于第三版主链路?
2. 是否能在现有模型上扩展而不是平行造新模型?
---
## 5. API 与鉴权规范
### 5.1 API 约定
* 管理端与 Agent API 统一使用 JSON
* 成功与失败都必须返回清晰 `message`
* 列表接口返回稳定字段
* Agent API 固定放在 `/api/agent/*`
统一响应结构保持现有风格:
```json
{
"success": true,
"message": "",
"data": {}
}
```
### 5.2 鉴权约定
管理端:
* 继续复用 ATSFlare 登录、角色与 session
Agent:
* 正式请求统一使用节点专属 `agent_token`
* 首次接入可使用全局 `discovery_token`
* 请求头统一使用 `X-Agent-Token`
* Agent 认证逻辑不得与用户登录态混用
禁止:
* 将本地 Nginx 操作暴露为远程执行接口
* 在日志中打印完整 Token
---
## 6. 发布与渲染规范
发布逻辑必须保持以下事实:
* 发布时读取全部启用的 `proxy_routes`
* 生成完整 Nginx 配置
* 计算 `checksum`
* 写入 `config_versions`
* 通过切换 `is_active` 激活版本
版本号格式保持:
```text
YYYYMMDD-NNN
```
限制:
* 不做在线改历史版本
* 不做按节点分组的差异化版本
* 预览与 diff 是只读能力,不产生发布记录
---
## 7. Agent 行为规范
Agent 必须满足:
* 启动后读取或生成本地 `node_id`
* 未显式配置 `node_name` 时自动获取主机名
* 未显式配置 `node_ip` 时自动探测本机 IP
* 周期性心跳
* 周期性检查激活版本
* 发现新版本时先备份旧文件
* 写入新路由与必要证书文件
* 先执行 `nginx -t`
* 成功后执行 `nginx -s reload`
* 失败时自动回滚并上报最终结果
* 本地 `agent_token` 为空且存在 `discovery_token` 时,自动注册并完成 Token 置换
容错要求:
* Server 不可用时继续使用旧配置
* 下载失败时不修改本地配置
* 本地状态文件损坏时允许重建,但不能破坏当前生效配置
* Docker 容器异常时,启动阶段应自动重建
V3 新增行为:
* 心跳响应包含 `agent_settings` 时,动态调整定时器间隔
* `auto_update=true` 或 `update_now=true` 时在每次心跳后检查 GitHub Releases 更新
* 自我更新失败不影响心跳与同步
* Server 下发的间隔值不持久化到 `agent.json`,重启后以本地为准
* Agent 新增 `internal/updater` 模块处理自我更新逻辑
---
## 8. 前端开发规范
要求:
* 新前端页面、组件与请求层统一遵循 [docs/frontend-development-guidelines.md](./frontend-development-guidelines.md)
* API 请求统一收敛到 `atsf_server/web/lib/api/`
* 页面路由与布局放在 `app/`,业务逻辑放在 `features/`
* 构建产物必须保持可被 Go Server 静态托管
* 新前端必须支持亮色 / 暗色模式切换,且主题能力不得只停留在局部页面或单个组件
如果第三版要新增页面,优先原则:
* 能复用现有 feature 结构就不平行再造一套页面逻辑
* 能复用统一表单、反馈与布局组件就不在页面中重复实现
---
## 9. 代码风格与日志规范
### 9.1 Go
* 错误必须显式处理
* 函数尽量单一职责
* 输入校验放在边界层
* 业务枚举使用明确常量
* 不写无意义注释
### 9.2 命名
* 统一使用 `route`、`version`、`node`、`agent`
* 不混用 `client`、`edge`、`worker` 指代 Agent
### 9.3 日志
必须覆盖关键事件:
* 发布成功/失败
* Agent 注册
* 心跳异常
* 配置下载失败
* Nginx 校验或 reload 成功/失败
* 回滚触发
要求:
* 日志要足够定位问题
* 不打印敏感凭证完整值
---
## 10. 测试与验收规范
当前基线至少要持续覆盖:
* 路由校验与渲染
* 激活版本切换
* 节点在线状态判定
* 证书导入与匹配
* 自定义请求头渲染
* Agent 同步、回滚、本地状态读写
* 自动注册与 Token 置换
* 预览与 diff 的只读行为
第三版新增需求时:
* 先补单元测试或服务层测试
* 再补联调验证步骤
* 涉及发布链路、Agent 链路、鉴权链路的改动,必须补回归测试
---
## 11. 文档维护规范
出现以下情况必须同步更新文档:
* 第三版范围确定或变更
* API 出现破坏性变更
* 数据模型新增、删除或关键语义变化
* Agent 本地文件结构变化
* 部署方式变化
* 新增基础设施依赖
更新顺序:
1. `docs/design.md`
2. `docs/development-guidelines.md`
3. `docs/development-plan.md`
4. `docs/deployment.md`
## 12. Swagger 文档约束
* Server 提供 Swagger UI 入口:`/swagger/index.html`
* Swagger UI 仅对已登录的管理端用户开放,不向匿名用户公开
* 新增或修改 API 时,必须同步更新 Swag 注解并重新生成 `atsf_server/docs`