Files
kefu/deploy/mobile-remote-deployed.md
2026-09-29 15:52:07 +08:00

9.8 KiB
Raw Permalink Blame History

手机远程控制台(管理端)上线记录

2026-09-28 15:21(CST)完成用户授权的管理端服务更新("把其他部署到线上吧" / "继续,zyt我们自己发布";内网模式, SSH 绑定有线网卡 192.168.123.43 → 192.168.110.111)。ZYT 由 ZYT 团队自行发布,本次未动 ZYT。

  • 服务器:ps@192.168.110.111,项目 /opt/im-admin。
  • 发布目录:/home/ps/mobile-remote-20260928(本地 C:/kefu/deploy/mobile-remote-20260928/,说明见其中 RELEASE.md)。
  • 当前镜像:zyt/wecom-admin:mobile-remote-20260928,同时标记为 zyt/wecom-admin:current, sha256:826d68999c239d9c1f4fd6dbd15c62d0f520f8caf1e764d418ea93493e3498ac。
  • 发布包:mobile-remote-server-bundle-r2.tar.gz,522,202 字节,SHA-256 dc59f2a6278ae04da1f8a4c6193373317126a2fda184cdf3335004cfd06a751e(r1 只差 02-backup-build.sh 一处测试导入修正,见下)。
  • 生产文件:wechat_rpa/admin_api.py、wechat_rpa/zyt_auth.py、deploy/im-admin/Dockerfile(替换), wechat_rpa/remote_api.py、wechat_rpa/remote_store.py、admin-web/apps/mobile-h5/dist/(28 个文件,新增)。
  • 表结构:新增 mobile_sessions、desktop_commands、desktop_status、conversation_blacklist(纯新增,未改已有表)。

生产基线漂移(重要)

生产上的 admin_api.py 不是 C:/kefu HEAD,而是 2026-09-23 COS 直传发布从 C:/wechat_rpa/tmp/cos-direct-server-payload 放上去的版本(同批还有 archive_store.py,两者都是 CRLF)。本次先把生产 104 个后端文件原样取回,用三方合并得到 "生产版 + 本次改动"(无冲突,逐行核对只多出本次的改动),在"生产文件 + 本次 4 个文件"的副本上跑测试后才打包。 C:/kefu/wechat_rpa 的 admin_api.py、archive_store.py、archive_api.py 已同步为与生产一致(后两个本地原本只是落后于生产)。

结果

  • 预检:宿主与运行中容器内 3 个基线文件哈希一致(admin_api.py fcc94534…、zyt_auth.py 6b8ded1a…、Dockerfile 2bc1a6c1…), api 运行镜像 sha256:0861974700f0…;网关、知识库 worker(sha256:8299aac40787…)记录在案。
  • 备份:/data/backups/mobile-remote-20260928/backend.db 6,972,891,136 字节(15:16 CST,WAL 模式在线备份), quick_check ok,密钥 1 份。
  • 候选镜像离线(--network=none、只读根目录)跑 136 项测试通过:test_remote_api、test_zyt_auth、test_backend (随包的新版)、test_archive_api(镜像自带)。第一次运行因工作目录优先导入了镜像里的旧 test_backend.py 而停在测试 阶段(线上服务未受影响),02-backup-build.sh 改用 python -P 并在重跑时沿用已完成的备份后通过。
  • 部署后:api 容器 healthy、重启 0 次;网关与 worker 未变;宿主与容器内 33 个文件哈希与清单一致; 4 张新表存在,quick_check ok;4 个新接口匿名访问 401;/m/ 200 并带 CSP、X-Frame-Options: DENY、nosniff、 no-referrer;经 Nginx(:8369)访问 /m/、/api/v2/health、管理后台首页均 200;重启后 10 分钟内日志无错误、无 5xx, 桌面端心跳(167 次 desktop/me)已恢复。没有做任何登录,没有读取聊天或患者数据。

备份与回滚

  • 源码备份:/home/ps/mobile-remote-20260928/source-before/。
  • 旧镜像:zyt/wecom-admin:before-mobile-remote-20260928(sha256:0861974700f0…)。
  • 回滚:REMOTE_RELEASE_APPROVED=mobile-remote-20260928 bash /home/ps/mobile-remote-20260928/rollback.sh (恢复 3 个文件、删除新增文件与 /m/、切回旧镜像,只重建 api;保留实时数据库,新表旧代码不读写)。

尚未完成(需要各自负责人)

  1. ZYT:ZYT 团队发布 master 上的 694c83dc7、3cdc812f2(终端 9),并同一次执行 server/sql/1.9.20260928/add_wecom_rpa_remote_menu.sql。在此之前手机登录提示"ZYT 尚未开通企微客服手机端登录(终端 9)"。
  2. HTTPS(可选):16:26 起公网也可以用 HTTP 登录(见下方"追加发布")。以后要加密传输时按 deploy/im-admin/im.zhenyangtang.cn.https.conf.example 配证书 + 端口转发 + Nginx。
  3. 桌面端 1.5.1:安装包由管理员在「版本升级」小比例灰度发布;旧版桌面端在手机上显示"版本过低"。 已于 15:39 构建:C:/wechat_rpa/dist/installer/甄AI客服-安装包-v1.5.1.exe,542,418,052 字节,SHA-256 CEFDF05E8059C4BCD04AC1C7A9927123A65B5CD9FA2276AA38904D74182E4CF2(未签名:本机未配置代码签名证书,与以往一致)。 第一次完整构建停在打包自检:内置 OCR 的"消息导航"合成图检查在新生成文件首次冷启动时没识别出来,且失败后进程没有退出, 被构建脚本记为超时;同一个包随后按构建脚本同样的干净 PATH 连续两次自检通过(14–15 秒),再用 build_installer.ps1 -SkipAppBuild 生成安装包。
  4. 灰度授权:ZYT 角色里给试点客服勾选 wecom_rpa.remote/control、wecom_rpa.blacklist/add,主管加 wecom_rpa.blacklist/remove。

已知的旧测试问题(与本次无关)

生产镜像自带的 test_admin_api.ReleaseApiTest.test_package_upload_builds_a_verified_public_manifest 仍断言旧的 /api/v2/desktop/update/cos-packages/ 下载地址(9-23 起 complete 返回 COS 签名地址),test_backend 的 test_backend_verifies_the_admin_desktop_session_endpoint 仍模拟旧的两次请求流程;两者在未改动的生产代码上同样失败。 C:/kefu/wechat_rpa 的 test_backend 已是新版;test_admin_api 那一项待更新。

追加发布:mobile-http-20260928(2026-09-28 16:26 CST)

用户要求"不管在什么环境下都可以使用 http 登录账号,不要非固定死 https,改完后直接发布到线上环境" (此前用 4G 访问 http://im.zhenyangtang.cn:8369/m/ 登录被"请通过 HTTPS 地址访问手机控制台"拒绝)。

  • 改动:remote_api.py 里 MOBILE_REQUIRE_HTTPS 默认值由 auto 改为 never(内外网都允许明文 HTTP 登录; 以后配好 HTTPS 可设 auto / always 恢复限制);/m/ 登录页去掉"只能在公司内网登录"的横幅。 其余逻辑(登录限流、ZYT 锁定处理、令牌、权限)不变。无数据库变更,本次未做整库备份。
  • 发布目录:/home/ps/mobile-http-20260928(本地 C:/kefu/deploy/mobile-http-20260928/)。 发布包 mobile-http-server-bundle.tar.gz,488,202 字节,SHA-256 3befdb5ead6c4f5a1f7e43d3306c7a0917620fab3f1a92ad82f04721f7d2d499;代码差异见 payload-diff.txt(只有该函数的说明和默认值)。
  • 当前镜像:zyt/wecom-admin:mobile-http-20260928 = current,sha256:a633dd559af7d87260a6d32deb205f92c4ba7e2fcf92f4fe91df91c2493d20f8; 回滚标签 before-mobile-http-20260928(= mobile-remote-20260928,sha256:826d68999c23…)。
  • 验证:预检宿主与容器内 29 个文件(remote_api.py + /m/ 28 个文件)与上一版一致;候选镜像离线 137 项测试通过 (含新增"默认允许公网 HTTP 登录"),候选镜像 /m/ 恰好是新版 28 个文件、无旧横幅;部署后 api healthy、重启 0 次, 网关与 worker 未变,宿主与容器内文件与清单一致,在运行中的容器里判定"公网来源 + HTTP 登录"不再被拒绝; 经 Nginx 访问公网域名的 /m/ 加载的是新登录页(无横幅、控制台无报错),重启后日志无错误、无 5xx,桌面端心跳正常。
  • 注意:8369 端口的 Nginx 会缓存 /m/assets/ 下的带哈希文件(旧文件在 Nginx 里仍可取到,API 本身已 404)。 入口 index.html 不缓存,所以重新打开或刷新页面即是新版;已经开着旧页面的手机需要刷新一次。
  • 回滚:REMOTE_RELEASE_APPROVED=mobile-http-20260928 bash /home/ps/mobile-http-20260928/rollback.sh (恢复 remote_api.py 与原 /m/,切回 mobile-remote-20260928 镜像,只重建 api)。

追加发布:mobile-ignore-20260929(2026-09-29 CST)

用户要求"把黑名单文字改成忽略,两个字,只改文字不改规则,改完后同步到线上"。

  • 改动:/m/ 界面文字"黑名单"全部换成"忽略"(ConversationDetail.vue、ConversationsView.vue、MeView.vue、manifest.webmanifest 描述)。 规则、接口、权限码(wecom_rpa.blacklist/*)、后端代码和返回的错误文字都没动;无数据库变更。
  • 发布目录:/home/ps/mobile-ignore-20260929(本地 C:/kefu/deploy/mobile-ignore-20260929/),只含 /m/ 28 个文件; 发布包 mobile-ignore-server-bundle.tar.gz,478,493 字节,SHA-256 971f1e1370553a88a10bfb77d65f9c9ee3b32f14cda30c078646ef192967d395。
  • 当前镜像:zyt/wecom-admin:mobile-ignore-20260929 = current,sha256:23c1f2088b8f…; 回滚标签 before-mobile-ignore-20260929(= mobile-http-20260928,sha256:a633dd559af7…)。
  • 验证:基线 28 个文件与 mobile-http 一致;候选镜像 137 项测试通过;部署后 api healthy、网关与 worker 未变、日志无错误; 公网域名 /m/ 返回新版资源,不再含"黑名单"。
  • 回滚:REMOTE_RELEASE_APPROVED=mobile-ignore-20260929 bash /home/ps/mobile-ignore-20260929/rollback.sh。
  • 桌面端:C:/wechat_rpa 的 console-app.js、zhenyang-ai-console.html、wechat_gui_qt.py、remote_control.py、 conversation_blacklist.py 的界面/提示文字同步改为"忽略",需重新打包并经「版本升级」发布才会到客服电脑上。
  • 桌面端安装包已于 2026-09-29 11:33 重建:C:/wechat_rpa/dist/installer/甄AI客服-安装包-v1.5.2.exe,542,437,337 字节,SHA-256 E3527C032882ABD7E72538F67B987F768F09F83B88D199A413AD67747E794D16(未签名,未发布)。