feat: automate extension updates across Windows hosts
This commit is contained in:
1 parent
500034bb63
commit
f08aac0c9e
36 files changed
+2996
-71
No files matched your search
@@ -31,6 +31,39 @@
|
||||
- `user_channels`、`tasks.channel_id` 和 `agentbus_deliveries` 共同保存入站归属、accepted 受理回执和最终 result 回执。回执以 `(channel_id, inbound_frame_id, delivery_kind)` 幂等,发送失败会重试,进程重启或 WebSocket 重连后仍会继续投递;因此不会因为超过原等待时长而丢掉最终回复。
|
||||
- ERP 插件领取由组织级数据库锁和 FIFO confirmed 队列统一串行化:同一组织/同一 ERP 浏览器会话在任意时刻最多一个 ERP execution,其他任务留在服务端等待;已开始写入但结果不确定的任务会阻塞后续领取,直到人工回查收敛。
|
||||
|
||||
## Chrome 插件自动更新
|
||||
|
||||
插件更新由本控制平面统一编排,不在 Windows Server 上增加单独的 LTJT 更新服务。中央 Node 服务把管理员批准的 ZIP 写入 OSS 私有对象,再通过阿里云 ECS 云助手向目标 Windows Server 下发一次性 PowerShell 命令。云助手只负责本次文件部署;版本判断、空闲门禁、重试、状态和验版均保存在控制平面与 PostgreSQL 中。
|
||||
|
||||
更新链路为:
|
||||
|
||||
```text
|
||||
管理员发布版本化 ZIP
|
||||
→ 服务端校验 ZIP 边界、Manifest 身份/版本、必需文件和 SHA-256
|
||||
→ 私有对象写入 OSS,并把该版本设为组织活动版本
|
||||
→ 浏览器心跳上报当前版本与插件内存/持久化空闲证明
|
||||
→ 服务端汇总同一 ECS 实例上全部账号、任务、执行尝试与待回查状态
|
||||
→ 完全空闲后,以主机级数据库锁启动 ECS 云助手命令
|
||||
→ Windows 下载短时、主机绑定的服务端地址并再次校验 SHA-256 与 Manifest
|
||||
→ 新目录暂存,旧目录保留为 `.previous`,原子切换失败则回滚
|
||||
→ 平台请求插件后台再次检查空闲状态并执行 `chrome.runtime.reload()`
|
||||
→ 刷新平台页;目标版本的新心跳到达后标记 `verified`,再开放新 ERP 任务
|
||||
```
|
||||
|
||||
不存在固定的业务等待时间:已经空闲的主机会立即开始;仍有 `accepted/running/write_started/submitted/uncertain/reconciliation_pending` 边界时持续等待真实状态收敛。更新处于等待、执行、待重载、配置缺失或最终失败时,页面和服务端领取接口都会阻止新的 ERP 写任务。单个主机版本最多自动尝试三次;失败信息经过 URL/令牌脱敏后才写入状态。
|
||||
|
||||
多台、多账号 Windows Server 按以下方式配置:
|
||||
|
||||
1. 每台 ECS Windows Server 必须安装并正常连接阿里云云助手。中央服务所在机器需要访问 OSS 与 ECS API;每台 Windows Server 需要能访问 `APP_ORIGIN` 的 HTTPS 插件下载接口。该链路不依赖 Google 服务。
|
||||
2. 每台 Windows Server 统一使用 `C:\ProgramData\LTJT\chrome-extension\ltjt-order-assistant`。同机的每个 Windows/Chrome profile 都只需在 `chrome://extensions` 中把这个相同目录“加载已解压的扩展程序”一次。
|
||||
3. `0.5.167` 是引导版本,包含安全状态与受控重载协议。现有 `0.5.166` 及更旧 profile 必须最后一次人工迁移到上述共享目录;旧代码无法凭服务端单方面获得新协议。完成全部 profile 引导前保持 `EXTENSION_AUTO_UPDATE_ENABLED=false`。
|
||||
4. 为中央服务配置仅允许目标 ECS 实例执行命令和读取调用结果的 RAM 身份,并填写 `ALIBABA_CLOUD_ACCESS_KEY_ID`、`ALIBABA_CLOUD_ACCESS_KEY_SECRET`,使用临时身份时同时填写 `ALIBABA_CLOUD_SECURITY_TOKEN`。不要复用宽权限 OSS 身份。
|
||||
5. 配置 OSS、`EXTENSION_UPDATE_OSS_KEY_PREFIX`、共享安装目录、包大小与命令超时,再启用 `EXTENSION_AUTO_UPDATE_ENABLED=true` 并重启控制平面。生产 `APP_ORIGIN` 必须是 Windows Server 可达的 HTTPS 地址。
|
||||
6. 管理员在 `/accounts` 给每个非管理员账号填写 ECS 地域 ID 与实例 ID。同一 Windows Server 上的多个账号填写完全相同的一组值,服务端会把它们合并成一个主机级空闲门禁和更新状态。
|
||||
7. 管理员在 `/accounts` 的“插件版本发布”区域选择版本化 ZIP。服务端只接受比当前活动版本更高的版本;同一版本不同哈希会被拒绝。发布后无需逐台登录,在线浏览器的正常心跳会启动更新并完成验版。
|
||||
|
||||
更新命令只允许操作配置的 `ProgramData\LTJT` 子目录,不安装 CRX、不修改 Chrome 策略、不操纵交互式桌面。若某个 profile 长期离线,它不会阻塞在线 profile;再次启动时会从已更新的共享目录加载目标版本并在下一次心跳完成验证。发布、迁移和运行状态由迁移 `019_extension_host_updates` 中的 `extension_releases`、`extension_host_updates` 以及账号 ECS 映射保存。
|
||||
|
||||
## 任务级会话续接
|
||||
|
||||
- `agent_sessions` 将一个业务任务绑定到一个 Superagent 会话;`agent_session_messages` 加密保存每一轮用户/Agent 消息并使用独立幂等键。
|
||||
|
||||
Reference in new issue
Block a user