gitcat
1{{define "content"}}
2{{template "adminnav" (dict "Tab" "upgrade")}}
3<div class="pagehead">
4 <h1>版本与升级</h1>
5 <p class="muted">查看当前版本、检查更新,并在备份旧程序后一键完成替换。</p>
6</div>
7
8<div class="split">
9 <div class="col-main">
10 <div class="card">
11 <h3 class="card-title">当前版本</h3>
12 <ul class="kv">
13 <li><span>版本</span><strong>{{.Data.Version}}</strong>{{if .Data.IsDev}} <span class="tag tag-warn">开发构建</span>{{end}}</li>
14 {{if .Data.HasCommit}}<li><span>提交</span><code class="csha">{{.Data.Commit}}</code></li>{{end}}
15 {{if .Data.BuildDate}}<li><span>构建时间</span><span class="muted small">{{.Data.BuildDate}}</span></li>{{end}}
16 <li><span>平台</span><code class="csha">{{.Data.Platform}}</code></li>
17 <li><span>数据库结构</span><code class="csha">v{{.Data.SchemaVersion}} / 支持到 v{{.Data.SchemaSupported}}</code></li>
18 <li><span>上次检查</span><span class="muted small">{{.Data.LastCheckText}}</span></li>
19 </ul>
20 {{if not .Data.ExeReady}}
21 <p class="tag tag-warn">无法定位当前可执行文件</p>
22 <p class="hint">若以 <code class="csha">go run</code> 方式启动,程序无法自我替换,请改为部署编译好的二进制后再使用一键升级。路径:<code class="csha">{{if .Data.ExePath}}{{.Data.ExePath}}(未找到){{else}}未知{{end}}</code></p>
23 {{end}}
24 {{if not .Data.RestartSupported}}
25 <p class="hint">当前部署方式不支持自动重启,升级后需要手工重启服务。</p>
26 {{end}}
27 </div>
28
29 {{if .Data.Pending}}
30 <div class="card danger-card">
31 <h3 class="card-title">有待生效的升级</h3>
32 <p>程序已从 <strong>{{.Data.PendingFrom}}</strong> 替换为 <strong>{{.Data.PendingTo}}</strong>,但当前进程仍是旧版本。</p>
33 <ul class="kv">
34 <li><span>替换时间</span><span class="muted small">{{datetime .Data.PendingAt}}</span></li>
35 <li><span>旧程序备份</span><code class="csha">{{.Data.PendingBackup}}</code></li>
36 </ul>
37 <form method="post" action="/admin/upgrade">
38 <input type="hidden" name="csrf" value="{{.CSRF}}">
39 <input type="hidden" name="action" value="restart">
40 <button class="btn btn-primary" type="submit">立即重启使其生效</button>
41 </form>
42 </div>
43 {{end}}
44
45 <div class="card">
46 <h3 class="card-title">升级源</h3>
47 <form method="post" action="/admin/upgrade">
48 <input type="hidden" name="csrf" value="{{.CSRF}}">
49 <input type="hidden" name="action" value="save">
50 <label class="field">
51 <span>版本清单地址</span>
52 <input type="url" name="upgrade_url" placeholder="https://example.com/gitcat/releases.json" value="{{.Data.UpgradeURL}}">
53 <em class="field-hint">一个返回 JSON 的地址,需包含版本号、下载地址与 sha256;留空则只能查看版本、不能升级。</em>
54 </label>
55 <label class="check">
56 <input type="checkbox" name="auto_apply" {{if .Data.AutoApply}}checked{{end}}>
57 <span>重启后自动安装已下载的新版本<em>需配合服务管理器(如 systemd)使用</em></span>
58 </label>
59 <button class="btn btn-primary" type="submit">保存升级设置</button>
60 </form>
61 <form method="post" action="/admin/upgrade" class="inline-form">
62 <input type="hidden" name="csrf" value="{{.CSRF}}">
63 <input type="hidden" name="action" value="check">
64 <button class="btn btn-ghost" type="submit">检查更新</button>
65 </form>
66 </div>
67 </div>
68
69 <aside class="col-side">
70 <div class="card about">
71 <h3>升级清单格式</h3>
72 <pre class="code">{
73 "latest": "1.2.0",
74 "min_supported": "1.0.0",
75 "releases": [{
76 "version": "1.2.0",
77 "url": "https://…/gitcat-linux-amd64",
78 "sha256": "ab12…",
79 "size": 8388608,
80 "os": "linux",
81 "arch": "amd64",
82 "notes": "修复推送越权"
83 }]
84}</pre>
85 <p class="hint">平台标识为 <code class="csha">linux/amd64</code>、<code class="csha">darwin/arm64</code> 等;<code class="csha">os</code> 与 <code class="csha">arch</code> 可省略,表示不限平台。</p>
86 </div>
87 <div class="card tip-card">
88 <h3>升级是怎么做的</h3>
89 <ul class="tips">
90 <li>下载到 <code class="csha">data/tmp</code>,先校验 sha256 与体积;</li>
91 <li>再试运行一次 <code class="csha">-version</code>,确认新程序真的能跑;</li>
92 <li>把当前程序备份到 <code class="csha">{{.Data.BackupDir}}</code>;</li>
93 <li>替换成功后写待重启标记,重启时自动确认并清除。</li>
94 </ul>
95 <p class="hint">前四步里任何一步失败都不会动现有程序,服务照常运行。</p>
96 </div>
97 </aside>
98</div>
99{{end}}