Skip to content

安全变更与状态漂移

配置能够通过类型校验,不代表修改一定可以安全地应用到已有部署。Cratenaut 会把字段变化、Crate 版本和服务器实际状态一起纳入计划

三份状态

每次计划会比较:

状态含义
期望状态当前配置希望服务器变成什么样
历史状态上次成功部署后保存的规格与指纹
实际状态当前服务器上托管资源的真实情况

只有新旧配置无法发现容器被手工替换、托管文件被修改或资源在服务器上消失。加入实际状态后,这些情况会被标记为漂移

配置风险等级

Crate 作者会根据字段含义标记风险:

风险示例默认行为
安全修改可以原地重载的 Caddy 结构化配置正常显示并执行
中断修改端口、内存限制或需要重建容器的设置明确显示中断影响
破坏性关闭持久化、跨 PostgreSQL 主版本修改镜像阻止执行,要求显式授权
不可变修改只在空数据目录初始化的数据库名称阻止直接修改
未知自定义镜像或原生高级配置要求部署者判断并显式授权

框架无法理解每个第三方应用参数的业务含义,因此 Crate 必须为常用字段给出规则,并把无法可靠判断的扩展字段标记为未知,而不是假装安全

状态漂移

当服务器实际状态与上次成功部署记录不一致时,不应直接覆盖。先确定漂移来源:

  1. 是否有人手工修改了容器或托管文件
  2. 是否有外部自动化在管理相同资源
  3. 是否发生了未完成的部署或磁盘恢复
  4. 服务器状态是否应当成为新的基准

确认本地配置才是正确来源后,才能使用:

bash
naut deploy --overwrite-drift

删除配置不等于立即删除数据

从配置移除一个 Crate 后,Cratenaut 不会默认删除它遗留的托管资源。计划只有在提供 --prune 时才会包含清理操作,并继续根据资源类型要求相应授权

bash
naut plan --prune
naut deploy --prune --allow-destructive

执行前应确认持久化数据已经备份

版本变化

每个 Crate 都有语义化版本。默认规则是:

  • 同一主版本内按照 Crate 声明的风险正常评估
  • 未声明兼容性的跨主版本升级需要 --allow-major
  • 任何版本降级都需要 --allow-downgrade
  • 应用镜像的版本风险仍由具体 Crate 评估,例如 PostgreSQL 镜像跨主版本属于破坏性变更

这些授权参数只确认你已经理解风险,不会自动执行数据迁移或备份

以 MIT 许可证发布