Files

338 lines
39 KiB
Plaintext
Raw Permalink Normal View History

2026-08-16 17:12:06 +08:00
<mxfile host="65bd71144e" compressed="false">
<diagram id="architecture" name="01-总体架构">
<mxGraphModel dx="2753" dy="1547" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2560" pageHeight="1440" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="a-title" value="&lt;b style=&quot;font-size:24px&quot;&gt;YMS 更新体系:当前实现与目标架构&lt;/b&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#172B4D;" parent="1" vertex="1">
<mxGeometry x="40" y="20" width="1180" height="45" as="geometry"/>
</mxCell>
<mxCell id="a-subtitle" value="容器化主线:宿主机 Nginx 作为稳定入口,Frontend 静态目录留在宿主机,Backend 与 Node SSR 容器化;Native 仅作短期兼容" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontColor=#42526E;" parent="1" vertex="1">
<mxGeometry x="40" y="65" width="1450" height="35" as="geometry"/>
</mxCell>
<mxCell id="a-legend-done" value="已实现" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontStyle=1;" parent="1" vertex="1">
<mxGeometry x="1190" y="25" width="85" height="30" as="geometry"/>
</mxCell>
<mxCell id="a-legend-doing" value="当前开发" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFAE6;strokeColor=#FFAB00;fontColor=#7A4B00;fontStyle=1;" parent="1" vertex="1">
<mxGeometry x="1285" y="25" width="90" height="30" as="geometry"/>
</mxCell>
<mxCell id="a-legend-plan" value="规划" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontStyle=1;" parent="1" vertex="1">
<mxGeometry x="1385" y="25" width="75" height="30" as="geometry"/>
</mxCell>
<mxCell id="a-legend-compat" value="兼容" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F4F5F7;strokeColor=#A5ADBA;fontColor=#42526E;fontStyle=1;" parent="1" vertex="1">
<mxGeometry x="1470" y="25" width="75" height="30" as="geometry"/>
</mxCell>
<mxCell id="a-source-group" value="&lt;b&gt;发布与开发侧&lt;/b&gt;" style="swimlane;html=1;rounded=1;startSize=42;fillColor=#F4F5F7;swimlaneFillColor=#FFFFFF;strokeColor=#A5ADBA;fontColor=#172B4D;fontSize=15;" parent="1" vertex="1">
<mxGeometry x="40" y="125" width="270" height="720" as="geometry"/>
</mxCell>
<mxCell id="a-jenkins" value="&lt;b&gt;Jenkins / 开发人员&lt;/b&gt;&lt;br&gt;&lt;font color=&quot;#42526E&quot;&gt;构建后通过全局 CLI 触发更新&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=14;spacing=10;" parent="1" vertex="1">
<mxGeometry x="65" y="195" width="220" height="95" as="geometry"/>
</mxCell>
<mxCell id="a-deploy" value="&lt;b&gt;Deploy 发布中台&lt;/b&gt;&lt;br&gt;&lt;font color=&quot;#42526E&quot;&gt;按 customerCode 生成 repack&lt;br&gt;在线镜像 / 离线 ZIP&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=10;" parent="1" vertex="1">
<mxGeometry x="65" y="355" width="220" height="110" as="geometry"/>
</mxCell>
<mxCell id="a-ci-note" value="&lt;b&gt;开发环境目标&lt;/b&gt;&lt;br&gt;同一事务、健康检查、切流和回滚框架&lt;br&gt;镜像按 digest 固定" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=10;" parent="1" vertex="1">
<mxGeometry x="65" y="545" width="220" height="120" as="geometry"/>
</mxCell>
<mxCell id="a-offline-note" value="&lt;b&gt;客户现场目标&lt;/b&gt;&lt;br&gt;PC 下载并校验 repack&lt;br&gt;断网后向服务器续传交付" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=10;" parent="1" vertex="1">
<mxGeometry x="65" y="690" width="220" height="115" as="geometry"/>
</mxCell>
<mxCell id="a-client-group" value="&lt;b&gt;客户 PCyms-daemon client(规划)&lt;/b&gt;" style="swimlane;html=1;rounded=1;startSize=42;fillColor=#DEEBFF;swimlaneFillColor=#F7FAFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=15;" parent="1" vertex="1">
<mxGeometry x="380" y="130" width="510" height="1105" as="geometry"/>
</mxCell>
<mxCell id="a-client-protocol" value="&lt;b&gt;PC → Server&lt;/b&gt;&lt;br&gt;HTTPS:可续传上传 ZIP&lt;br&gt;WSS:提交、快照、进度与断联恢复&lt;br&gt;&lt;font color=&quot;#42526E&quot;&gt;断联不取消服务器事务&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=10;" parent="a-client-group" vertex="1">
<mxGeometry x="40" y="790" width="280" height="135" as="geometry"/>
</mxCell>
<mxCell id="a-client-store" value="&lt;b&gt;PC 本地持久化&lt;/b&gt;&lt;br&gt;SQLite:业务状态与恢复位置&lt;br&gt;文件目录:repack ZIP(不进数据库)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=10;" parent="a-client-group" vertex="1">
<mxGeometry x="30" y="590" width="280" height="110" as="geometry"/>
</mxCell>
<mxCell id="a-client-gui" value="&lt;b&gt;client gui&lt;/b&gt;&lt;br&gt;Wails 3&lt;br&gt;刷新、获取、更新、进度、历史" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=10;" parent="a-client-group" vertex="1">
<mxGeometry x="220" y="445" width="280" height="100" as="geometry"/>
</mxCell>
<mxCell id="a-client-service" value="&lt;b&gt;client service&lt;/b&gt;&lt;br&gt;Windows 后台服务&lt;br&gt;轮询、下载、校验、上传、状态恢复" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=10;" parent="a-client-group" vertex="1">
<mxGeometry x="100" y="225" width="280" height="105" as="geometry"/>
</mxCell>
<mxCell id="a-ipc-edge" value="本地 IPC" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=12;" parent="a-client-group" source="a-client-gui" target="a-client-service" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-store-edge" value="唯一读写者" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=12;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" parent="a-client-group" source="a-client-service" target="a-client-store" edge="1">
<mxGeometry x="0.0057" relative="1" as="geometry">
<mxPoint x="170" y="345" as="sourcePoint"/>
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="a-server-group" value="&lt;b&gt;客户服务器 / 开发服务器&lt;/b&gt;" style="swimlane;html=1;rounded=1;startSize=42;fillColor=#F4F5F7;swimlaneFillColor=#FFFFFF;strokeColor=#A5ADBA;fontColor=#172B4D;fontSize=15;" parent="1" vertex="1">
<mxGeometry x="940" y="137.5" width="1600" height="1110" as="geometry"/>
</mxCell>
<mxCell id="a-static" value="&lt;b&gt;Frontend 静态目录&lt;/b&gt;&lt;br&gt;/home/yms/client-releases/&amp;lt;版本&amp;gt;&lt;br&gt;/home/yms/client → 当前版本&lt;br&gt;/home/yms/client-previous → 上一版本" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFAE6;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=13;spacing=9;" parent="a-server-group" vertex="1">
<mxGeometry x="1180" y="350" width="385" height="120" as="geometry"/>
</mxCell>
<mxCell id="a-docker" value="&lt;b&gt;Docker Engine API&lt;/b&gt;&lt;br&gt;pull / inspect / create / start / stop / remove&lt;br&gt;容器 restart policy = no,由 daemon 统一恢复" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=9;" parent="a-server-group" vertex="1">
<mxGeometry x="480" y="732.5" width="385" height="100" as="geometry"/>
</mxCell>
<mxCell id="a-nginx" value="&lt;b&gt;宿主机 Nginx:稳定入口&lt;/b&gt;&lt;br&gt;静态资源 + Backend 路由 + Node SSR 路由&lt;br&gt;&lt;font color=&quot;#7A4B00&quot;&gt;当前:改写 nginx.conf 受控区块&lt;br&gt;下一步:改为 daemon 专属 include&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFAE6;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=14;spacing=10;" parent="a-server-group" vertex="1">
<mxGeometry x="815" y="80" width="385" height="125" as="geometry"/>
</mxCell>
<mxCell id="a-nginx-static-edge" value="静态文件" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=11;" parent="a-server-group" source="a-nginx" target="a-static" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-backend" value="&lt;b&gt;Backend 容器蓝绿&lt;/b&gt;&lt;br&gt;backend-8080 / backend-8081&lt;br&gt;host network&lt;br&gt;镜像 digest + Actuator&lt;br&gt;&lt;font color=&quot;#006644&quot;&gt;稳定态更新已实现&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=9;" parent="a-server-group" vertex="1">
<mxGeometry x="690" y="350" width="185" height="145" as="geometry"/>
</mxCell>
<mxCell id="a-nginx-backend-edge" value="业务请求" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#36B37E;fontColor=#006644;fontSize=11;" parent="a-server-group" source="a-nginx" target="a-backend" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-docker-backend-edge" value="管理" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#36B37E;fontColor=#006644;fontSize=11;" parent="a-server-group" source="a-docker" target="a-backend" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-node" value="&lt;b&gt;Node SSR 容器&lt;/b&gt;&lt;br&gt;图表渲染服务&lt;br&gt;镜像 digest&lt;br&gt;&lt;font color=&quot;#0747A6&quot;&gt;执行器待实现&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=9;" parent="a-server-group" vertex="1">
<mxGeometry x="915" y="350" width="185" height="145" as="geometry"/>
</mxCell>
<mxCell id="a-nginx-node-edge" value="渲染请求" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=11;" parent="a-server-group" source="a-nginx" target="a-node" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-docker-node-edge" value="管理" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=11;dashed=1;" parent="a-server-group" source="a-docker" target="a-node" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-daemon" value="&lt;b&gt;yms-daemon servesystemd&lt;/b&gt;&lt;br&gt;&lt;br&gt;• 全局 CLI + Unix Socket&lt;br&gt;• TOML 严格配置&lt;br&gt;• flock 单实例锁&lt;br&gt;• SQLite 事务 / 步骤 / 事件&lt;br&gt;• 本地文件 + stdout/journal 日志&lt;br&gt;• 健康检查、切流、补偿和恢复" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=14;spacing=12;align=left;verticalAlign=top;" parent="a-server-group" vertex="1">
<mxGeometry x="320" y="80" width="330" height="245" as="geometry"/>
</mxCell>
<mxCell id="a-daemon-nginx-edge" value="切流 / 恢复" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=12;" parent="a-server-group" source="a-daemon" target="a-nginx" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-daemon-docker-edge" value="Engine API" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#36B37E;fontColor=#006644;fontSize=12;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="a-server-group" source="a-daemon" target="a-docker" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-rpm" value="&lt;b&gt;RPM / 静态 Go 二进制&lt;/b&gt;&lt;br&gt;linux/amd64、linux/arm64&lt;br&gt;CGO_ENABLED=0" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" parent="a-server-group" vertex="1">
<mxGeometry x="20" y="342.5" width="330" height="85" as="geometry"/>
</mxCell>
<mxCell id="a-native" value="&lt;b&gt;Native 短期兼容&lt;/b&gt;&lt;br&gt;systemd 双槽 8080 / 8081&lt;br&gt;不可变 JAR + SHA-256" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F4F5F7;strokeColor=#A5ADBA;fontColor=#42526E;fontSize=13;spacing=8;dashed=1;" parent="a-server-group" vertex="1">
<mxGeometry x="20" y="442.5" width="330" height="100" as="geometry"/>
</mxCell>
<mxCell id="a-server-p0" value="&lt;b&gt;首次部署安全底座(已实现)&lt;/b&gt;&lt;br&gt;非活动 Slot 健康后切流&lt;br&gt;SQLite 已提交部署状态 + 恢复核对" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" parent="a-server-group" vertex="1">
<mxGeometry x="20" y="572.5" width="330" height="95" as="geometry"/>
</mxCell>
<mxCell id="a-jenkins-edge" value="CLI 触发" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#36B37E;fontColor=#006644;fontSize=12;" parent="1" source="a-jenkins" target="a-daemon" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-deploy-client-edge" value="查询 / 下载 repack" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=12;" parent="1" source="a-deploy" target="a-client-service" edge="1">
<mxGeometry x="-0.5" y="-10" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="a-client-daemon-edge" value="HTTPS + WSS" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=12;dashed=1;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" parent="1" source="a-client-protocol" target="a-daemon" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="a-footer" value="汇报口径:容器承担有生命周期的 Backend / Node SSR;静态资源使用不可变目录 + 原子切换;daemon 是事务、恢复和交付入口。" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#172B4D;strokeColor=#172B4D;fontColor=#FFFFFF;fontSize=14;fontStyle=1;spacing=8;" parent="1" vertex="1">
<mxGeometry x="172.5" y="1380" width="1515" height="45" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="roadmap" name="02-能力与开发路线">
<mxGraphModel dx="1600" dy="960" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="960" math="0" shadow="0">
<root>
<mxCell id="r0"/>
<mxCell id="r1" parent="r0"/>
<mxCell id="r-title" value="&lt;b style=&quot;font-size:24px&quot;&gt;Daemon 已实现能力与开发路线&lt;/b&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontColor=#172B4D;" vertex="1" parent="r1">
<mxGeometry x="40" y="20" width="1000" height="45" as="geometry"/>
</mxCell>
<mxCell id="r-subtitle" value="原则:容器主线优先闭环“新机安装 → 稳态蓝绿 → 硬重启恢复”,随后建设离线交付与客户 PC;Native 保持可用但不继续扩张。" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=14;fontColor=#42526E;" vertex="1" parent="r1">
<mxGeometry x="40" y="65" width="1480" height="35" as="geometry"/>
</mxCell>
<mxCell id="r-done" value="&lt;b&gt;已实现:事务与 Native 闭环&lt;/b&gt;" style="swimlane;html=1;rounded=1;startSize=45;fillColor=#E3FCEF;swimlaneFillColor=#F7FFFB;strokeColor=#57D9A3;fontColor=#006644;fontSize=15;" vertex="1" parent="r1">
<mxGeometry x="40" y="130" width="350" height="560" as="geometry"/>
</mxCell>
<mxCell id="r-done-cli" value="&lt;b&gt;单一 CLI / 常驻服务&lt;/b&gt;&lt;br&gt;serve、update、restart&lt;br&gt;Unix Socket 流式进度、--quite" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="65" y="200" width="300" height="95" as="geometry"/>
</mxCell>
<mxCell id="r-done-core" value="&lt;b&gt;事务原子性底座&lt;/b&gt;&lt;br&gt;flock + SQLite + 本地事务文件&lt;br&gt;状态机、步骤意图、幂等、事件、补偿" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="65" y="320" width="300" height="105" as="geometry"/>
</mxCell>
<mxCell id="r-done-native" value="&lt;b&gt;Native Backend 执行器&lt;/b&gt;&lt;br&gt;JAR / repack ZIP、SHA-256&lt;br&gt;systemd 双槽、Actuator、切流、同版本重启" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="65" y="450" width="300" height="110" as="geometry"/>
</mxCell>
<mxCell id="r-done-package" value="&lt;b&gt;工程化交付&lt;/b&gt;&lt;br&gt;严格 TOML、文件 + journal 日志&lt;br&gt;RPM、systemd、amd64/arm64 静态构建" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="65" y="585" width="300" height="85" as="geometry"/>
</mxCell>
<mxCell id="r-now" value="&lt;b&gt;当前:容器主线补齐&lt;/b&gt;" style="swimlane;html=1;rounded=1;startSize=45;fillColor=#FFFAE6;swimlaneFillColor=#FFFDF5;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=15;" vertex="1" parent="r1">
<mxGeometry x="420" y="130" width="350" height="560" as="geometry"/>
</mxCell>
<mxCell id="r-now-existing" value="&lt;b&gt;容器稳定态更新已实现&lt;/b&gt;&lt;br&gt;Registry pull → RepoDigest&lt;br&gt;Engine API → 非活动槽 → 健康检查&lt;br&gt;Nginx 切流 → 排空旧容器" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="445" y="200" width="300" height="115" as="geometry"/>
</mxCell>
<mxCell id="r-now-bootstrap" value="&lt;b&gt;已实现:新机首次容器引导&lt;/b&gt;&lt;br&gt;部署事实核对 → 创建非活动 Slot&lt;br&gt;健康后首次切流并原子提交部署状态" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="445" y="340" width="300" height="105" as="geometry"/>
</mxCell>
<mxCell id="r-now-recovery" value="&lt;b&gt;P0:部署状态与开机恢复&lt;/b&gt;&lt;br&gt;SQLite 记录已提交 Slot / digest&lt;br&gt;硬重启只启动活动容器,禁止双实例漂移" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFAE6;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="445" y="470" width="300" height="105" as="geometry"/>
</mxCell>
<mxCell id="r-now-gateway" value="&lt;b&gt;P0Gateway 收敛&lt;/b&gt;&lt;br&gt;主 nginx.conf 固定&lt;br&gt;daemon 仅原子管理专属 include" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFAE6;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="445" y="600" width="300" height="70" as="geometry"/>
</mxCell>
<mxCell id="r-next" value="&lt;b&gt;下一阶段:完整服务器能力&lt;/b&gt;" style="swimlane;html=1;rounded=1;startSize=45;fillColor=#DEEBFF;swimlaneFillColor=#F7FAFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=15;" vertex="1" parent="r1">
<mxGeometry x="800" y="130" width="350" height="560" as="geometry"/>
</mxCell>
<mxCell id="r-next-front" value="&lt;b&gt;Frontend 静态执行器&lt;/b&gt;&lt;br&gt;client-releases 不可变目录&lt;br&gt;current / previous 原子切换与旧资源回源" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="825" y="200" width="300" height="100" as="geometry"/>
</mxCell>
<mxCell id="r-next-node" value="&lt;b&gt;Node SSR 容器执行器&lt;/b&gt;&lt;br&gt;镜像 digest、健康检查、更新与恢复" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="825" y="325" width="300" height="80" as="geometry"/>
</mxCell>
<mxCell id="r-next-command" value="&lt;b&gt;统一命令能力&lt;/b&gt;&lt;br&gt;rollback、query、service all&lt;br&gt;Jenkins 事务查询与结果回写" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="825" y="430" width="300" height="90" as="geometry"/>
</mxCell>
<mxCell id="r-next-offline" value="&lt;b&gt;离线交付协议&lt;/b&gt;&lt;br&gt;manifest、长度 / SHA-256 / digest&lt;br&gt;签名验签、Docker load、HTTPS 续传、WSS" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="825" y="545" width="300" height="105" as="geometry"/>
</mxCell>
<mxCell id="r-future" value="&lt;b&gt;后续:交付与规模化&lt;/b&gt;" style="swimlane;html=1;rounded=1;startSize=45;fillColor=#DEEBFF;swimlaneFillColor=#F7FAFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=15;" vertex="1" parent="r1">
<mxGeometry x="1180" y="130" width="350" height="560" as="geometry"/>
</mxCell>
<mxCell id="r-future-client" value="&lt;b&gt;客户 PC 工作台&lt;/b&gt;&lt;br&gt;Windows Service + Wails 3 GUI&lt;br&gt;SQLite、轮询、获取、更新和断联恢复" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="1205" y="200" width="300" height="105" as="geometry"/>
</mxCell>
<mxCell id="r-future-migrate" value="&lt;b&gt;客户迁移&lt;/b&gt;&lt;br&gt;Native → Docker standalone 显式事务&lt;br&gt;失败恢复原运行类型" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="1205" y="335" width="300" height="90" as="geometry"/>
</mxCell>
<mxCell id="r-future-dist" value="&lt;b&gt;分布式主机&lt;/b&gt;&lt;br&gt;节点子事务 + 全局编排&lt;br&gt;按节点健康与切流结果汇总" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="1205" y="455" width="300" height="90" as="geometry"/>
</mxCell>
<mxCell id="r-future-k8s" value="&lt;b&gt;Kubernetes&lt;/b&gt;&lt;br&gt;OCI 导入内部 Registry&lt;br&gt;digest rollout、readiness、rollback" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;spacing=8;" vertex="1" parent="r1">
<mxGeometry x="1205" y="575" width="300" height="80" as="geometry"/>
</mxCell>
<mxCell id="r-edge-1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;endArrow=block;endFill=1;strokeColor=#36B37E;strokeWidth=3;" edge="1" parent="r1" source="r-done" target="r-now">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="r-edge-2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;endArrow=block;endFill=1;strokeColor=#FFAB00;strokeWidth=3;" edge="1" parent="r1" source="r-now" target="r-next">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="r-edge-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;endArrow=block;endFill=1;strokeColor=#4C9AFF;strokeWidth=3;" edge="1" parent="r1" source="r-next" target="r-future">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="r-native-lane" value="&lt;b&gt;Native 兼容线(冻结范围)&lt;/b&gt;&amp;nbsp;&amp;nbsp; 保留现有 JAR / repack ZIP / systemd 双槽 / restart;新增工作只解决客户迁移与必要缺陷,不让 Native 阻塞容器主线。" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F4F5F7;strokeColor=#A5ADBA;fontColor=#42526E;fontSize=14;spacing=12;dashed=1;" vertex="1" parent="r1">
<mxGeometry x="40" y="735" width="1490" height="70" as="geometry"/>
</mxCell>
<mxCell id="r-quality" value="&lt;b&gt;贯穿全部阶段的验收线&lt;/b&gt;&amp;nbsp;&amp;nbsp; 断电 / 进程终止恢复|状态漂移拒绝|原子文件提交|健康检查失败不切流|amd64 + arm64CGO_ENABLED=0" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#172B4D;strokeColor=#172B4D;fontColor=#FFFFFF;fontSize=14;spacing=12;" vertex="1" parent="r1">
<mxGeometry x="40" y="835" width="1490" height="60" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="client" name="03-Client规划与断联恢复">
<mxGraphModel dx="1600" dy="960" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="960" math="0" shadow="0">
<root>
<mxCell id="c0"/>
<mxCell id="c1" parent="c0"/>
<mxCell id="c-title" value="&lt;b style=&quot;font-size:24px&quot;&gt;客户 PC 工作台:操作流程与断联恢复&lt;/b&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontColor=#172B4D;" vertex="1" parent="c1">
<mxGeometry x="40" y="20" width="1050" height="45" as="geometry"/>
</mxCell>
<mxCell id="c-subtitle" value="规划状态|同一 Windows 二进制提供 client service 与 client gui 两个入口;GUI 不直接访问中台、SQLite 或客户服务器。" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=14;fontColor=#42526E;" vertex="1" parent="c1">
<mxGeometry x="40" y="65" width="1450" height="35" as="geometry"/>
</mxCell>
<mxCell id="c-deploy" value="&lt;b&gt;Deploy 发布中台&lt;/b&gt;&lt;br&gt;customerCode 隔离的 repack" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=8;" vertex="1" parent="c1">
<mxGeometry x="40" y="125" width="250" height="75" as="geometry"/>
</mxCell>
<mxCell id="c-gui" value="&lt;b&gt;client gui&lt;/b&gt;&lt;br&gt;Wails 3:用户交互" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=8;" vertex="1" parent="c1">
<mxGeometry x="345" y="125" width="250" height="75" as="geometry"/>
</mxCell>
<mxCell id="c-service" value="&lt;b&gt;client service&lt;/b&gt;&lt;br&gt;Windows 后台服务:唯一业务执行者" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=8;" vertex="1" parent="c1">
<mxGeometry x="650" y="125" width="270" height="75" as="geometry"/>
</mxCell>
<mxCell id="c-store" value="&lt;b&gt;PC 本地状态&lt;/b&gt;&lt;br&gt;SQLite + repack 文件目录" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DEEBFF;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=14;spacing=8;" vertex="1" parent="c1">
<mxGeometry x="975" y="125" width="250" height="75" as="geometry"/>
</mxCell>
<mxCell id="c-daemon" value="&lt;b&gt;客户服务器 daemon&lt;/b&gt;&lt;br&gt;上传、事务与更新执行" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3FCEF;strokeColor=#57D9A3;fontColor=#006644;fontSize=14;spacing=8;" vertex="1" parent="c1">
<mxGeometry x="1280" y="125" width="270" height="75" as="geometry"/>
</mxCell>
<mxCell id="c-life-deploy" value="" style="shape=line;html=1;strokeColor=#A5ADBA;dashed=1;" vertex="1" parent="c1">
<mxGeometry x="164" y="200" width="1" height="590" as="geometry"/>
</mxCell>
<mxCell id="c-life-gui" value="" style="shape=line;html=1;strokeColor=#A5ADBA;dashed=1;" vertex="1" parent="c1">
<mxGeometry x="469" y="200" width="1" height="590" as="geometry"/>
</mxCell>
<mxCell id="c-life-service" value="" style="shape=line;html=1;strokeColor=#A5ADBA;dashed=1;" vertex="1" parent="c1">
<mxGeometry x="784" y="200" width="1" height="590" as="geometry"/>
</mxCell>
<mxCell id="c-life-store" value="" style="shape=line;html=1;strokeColor=#A5ADBA;dashed=1;" vertex="1" parent="c1">
<mxGeometry x="1099" y="200" width="1" height="590" as="geometry"/>
</mxCell>
<mxCell id="c-life-daemon" value="" style="shape=line;html=1;strokeColor=#A5ADBA;dashed=1;" vertex="1" parent="c1">
<mxGeometry x="1414" y="200" width="1" height="590" as="geometry"/>
</mxCell>
<mxCell id="c-msg1" value="1 后台轮询:按 customerCode 查询可用 repack" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="785" y="235" as="sourcePoint"/>
<mxPoint x="165" y="235" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg2" value="2 返回包身份、版本、长度、SHA-256 与下载信息" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="165" y="285" as="sourcePoint"/>
<mxPoint x="785" y="285" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg3" value="3 SQLite 登记版本;本地 IPC 刷新 GUI" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="785" y="335" as="sourcePoint"/>
<mxPoint x="470" y="335" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg4" value="4 用户点击“获取”" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="470" y="385" as="sourcePoint"/>
<mxPoint x="785" y="385" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg5" value="5 Range 下载;校验长度、整包 SHA-256、签名与 manifest" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="785" y="435" as="sourcePoint"/>
<mxPoint x="165" y="435" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg6" value="6 ZIP 原子进入可交付目录;SQLite 提交已校验状态" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="785" y="485" as="sourcePoint"/>
<mxPoint x="1100" y="485" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg7" value="7 用户点击“更新”并选择已登记服务器 / service" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="470" y="535" as="sourcePoint"/>
<mxPoint x="785" y="535" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg8" value="8 HTTPS:创建上传、HEAD 查询偏移、PATCH 续传 ZIP" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="785" y="585" as="sourcePoint"/>
<mxPoint x="1415" y="585" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg9" value="9 WSS:提交幂等更新请求;服务器事务脱离连接独立执行" style="endArrow=block;endFill=1;html=1;strokeColor=#36B37E;fontColor=#006644;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="785" y="635" as="sourcePoint"/>
<mxPoint x="1415" y="635" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg10" value="10 事务快照、进度与日志摘要;按事件位置恢复订阅" style="endArrow=block;endFill=1;html=1;strokeColor=#36B37E;fontColor=#006644;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1415" y="685" as="sourcePoint"/>
<mxPoint x="785" y="685" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-msg11" value="11 本地 IPC 更新 GUISQLite 保存上传偏移、事务 ID 与最后事件位置" style="endArrow=block;endFill=1;html=1;strokeColor=#4C9AFF;fontColor=#0747A6;fontSize=13;" edge="1" parent="c1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="785" y="735" as="sourcePoint"/>
<mxPoint x="470" y="735" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="c-recovery" value="&lt;b&gt;断联恢复原则&lt;/b&gt;&amp;nbsp;&amp;nbsp; 上传中断:从 daemon 已确认偏移续传|提交响应丢失:按幂等标识查询,不重复创建|事务执行中断联:服务器继续切流或回滚|PC 重启:从 SQLite + 文件实际状态恢复" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFAE6;strokeColor=#FFAB00;fontColor=#7A4B00;fontSize=14;spacing=12;" vertex="1" parent="c1">
<mxGeometry x="40" y="805" width="1510" height="70" as="geometry"/>
</mxCell>
<mxCell id="c-build" value="&lt;b&gt;交付约束&lt;/b&gt;&amp;nbsp;&amp;nbsp; Windows amd64 / arm64CGO_ENABLED=0SQLite 驱动不得依赖 CGO|GUI 退出不影响后台轮询、下载、上传和服务器事务跟踪" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#172B4D;strokeColor=#172B4D;fontColor=#FFFFFF;fontSize=14;spacing=12;" vertex="1" parent="c1">
<mxGeometry x="40" y="890" width="1510" height="45" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>