9.8 KiB
手机远程控制台(管理端)上线记录
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-256dc59f2a6278ae04da1f8a4c6193373317126a2fda184cdf3335004cfd06a751e(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.pyfcc94534…、zyt_auth.py6b8ded1a…、Dockerfile2bc1a6c1…), api 运行镜像sha256:0861974700f0…;网关、知识库 worker(sha256:8299aac40787…)记录在案。 - 备份:
/data/backups/mobile-remote-20260928/backend.db6,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;保留实时数据库,新表旧代码不读写)。
尚未完成(需要各自负责人)
- ZYT:ZYT 团队发布
master上的694c83dc7、3cdc812f2(终端 9),并同一次执行server/sql/1.9.20260928/add_wecom_rpa_remote_menu.sql。在此之前手机登录提示"ZYT 尚未开通企微客服手机端登录(终端 9)"。 - HTTPS(可选):16:26 起公网也可以用 HTTP 登录(见下方"追加发布")。以后要加密传输时按
deploy/im-admin/im.zhenyangtang.cn.https.conf.example配证书 + 端口转发 + Nginx。 - 桌面端 1.5.1:安装包由管理员在「版本升级」小比例灰度发布;旧版桌面端在手机上显示"版本过低"。
已于 15:39 构建:
C:/wechat_rpa/dist/installer/甄AI客服-安装包-v1.5.1.exe,542,418,052 字节,SHA-256CEFDF05E8059C4BCD04AC1C7A9927123A65B5CD9FA2276AA38904D74182E4CF2(未签名:本机未配置代码签名证书,与以往一致)。 第一次完整构建停在打包自检:内置 OCR 的"消息导航"合成图检查在新生成文件首次冷启动时没识别出来,且失败后进程没有退出, 被构建脚本记为超时;同一个包随后按构建脚本同样的干净 PATH 连续两次自检通过(14–15 秒),再用build_installer.ps1 -SkipAppBuild生成安装包。 - 灰度授权: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-2563befdb5ead6c4f5a1f7e43d3306c7a0917620fab3f1a92ad82f04721f7d2d499;代码差异见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-256971f1e1370553a88a10bfb77d65f9c9ee3b32f14cda30c078646ef192967d395。 - 当前镜像:
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-256E3527C032882ABD7E72538F67B987F768F09F83B88D199A413AD67747E794D16(未签名,未发布)。