Files
yms-daemon/YMS_DAEMON_REPORT.drawio

338 lines
39 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>