3.7 KiB
发布模型
你会学到:OpenFlare 为什么以完整配置版本为发布单位,发布、激活、Agent 应用和回滚分别如何工作。
OpenFlare 的发布模型以完整配置版本为中心,而不是在线修改节点配置。
标准链路:
修改规则 -> 预览 / 查看 diff -> 发布 -> 生成完整配置版本 -> 激活版本 -> Agent 拉取 -> 本地应用 -> 上报结果
发布规则
Server 发布时必须:
- 读取全部启用的
proxy_routes。 - 读取 Server 侧 OpenResty 主配置、性能参数、缓存参数和必要 Lua 资源。
- 读取域名与证书绑定关系。
- 读取 WAF 全局规则组、自定义规则组、IP 组引用与网站绑定关系。
- 使用自动 IP 组最近一次执行后的 IP 列表,并展开 WAF 规则组引用的启用 IP 组,渲染完整 OpenResty 配置与 WAF 运行时配置。
- 计算
checksum。 - 写入
config_versions。 - 切换激活版本。
- 让 Agent 在后续 heartbeat 中发现并应用。
版本号格式固定为 YYYYMMDD-NNN。
预览与发布
预览和 diff 是只读能力,不产生发布记录。
发布会生成新的完整配置版本。版本必须包含足够信息,让未来回滚时可以基于历史快照重新应用,而不依赖当前可变配置。
激活版本
全局同时只能有一个激活版本。当前不做按节点分组的差异化版本。
Agent 通过 heartbeat 获取激活版本摘要;当远端版本或 checksum 与本地状态不一致时,Agent 才进入同步流程。当 Agent WS 连接升级开启且连接可用时,Server 在发布或激活版本成功后会广播最新激活版本摘要,Agent 收到后复用普通同步流程立即拉取并应用配置。WS 不可用时仍按 HTTP heartbeat 间隔发现变更。
不可变历史
历史版本不可变。回滚不是修改旧版本,而是重新激活旧版本。
这样做的结果是:
- 每个版本都可以追溯。
- 回滚链路与普通发布应用链路一致。
- Agent 不需要理解“反向 patch”,只需要应用一个目标版本。
Agent 应用策略
Agent 发现新版本后会:
- 拉取目标版本详情。
- 备份旧文件。
- 写入主配置、路由配置、证书、必要 Lua 资源与 WAF/PoW 运行时配置。
- 执行 OpenResty 配置校验。
- reload;如果运行时未启动,则尝试用当前配置启动 OpenResty。
- 上报成功、警告或失败。
如果新配置激活失败,Agent 必须尝试恢复运行;回滚成功时上报警告。若本地没有历史主配置可回滚,Agent 会写入内置安全兜底配置并尝试拉起 OpenResty:该配置对外只监听 80 端口,不包含任何用户路由,统一返回 503 Service Unavailable 与 OpenFlare: No Valid Configuration,同时保留本地 stub_status 健康检查入口。兜底启动成功时仍阻断失败目标版本并上报警告;存在历史主配置但回滚后仍无法恢复运行时上报失败。
某个目标 version + checksum 一旦应用失败并回退,Agent 会在本地状态中阻断该目标重复应用。只有远端激活版本或 checksum 发生变化,才允许再次尝试。
设计约束
- 发布必须读取全部启用的网站配置,而不是只渲染本次修改对象。
- 回滚通过重新激活旧版本实现,不修改历史版本。
- Agent API 固定使用节点专属
agent_token,首次接入可使用discovery_token。 - Server 不提供远程 shell 或任意命令执行入口。
- 配置版本必须保存完整快照、渲染结果和
checksum。 - WAF 规则组、IP 组快照和网站绑定关系必须随完整配置版本进入快照与 checksum,回滚时不得依赖当前可变 WAF 配置。