This commit is contained in:
@@ -585,7 +585,7 @@ export default function UpdatePage({
|
||||
<Page
|
||||
eyebrow="运维与维护"
|
||||
title="系统更新中心"
|
||||
subtitle="管理 TallyNote 本地账本版本升级、下载验证与安全平滑重启"
|
||||
subtitle="管理系统版本升级、更新包完整性校验与安全热重启"
|
||||
actions={
|
||||
<div className="tn-update-page-actions">
|
||||
<Button
|
||||
@@ -710,7 +710,7 @@ export default function UpdatePage({
|
||||
<div className="tn-metric-content">
|
||||
<span className="tn-metric-label">更新守护方式</span>
|
||||
<div className="tn-metric-value">
|
||||
{info.strategy === "systemd" ? "systemd 守护" : "手动源码模式"}
|
||||
{info.strategy === "systemd" ? "系统守护进程" : "独立运行模式"}
|
||||
</div>
|
||||
</div>
|
||||
</Surface>
|
||||
@@ -722,7 +722,7 @@ export default function UpdatePage({
|
||||
{info.checkedAt ? dateText(info.checkedAt, timezone) : "未检查"}
|
||||
</div>
|
||||
<div className="tn-metric-foot">
|
||||
<small>数据源:Gitea Releases</small>
|
||||
<small>数据源:官方发布渠道</small>
|
||||
</div>
|
||||
</div>
|
||||
</Surface>
|
||||
@@ -741,7 +741,7 @@ export default function UpdatePage({
|
||||
<div className="tn-stepper-head">
|
||||
<div>
|
||||
<small className="tn-section-subheading">
|
||||
标准化发布流程:版本发现 → 校验签名与清单 → 安全暂存 → 原子切换并重启
|
||||
标准升级流程:获取版本信息 → 校验完整性 → 下载更新包 → 自动应用并安全重启
|
||||
</small>
|
||||
</div>
|
||||
{job && (
|
||||
@@ -761,10 +761,10 @@ export default function UpdatePage({
|
||||
|
||||
<div className="tn-stepper-wrap">
|
||||
<Steps current={currentStep} theme="default">
|
||||
<StepItem title="检查新版" content="获取 Release 元数据" />
|
||||
<StepItem title="下载更新包" content="安全暂存 tar.gz 归档" />
|
||||
<StepItem title="完整性校验" content="SHA-256 + 签名核验" />
|
||||
<StepItem title="立即应用" content="原子切换与平滑重启" />
|
||||
<StepItem title="检查新版" content="获取最新版本发布信息" />
|
||||
<StepItem title="下载更新包" content="安全暂存更新程序包" />
|
||||
<StepItem title="完整性校验" content="校验数字签名与文件指纹" />
|
||||
<StepItem title="立即应用" content="自动备份数据并平滑升级" />
|
||||
</Steps>
|
||||
</div>
|
||||
|
||||
@@ -806,19 +806,19 @@ export default function UpdatePage({
|
||||
{/* Status-specific descriptions */}
|
||||
<div className="tn-job-runtime-desc">
|
||||
{job.status === "downloading" && (
|
||||
<span>正在从受信仓库高速拉取发布包,数据经过 TLS 1.3 传输加密,不影响前台正常记账。</span>
|
||||
<span>正在从官方渠道下载更新安装包,后台安全传输中,不影响当前系统的正常使用。</span>
|
||||
)}
|
||||
{job.status === "verifying" && (
|
||||
<span>已下载完成,正在对发布包进行 SHA-256 哈希比对与 Ed25519 签名真伪验证…</span>
|
||||
<span>更新包已下载完成,正在进行防篡改完整性核验与数字签名认证…</span>
|
||||
)}
|
||||
{job.status === "staged" && (
|
||||
<span className="text-success">
|
||||
<CheckCircle2 size={15} aria-hidden="true" />
|
||||
<span>更新包已下载并通过全部完整性校验。随时可以点击右上方【立即应用更新】。</span>
|
||||
<span>更新包已准备就绪并通过安全校验,可随时点击【立即应用更新】完成升级。</span>
|
||||
</span>
|
||||
)}
|
||||
{job.status === "backing_up" && (
|
||||
<span>升级前安全保护中:正在自动为 SQLite 数据库与凭据附件生成安全快照备份…</span>
|
||||
<span>正在为系统数据与附件凭据创建安全快照备份,确保升级过程数据无损…</span>
|
||||
)}
|
||||
{job.status === "applying" && (
|
||||
<div className="tn-restarting-banner">
|
||||
@@ -826,10 +826,10 @@ export default function UpdatePage({
|
||||
<RefreshCw size={18} className="tn-spin" />
|
||||
</div>
|
||||
<div>
|
||||
<strong>服务正在平滑重启并执行健康检查…</strong>
|
||||
<strong>系统正在安全重启并检验服务可用性…</strong>
|
||||
{restartSeconds !== null && (
|
||||
<div className="tn-restart-countdown">
|
||||
预计 {restartSeconds} 秒后自动恢复,前端正保持心跳轮询,无需手动刷新。
|
||||
预计 {restartSeconds} 秒后自动恢复连接,系统将自动刷新页面,请稍候。
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -851,7 +851,7 @@ export default function UpdatePage({
|
||||
{job?.status === "completed" && (
|
||||
<div className="tn-inline-info">
|
||||
<CheckCircle2 size={16} />
|
||||
<span>更新成功完成!新版本已通过内置端点健康检查,账本数据与附件完整无损。</span>
|
||||
<span>系统已成功升级至最新版本,数据与附件均已完整保留。</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -885,7 +885,7 @@ export default function UpdatePage({
|
||||
<span className="tn-fact-label">目标平台发布包</span>
|
||||
<strong className="tn-fact-value">{latest.compatible ? latest.assetName : "无匹配架构包"}</strong>
|
||||
<small className="tn-fact-hint">
|
||||
{latest.compatible ? "与当前操作系统及 CPU 架构完全匹配" : "请在对应架构 runner 上单独构建"}
|
||||
{latest.compatible ? "与当前系统运行环境匹配" : "当前系统环境暂不支持此更新包"}
|
||||
</small>
|
||||
</div>
|
||||
|
||||
@@ -908,7 +908,7 @@ export default function UpdatePage({
|
||||
<strong className="tn-fact-value">
|
||||
{latest.assetSize ? bytesText(latest.assetSize) : "-"}
|
||||
</strong>
|
||||
<small className="tn-fact-hint">包含独立运行时与全量生产静态资源</small>
|
||||
<small className="tn-fact-hint">完整生产环境更新程序包</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -946,7 +946,7 @@ export default function UpdatePage({
|
||||
)}
|
||||
{reloadReady && (
|
||||
<Button theme="success" size="large" onClick={() => window.location.reload()}>
|
||||
重新加载控制台
|
||||
刷新页面
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
@@ -955,7 +955,7 @@ export default function UpdatePage({
|
||||
<Surface className="tn-empty-surface">
|
||||
<div className="tn-empty-content">
|
||||
<RefreshCw size={28} className="text-muted" />
|
||||
<p>暂无待显示的 Release 信息,可点击右上角“检查新版本”主动拉取。</p>
|
||||
<p>暂无更新版本信息,可点击右上角“检查新版本”获取最新状态。</p>
|
||||
</div>
|
||||
</Surface>
|
||||
)}
|
||||
@@ -988,9 +988,9 @@ export default function UpdatePage({
|
||||
{!info.configured && (
|
||||
<div className="tn-update-explainer">
|
||||
<div>
|
||||
<strong>当前为手动开发/源码维护模式</strong>
|
||||
<strong>当前运行环境未启用后台自动更新服务</strong>
|
||||
<p>
|
||||
检测到当前以开发或无守护模式运行。生产服务器使用 curl / systemd 安装并部署后,将自动启用此处的一键全自动在线更新。
|
||||
系统当前处于独立运行模式。若需开启在线一键更新,请配置系统后台更新守护进程。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1001,7 +1001,7 @@ export default function UpdatePage({
|
||||
{/* Confirmation Dialog */}
|
||||
<Dialog
|
||||
visible={Boolean(confirmVersion)}
|
||||
header={confirmAction === "download" ? "确认下载更新包" : "确认立即更新并平滑重启"}
|
||||
header={confirmAction === "download" ? "确认下载更新包" : "确认立即应用更新并重启服务"}
|
||||
confirmBtn={{
|
||||
content: confirmAction === "download" ? "确认下载" : "立即更新",
|
||||
theme: "primary",
|
||||
@@ -1021,21 +1021,21 @@ export default function UpdatePage({
|
||||
{confirmAction === "download" ? (
|
||||
<>
|
||||
<p>
|
||||
即将从官方 Release 源拉取 <strong>v{confirmVersion}</strong> 安装包。
|
||||
即将从官方渠道下载 <strong>v{confirmVersion}</strong> 版本安装包。
|
||||
</p>
|
||||
<p className="text-secondary">
|
||||
下载将在后台独立执行,并自动校验 SHA-256 哈希清单与 Ed25519 签名,不会中断当前记账工作。
|
||||
安装包将在后台静默下载并完成安全性校验,期间不影响系统的正常使用。
|
||||
</p>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<p>
|
||||
即将应用已就绪的 <strong>v{confirmVersion}</strong> 更新包。
|
||||
即将应用 <strong>v{confirmVersion}</strong> 版本更新包并升级系统。
|
||||
</p>
|
||||
<div className="tn-update-safety-tips">
|
||||
<div>• 系统更新前将自动备份当前 SQLite 数据库与附件目录;</div>
|
||||
<div>• 服务将短暂重启约 15~30 秒,期间页面保持心跳重连并在完成后平滑刷新;</div>
|
||||
<div>• 切换操作具备原子性,若健康检查异常将自动回退至当前版本。</div>
|
||||
<div>• 更新前将自动创建数据与凭据附件快照,保障数据资产安全;</div>
|
||||
<div>• 服务将进行平滑重启(预计 15~30 秒),更新完成后页面将自动刷新恢复;</div>
|
||||
<div>• 系统具备自动容灾保护,若升级验证异常将自动回退至当前版本。</div>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -173,7 +173,7 @@ export const MOCK_SCENARIOS: Record<MockScenario, MockUpdateState> = {
|
||||
},
|
||||
backing_up: {
|
||||
title: "数据备份中(更新保护)",
|
||||
description: "正在为 /var/lib/tallynote 生成自动还原快照",
|
||||
description: "正在为系统数据生成安全快照备份",
|
||||
info: {
|
||||
configured: true,
|
||||
strategy: "systemd",
|
||||
@@ -194,7 +194,7 @@ export const MOCK_SCENARIOS: Record<MockScenario, MockUpdateState> = {
|
||||
},
|
||||
applying: {
|
||||
title: "服务平滑重启中(倒计时中)",
|
||||
description: "已原子切换版本,systemd 正在热重启,前端实时探活",
|
||||
description: "已安全切换版本,服务正在热重启并检验状态",
|
||||
info: {
|
||||
configured: true,
|
||||
strategy: "systemd",
|
||||
@@ -269,7 +269,7 @@ export const MOCK_SCENARIOS: Record<MockScenario, MockUpdateState> = {
|
||||
},
|
||||
disabled: {
|
||||
title: "手动源码模式",
|
||||
description: "未接入 systemd 时的只读说明与命令引导展示",
|
||||
description: "未启用后台守护时的更新提示与引导说明",
|
||||
info: {
|
||||
configured: false,
|
||||
strategy: "disabled",
|
||||
|
||||
Reference in New Issue
Block a user