{{ siteTitle || '加载中…' }}

{{ address }}

{{ viewLabel }}

当前最新版

版本号 {{ latest.version }}
安装包 {{ latest.file_name }} · {{ fmtSize(latest.size_bytes) }}
上传时间 {{ fmtTime(latest.uploaded_at) }}
下载地址 {{ downloadUrl }}
签名 {{ latest.signature }}
运行参数 {{ latest.installer_args }}

签名与运行参数会原样写进 appcast 的 sparkle:edSignature 与 sparkle:installerArguments (两者都是 <enclosure> 上的属性)。

版本说明

{{ latest.notes }}

尚未上传任何版本

历史版本(共 {{ versions.length }} 个)

{{ r.version }} 当前 {{ fmtSize(r.size_bytes) }} · 上传于 {{ fmtTime(r.uploaded_at) }} 已签名 有运行参数 {{ r.file_name }} 下载

全部历史版本都保留在服务器上,不会自动清理;每个包在 release/<版本号>/package.bin。

新版本由构建流程调用 POST /api/versions/upload 上传,必填 token、version、file,可选 notes(版本说明)、signature(签名)、 installer_args(安装时传给安装包的命令行参数)。 每个版本各留一份;用同一个版本号重传则覆盖那一条。上传 token 在「设置」页生成。

客户端更新订阅(WinSparkle)

appcast {{ appcastUrl }}
下载地址 {{ downloadUrl }}
更新检查(JSON) {{ latestUrl }}

软件里设置 win_sparkle_set_appcast_url("{{ appcastUrl }}") 即可。 WinSparkle 会拉这个地址,按 sparkle:version 与本机构建版本比较, 有新版时下载并运行 enclosure 指向的安装包。尚未上传版本时,该地址返回一份 「没有可用更新」的合法订阅(而不是 404)。

注意:sparkle:version 取自上传时的「版本号」。WinSparkle 是拿它和 可执行文件的版本资源比大小的,所以要填构建版本号(如 1.4.0.0),而不只是展示名。

{{ versionsError }}

「{{ viewLabel }}」功能建设中,敬请期待

站点信息

站点名称 {{ info.name || '—' }}
访问地址 {{ address || '—' }}
应用数据目录 {{ info.storage_path || '未配置' }}

以上为本站点在服务器上的登记信息;修改请前往管理站点(manager)。

本站点的数据(上传 Token、版本记录,以及后续的用户与反馈)都存在应用数据目录 下的 app.db 里;授权私钥另存为同一目录下的 license/private_key.pem —— 两者都只属于本站点,与其它站点完全隔离。

上传 Token

上传新的可执行文件时,需在 POST 请求体中携带本 token;服务端比对不一致将拒绝上传。

{{ uploadToken }} 尚未生成(未生成时任何上传都会被拒绝)

{{ tokenMsg }}

{{ tokenErr }}

重新生成会立即作废旧 token —— 正在使用它的构建流程需要同步更新。

授权密钥

授权用非对称签名,密钥固定为 Ed25519(EdDSA):私钥只保存在本站点的应用数据目录里 (每个应用站点各持一份,互相看不到),用于签发激活码;公钥内置在软件客户端里做离线校验。 客户端内置的是 32 字节 raw 公钥,只有 Ed25519 对得上 —— 导入其它类型的密钥会被直接拒绝。 换密钥等于作废所有已发布客户端,请优先导入已有密钥对中的私钥。

密钥类型 {{ licenseKey.key_type || '—' }}
公钥指纹 {{ licenseKey.fingerprint || '—' }}
私钥文件 {{ licenseKey.path }}

本站点尚未配置授权密钥 —— 在下方导入已有私钥,或在本机生成一对新的。

私钥文件当前不可用:{{ licenseKey.error }}

当前私钥不是 Ed25519({{ licenseKey.key_type || '未知类型' }}),签不出客户端能验过的激活码 —— 请导入或生成一把 Ed25519 私钥。

当前登记:{{ licenseKey.client_public_key }} —— 与本站点私钥一致 ✓ 与本站点私钥不一致,签发的码客户端验不过 ✗

{{ licenseClientMsg }}

{{ licenseClientErr }}

只接受 Ed25519(EdDSA) 私钥(通常以 -----BEGIN PRIVATE KEY----- 开头的 PKCS#8); RSA / ECDSA 密钥签出来的激活码客户端验不过,导入会被直接拒绝。导入时做一次「签名 → 验签」自检, 服务器只保存私钥,不会回显。

只能在本机生成 Ed25519 密钥对;生成后把公钥内置到客户端并重新发布。私钥文件 0600、只在本站点的数据目录里,请自行备份 —— 丢失后无法再签发授权。

{{ licenseMsg }}

{{ licenseErr }}

签发授权

客户在软件的「设置 → 激活软件」里点「复制机器号」,拿到的就是那 16 位机器号(如 3CJ9TP8FOA7QGDL9)。授权就绑在这台机器上:客户端激活时拿码里的机器号与本机逐字符比对 (忽略大小写)。签发前请确认上面已登记客户端内置公钥 —— 对不上的话,签出来的码客户端一律验不过。

{{ issueMsg }}

{{ issueErr }}

签发台账({{ issues.length }} 笔)

台账只留激活码的哈希与签发参数,**不留明文码** —— 它回答的是"这个码是不是我们发的"。 续签照同一个机器号再签一份(到期日往后写);客户换机器 / 重装系统后机器号会变,用新机器号另签一份, 并在备注里记下原流水号。

{{ r.serial }} {{ r.customer }} {{ r.plan }} {{ r.issued_on }} → {{ r.expires_on }} {{ r.cid }} {{ r.note }} {{ fmtTime(r.created_at) }}

{{ issuesCid ? '这台机器还没有签发记录。' : '尚未签发过授权。' }}

{{ issuesError }}

校验激活码

把客户手里的码贴回来验一遍(排障用):优先按**客户端内置公钥**验 —— 那才是客户那边能不能过的答案。

{{ verifyMsg }}

{{ verifyErr }}