pub(crate) async fn sync_admin_from_env(client: &Client) -> Result<(), AppError>Expand description
启动时按 ADMIN_* 环境变量同步初始管理员(env 是超级管理员的凭据源)。
语义(与 BACKUP_* 播种「仅首次生效」不同:这里每次启动都生效):
- 三个变量任一缺失/为空 → 跳过(特性关闭,向后兼容)。
- 变量值非法(不过
validate_*校验)→ warn + 跳过,不阻断启动。 ADMIN_USERNAME已存在 → 用ADMIN_PASSWORD覆盖其密码哈希 (密码一致时跳过重哈希,避免每次启动改写行;覆盖时 bumpsession_generation,旧会话全部失效需重新登录); 确保 role=‘admin’(恢复被降级/封禁的用户,触发 018 迁移的角色触发器); 邮箱同步为ADMIN_EMAIL(被其他用户占用时仅告警跳过邮箱)。ADMIN_USERNAME不存在 → 尝试创建为 admin。库中已存在其他 admin 时 创建失败(idx_one_admin部分唯一索引保证全库仅一个 admin),warn 提示。
失败只告警不阻断启动(与 BACKUP_* 播种一致)。