安全变更与状态漂移
配置能够通过类型校验,不代表修改一定可以安全地应用到已有部署。Cratenaut 会把字段变化、Crate 版本和服务器实际状态一起纳入计划
三份状态
每次计划会比较:
| 状态 | 含义 |
|---|---|
| 期望状态 | 当前配置希望服务器变成什么样 |
| 历史状态 | 上次成功部署后保存的规格与指纹 |
| 实际状态 | 当前服务器上托管资源的真实情况 |
只有新旧配置无法发现容器被手工替换、托管文件被修改或资源在服务器上消失。加入实际状态后,这些情况会被标记为漂移
配置风险等级
Crate 作者会根据字段含义标记风险:
| 风险 | 示例 | 默认行为 |
|---|---|---|
| 安全 | 修改可以原地重载的 Caddy 结构化配置 | 正常显示并执行 |
| 中断 | 修改端口、内存限制或需要重建容器的设置 | 明确显示中断影响 |
| 破坏性 | 关闭持久化、跨 PostgreSQL 主版本修改镜像 | 阻止执行,要求显式授权 |
| 不可变 | 修改只在空数据目录初始化的数据库名称 | 阻止直接修改 |
| 未知 | 自定义镜像或原生高级配置 | 要求部署者判断并显式授权 |
框架无法理解每个第三方应用参数的业务含义,因此 Crate 必须为常用字段给出规则,并把无法可靠判断的扩展字段标记为未知,而不是假装安全
状态漂移
当服务器实际状态与上次成功部署记录不一致时,不应直接覆盖。先确定漂移来源:
- 是否有人手工修改了容器或托管文件
- 是否有外部自动化在管理相同资源
- 是否发生了未完成的部署或磁盘恢复
- 服务器状态是否应当成为新的基准
确认本地配置才是正确来源后,才能使用:
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 镜像跨主版本属于破坏性变更
这些授权参数只确认你已经理解风险,不会自动执行数据迁移或备份