🌳

Yggdrasil 控制台

Cloudflare 边缘应用版本与文件分发系统

🌳 Yggdrasil Cloudflare Edge
📱 应用发布
📁 通用文件
⚙️ 鉴权与设置
🧪 接口调试台
📖 API 文档
⚠️
系统资源配置提示
已托管应用 / 版本
0 / 0
活跃应用与发布版本总数
通用文件数
0
静态文件与归档资源
R2 存储占用
0 MB
Cloudflare R2 零出口流量费用
累积分发下载量
0
支持全量 HTTP Range 续传

应用与 APK 发布管理

支持多 App 统一托管、数字版本比对 (versionCode)、渠道隔离与断点续传

通用文件分发

支持配置、文档、安装包等任意文件存储,支持自定义短链别名快捷下载

文件名称 分类 大小 快捷别名 (短链) 下载次数 上传时间 操作

API 鉴权与系统设置

在控制台随时开启或关闭开放接口的 Token 校验,设置自定义固定 Token

🔒 客户端 API Token 鉴权设置

启用全局 API Token 校验 开启后,客户端必须携带正确 Token 才能访问开启了校验的接口
客户端可在 Header 传入 X-Ygg-Token: <token>、Authorization: Bearer <token> 或 Query 参数 ?token=<token>

细粒度接口 Token 校验开关

App 版本检测接口 (/api/v1/app/latest) 是否要求手机 App 必须携带 Token 才能检测最新版本
App APK 下载接口 (/api/v1/app/download) 是否要求下载 APK 安装包时携带 Token
通用文件下载接口 (/api/v1/files/:id/download, /f/:alias) 是否要求下载通用文件资源时携带 Token

🧹 R2 存储自动清理策略

自动删除超过指定天数的旧版本安装包,始终保留每个渠道最新 N 个版本,防止 R2 存储被历史包占满。

启用自动清理 开启后,系统将每天凌晨自动扫描并清理超期旧版本 APK
默认 90 天,建议根据发版频率调整
即使超期,也会保留每个 App 每个渠道最新的 N 个版本

客户端接口调试台 & 开发者指南

一键模拟 Android / iOS / 客户端调用版本检测接口与下载请求

🧪 模拟版本检测请求

curl -i ...

📦 响应结果 (JSON)

点击左侧按钮发起测试...

API 接口参考文档

详细的接口协议、参数说明、状态码与移动端多语言客户端接入代码

GET /api/v1/app/latest (别名: /api/v1/version/check)

供手机 App 启动时或点击“检查更新”时调用。服务端根据传入的 version_code 自动判断是否存在新版本及是否强制更新。

请求参数 (Query String)

参数名 类型 必填 说明 示例
app_id String 是 应用包名或唯一标识 com.example.app
version_code Integer 否 客户端当前安装的版本号 (整数) 10000
channel String 否 渠道标识,默认 default default / beta
token String 否 若开启了 Token 校验,可在此或 Header 传入 ygg_sec_xxx

成功响应示例 (JSON)

{ "code": 0, "message": "success", "data": { "has_update": true, // 是否有更新 (latest_version_code > current_version_code) "is_force": false, // 是否强制更新 (标记强更或低于最低兼容版本) "app_id": "com.example.app", "app_name": "掌上办公", "icon_url": "https://example.com/icon.png", "current_version_code": 10000, "latest_version_code": 10200, "latest_version_name": "1.2.0", "min_version_code": 10000, "channel": "default", "changelog": "- 优化文件下载速度 - 修复已知崩溃Bug", "download_url": "https://your-worker.workers.dev/api/v1/app/download?app_id=com.example.app&version_code=10200", "file_name": "app-v1.2.0.apk", "file_size": 45829104, "file_md5": "e10adc3949ba59abbe56e057f20f883e", "release_time": "2026-08-18T10:00:00Z" } }
GET /api/v1/app/download

APK 安装包下载接口。原生支持 HTTP Range 206 断点续传,兼容 Android 系统自带 DownloadManager、OkHttp、iOS 下载组件及各大下载器。

# 断点续传测试 (分片请求 Range: bytes=0-1023) curl -i -H "Range: bytes=0-1023" "https://your-worker.workers.dev/api/v1/app/download?app_id=com.example.app" # 返回响应头: HTTP/1.1 206 Partial Content Content-Type: application/vnd.android.package-archive Accept-Ranges: bytes Content-Range: bytes 0-1023/45829104 Content-Length: 1024

📁 通用文件下载与检测接口

  • 元数据检测: GET /api/v1/files/check?alias=xxx 或 GET /api/v1/files/:id/check
  • 通过 ID 下载: GET /api/v1/files/:id/download
  • 通过短链别名下载: GET /f/:alias (例如: /f/my-config)

💻 客户端接入代码模版 (Android Kotlin)

// 1. 版本检测 val url = "https://your-worker.workers.dev/api/v1/app/latest?app_id=com.example.app&version_code=10000" val request = Request.Builder().url(url).addHeader("X-Ygg-Token", "your_token").build() client.newCall(request).enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { val json = JSONObject(response.body?.string() ?: "") val data = json.getJSONObject("data") val hasUpdate = data.getBoolean("has_update") val downloadUrl = data.getString("download_url") // 若有更新,引导用户下载或自动拉起下载 } }) // 2. 断点续传下载 val downloadReq = Request.Builder() .url(downloadUrl) .addHeader("Range", "bytes=${existingFile.length()}-") .build()

创建新应用

客户端检测更新的核心标识符,创建后不可修改

发布新版本

📦
点击或将 APK 文件拖拽至此区域
支持大文件自动分块直传 Cloudflare R2
可填入 CDN、GitHub Release、网盘直链等任何可以直接下载的外部链接
开启边缘反向代理加速 (Reverse Proxy) 默认关闭为 302 重定向跳转到第三方下载;开启后由当前 Worker 节点代理流式传输,隐藏源站真实 IP 并支持断点续传
必须大于旧版本号
是否设为强制更新 (Force Update) 勾选后,客户端检测更新时将标记必须升级

上传通用文件

📄
点击或将文件拖拽至此
支持配置文件、文档、媒体、安装包等任意类型
可通过 /f/<alias> 直接下载