云控开关

发出去还能收回来的产物——在门户里一键停用或恢复,在它下一次检查时生效。

MagicLock 默认加密出来的一切都完全离线、永远能跑。这是一个承诺,而承诺是双向的:离线产物一旦发出去,你就再也够不着它了。云控开关是为那些你确实需要够得着的场景准备的可选项。

保护时加上 --web-gate,产物在解密之前会先去取一份由你掌控的签名许可。你在门户里把开关拨到关,它就会停——所有运行它的地方,在各自下一次检查时。拨回来它又能跑,不用重新发包。

离线产物(默认)云控产物(--web-gate
承诺永远能跑——订阅到期、席位变动都不影响你说了算——门户里一键停用/恢复
运行时联网从不许可有效期内不联网;过期后刷新
发出去之后还能停吗不能——这是刻意的设计能,在它下一次检查时

适合租赁与订阅、必须到期即停的试用评估、尾款交付保险、以及泄露止损。其余情况用默认的离线产物就好。这个选择是按产物而不是按账号的——同一个产品里两种可以混用。

打开它

shell
magiclock protect app.py --web-gate
magiclock protect-model weights.bin --web-gate
magiclock build app.py --web-gate

登记发生在加密的那一刻,需要联网并已登录。生产一个云控产物没有离线兜底——一个从未被登记过的产物根本不可能被控制,MagicLock 不会假装可以。

运行时会发生什么

  1. 产物向服务器索取一份签名的允许或拒绝。
  2. 在这份许可仍然有效期间,它完全不联网运行——不是每次运行都要回连。
  3. 许可过期后它会去刷新。收到拒绝就立即停止——没有宽限。
  4. 如果刷新因为断网而失败,它会在宽限窗口内继续运行,窗口过后 fail-closed。

有两个细节值得知道。拒绝是粘滞的:在一台断网机器上重放一份旧的允许缓存,无法让已停用的产物复活。以及首次运行必须联网——此时还没有任何缓存许可,也就没有东西可以兜底。

宽限窗口

--gate-grace 决定产物在最后一次获得许可之后还能离线工作多久:

shell
magiclock protect app.py --web-gate --gate-grace 24h
magiclock protect app.py --web-gate --gate-grace 7d

可设 1h30d,默认 12h。设得越短控制越紧,但也越依赖你客户那边的网络——按实际部署场景来定,而不是按紧张程度。--gate-grace 只能与 --web-gate 一起使用。

管理已经发出去的东西

在客户门户的 产物 页面,可以看到你登记过的全部产物、它们的状态与近期活动。停用会在该产物下一次检查时生效,恢复同样快。

命令行:

shell
magiclock artifacts     # id、标签、状态与闸门活动

删除产物是永久的:此后它会一直回答拒绝,且无法恢复。除非你要的正是这个效果,否则请用停用。

让停用更快生效

云控产物按它自己的检查点复查,所以一个长驻进程(服务端、worker)可能一直靠启动时取到的那份许可在跑。如果你需要门户里的停用尽快落到这类进程上,让它定时调用 magiclock.revalidate() —— 那会当场强制取一份新许可。这就是「几秒内停」与「最终会停」的差别。

云控不是什么

它不是许可证检查。订阅到期只会让你无法打包产物——不会反过来停掉你已经发出去的东西,无论那是不是云控产物。门户里那个开关是你的,也是唯一能停下云控产物的东西。

它也不改变默认行为。没有加 --web-gate 保护的产物永远保持离线,无法被远程停止——包括我们也不能。

可用性

云控开关包含在每一个付费方案中。它不属于免费试用——免费试用提供的是完整的离线保护。

为什么绕不过去

闸门参数是放在加密信封的认证数据内部的,而不是附在旁边——剥掉它、改掉它、或者移植到另一个产物上,都会直接让解密失败。编译产物则把同样的参数作为逐模块编译进去的常量携带。

许可由固定在你的 MagicLock 包内的厂商密钥签名,因此伪造或重放的判决无法通过验签。用于判断过期与宽限的时钟,取的是系统时钟与持久化高水位标记之中较晚的那个,所以把机器时钟往回拨并不能延长任何东西。