先把当时的情况摆出来。私有化部署的推理平台用 license 文件授权,到期当天凌晨服务全部返回 403 License expired,连健康检查都不通,客户在值班群里反馈,续期文件还要走人工申请。
原因不止一个,得分开看。license 校验失败直接拒绝启动,没有宽限期。还有一种是容器时间与授权服务器差 8 小时,提前判定过期。
不容易想到的是,license 绑定 MAC,换网卡后失效。还有一种情况,续期文件没有热加载,必须重启。
上来先核对容器与授权服务器的时间
date -u && docker exec app date -u
随后查看 license 的到期时间与绑定信息
python -c "import json;l=json.load(open('/etc/app/license.json'));print(l['expire_at'],l.get('machine_id'))"
接着加 7 天宽限期并允许只读模式启动
python -c "print({'grace_days':7,'readonly_on_expire':True})"
续期后热加载并确认不再 403
curl -s -X POST http://localhost:8080/admin/license/reload -H 'X-Admin-Token: $TOKEN'
恢复的判定其实很直接。续期后健康检查立即返回 200,license 到期时间更新为新日期,不需要重启容器,业务请求恢复正常。
补一句。license 到期不该等于服务立刻不可用,至少要有宽限期和只读降级;绑定 MAC 在虚拟化环境里很脆弱,换实例就会失效。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
