发布下载
把 GitHub 仓库 (含私有仓库) 的 Release 附件通过 CZL Connect 的固定地址对外分发。仓库不必公开,也不用为每个应用单独部署下载后端:下载请求由 CZL Connect 换成短时效签名链接后 302 跳转,文件流经国内可访问的加速域名,不经过 CZL Connect 服务器。
适用场景
- 客户端软件的源码在私有仓库,但构建产物需要公开下载
- 官网"下载最新版"按钮需要一个不随版本变化的地址
- 客户端自动更新需要读取最新版本号、更新说明与各平台安装包地址
开通条件
发布下载按应用所有者的套餐开放,发布源数量为账户内所有应用合计:
| 套餐 | 发布源数量 |
|---|---|
| Lite | 不支持 |
| Plus | 3 个 |
| Pro | 20 个 |
| Enterprise | 不限 |
套餐到期降级到 Lite 后,已配置的下载地址返回 403 source_disabled,配置保留,续费后自动恢复。应用被停用时同样不可下载。
配置发布源
进入应用详情 → "发布下载",点击"添加发布源":
| 字段 | 说明 |
|---|---|
| 名称 | 仅后台展示,如"桌面客户端" |
| GitHub 仓库 | owner/name,也可直接粘贴仓库地址 |
| 下载标识 | 全站唯一,3-48 位小写字母、数字或连字符,构成下载地址 /dl/{标识}/…;修改后旧地址立即失效 |
| 访问令牌 | 私有仓库必填,公开仓库可留空 |
| 别名 | 必填,至少一个,决定哪些文件公开,见下文 |
保存时会用令牌实际访问一次仓库,无权访问则无法保存。新建、修改、删除都需要通行密钥确认,并记入操作日志。
访问令牌
推荐使用 GitHub Fine-grained personal access token:
- GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token
- Repository access 选择 Only select repositories,只勾选需要分发的仓库
- Permissions → Repository permissions → Contents 设为 Read-only,其它保持 No access
- 设置合适的有效期;到期前在发布源编辑页填入新令牌即可,留空表示沿用原令牌
令牌加密存储,保存后不再回显,列表只展示末 4 位。令牌失效或失去仓库权限时,发布源卡片会显示错误提示,下载地址返回 503 source_unavailable,更新令牌后恢复。
公开仓库留空令牌即走匿名访问。匿名访问的版本信息查询额度由所有匿名发布源共享且很低,版本信息会缓存更久 (最新版约 5 分钟可见);下载量较大时仍建议填写令牌。
别名
只有别名指向的文件会公开:下载地址、版本清单与下载页都只认别名,未配置别名的构建产物 (调试包、内部工具、更新元数据等) 一律无法下载,也不会出现在任何公开接口中。
别名有两种来源:
| 来源 | 适用 | 返回方式 |
|---|---|---|
| Release 附件 | 安装包、压缩包等构建产物 | 302 到短时效签名链接,文件不经过 CZL Connect |
| 仓库文件 | 仓库里的小文件,如带签名的更新清单、校验文件 | CZL Connect 读取后原样返回,不超过 1 MB |
Release 附件
每个版本的附件名通常带版本号,例如 myapp-1.2.3-windows-amd64.zip。为附件配置别名后,对外地址固定不变:
| 别名 | 匹配规则 |
|---|---|
windows-x64 | *-windows-amd64.zip |
macos-arm64 | *-darwin-arm64.dmg |
linux-x64 | *-linux-amd64.tar.gz |
匹配规则支持 * (任意字符) 与 ? (单个字符),按附件顺序取第一个命中,规则尽量写精确,避免同时命中多个文件。"预览"按钮会读取最新版本,列出仓库全部附件并标出哪些会公开 (仅你可见),便于核对规则。
仓库文件
有些项目把更新清单作为普通文件提交在仓库分支里 (而不是 Release 附件),例如 CI 每次发版后提交一个签名过的 latest.json。为它配置仓库文件别名:
| 别名 | 文件路径 | 分支 |
|---|---|---|
update-manifest | latest.json | 留空 (默认分支) |
/dl/{标识}/latest/update-manifest读取所配分支 (留空为仓库默认分支) 上的最新内容,约 1 分钟内反映新提交;/dl/{标识}/{tag}/update-manifest读取该 tag 下的文件- 内容逐字节原样返回,不做任何改写,客户端用自己的公钥验签不受影响
.json按application/json返回,.txt/.sig/.sha256等文本类按纯文本返回,其它类型一律以附件下载- 仓库文件不计入下载次数 (客户端会频繁轮询清单),也不出现在版本清单与下载页中
- 私有仓库用访问令牌读取;公开仓库匿名读取,内容缓存约 5 分钟
签名清单与下载加速:清单是签名的,CZL Connect 不能也不应改动其中的下载地址。若希望客户端经 CZL Connect 下载安装包,请在 CI 签名之前把下载地址写进清单,例如 downloadUrls 首位放 https://connect.czl.net/dl/{标识}/{tag}/{安装包别名},GitHub 直链留作备用。
下载地址
以下载标识 myapp 为例:
| 地址 | 说明 |
|---|---|
GET /dl/myapp/latest/windows-x64 | 最新正式版中别名 windows-x64 命中的附件 |
GET /dl/myapp/v1.2.3/windows-x64 | 固定版本 v1.2.3 (Release 的 tag 名) |
GET /dl/myapp/latest/update-manifest | 仓库文件别名,返回文件内容 |
GET /dl/myapp/latest.json | 最新正式版的版本清单 |
- "最新正式版"与 GitHub 的 latest 语义一致:不含草稿 (draft) 与预发布 (prerelease) 版本
- 发布新版本后,
latest约 1 分钟内指向新版本 - Release 附件别名返回
302,跳转目标是有效期约 5 分钟的签名链接,不要缓存或转存跳转后的地址,每次下载都请求/dl/... - 公开端点免登录,按 IP 限速;请求过于频繁返回
429
公开下载页
每个发布源自带一个可直接分享的下载页 https://connect.czl.net/download/{标识},适合没有独立产品页的应用:
- 展示应用名称、图标、简介、官网链接,以及最新正式版的版本号、发布时间与更新说明
- 主按钮下方显示安装包的 SHA-256,点击即可复制,方便用户自行核对
- 自动识别访客的操作系统与架构 (含 Apple Silicon、Windows ARM),主按钮直接下载对应安装包,其它系统的下载入口列在下方
- 只展示别名命中的附件,按别名顺序排列;更新包、签名文件等只给客户端用的附件,可在别名旁点眼睛图标设为"不在下载页显示",其下载地址与版本清单不受影响
- 平台识别依据别名与附件名中的关键词:
windows/win/.exe/.msi、mac/macos/darwin/.dmg、linux/.AppImage/.deb、android/.apk等;架构识别x64/amd64、arm64/aarch64、universal等。附件命名包含这些关键词即可被正确归类
下载页地址可在应用详情 → "发布下载"的发布源卡片中复制。
版本清单
GET /dl/{标识}/latest.json 返回最新正式版信息,适合客户端自动更新检查:
{
"tag": "v1.2.3",
"name": "v1.2.3",
"notes": "## 更新内容\n- 修复若干问题",
"prerelease": false,
"publishedAt": "2026-10-30T08:00:00Z",
"aliases": {
"windows-x64": {
"name": "myapp-1.2.3-windows-amd64.zip",
"size": 18350080,
"contentType": "application/zip",
"sha256": "9f2c1a…(64 位十六进制)",
"url": "https://connect.czl.net/dl/myapp/v1.2.3/windows-x64"
}
}
}
清单里的下载地址一律指向固定版本,避免检查更新与实际下载之间恰好发布新版本导致版本错位。notes 是 Release 正文 (Markdown)。aliases 只包含本版本有命中的别名,清单不列出别名之外的任何附件。
sha256 是 GitHub 为该附件计算的 SHA-256 摘要 (小写十六进制),用于下载后校验文件完整性。GitHub 未提供摘要的早期附件省略该字段,客户端应把"字段缺失"与"校验不通过"区别处理。
自动更新推荐流程
- 启动时或定时请求
latest.json,用tag与本地版本做语义化版本比较 - 有新版本时展示
notes,用户确认后下载aliases[当前平台].url(跟随 302 跳转) 到临时文件 - 校验文件大小 (
size) 与 SHA-256 (sha256),任一不符即删除临时文件并提示重试,不要安装校验失败的文件 - 校验通过后再替换 / 启动安装程序
哈希校验能发现传输中断、缓存或线路导致的文件损坏与篡改;它与下载地址同源,不能替代代码签名 (Windows Authenticode、macOS Developer ID 签名与公证) 对发布者身份的证明。
错误码
错误响应体为 {"error": "<错误码>"}:
| HTTP 状态 | 错误码 | 含义 |
|---|---|---|
| 404 | source_not_found | 下载标识不存在或已删除 |
| 404 | release_not_found | 仓库没有正式版,或指定的版本不存在 |
| 404 | asset_not_found | 别名不存在,或该版本中没有该别名匹配的附件 |
| 403 | source_disabled | 发布源已停用、应用已停用或套餐不含该功能 |
| 503 | source_unavailable | 暂时无法读取仓库 (令牌失效等),带 Retry-After 头 |
| 429 | - | 请求过于频繁 |