[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1562":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":33,"discoverSource":34},1562,"sub-store-workers","Yu9191\u002Fsub-store-workers","Yu9191","Sub-Store 后端 Cloudflare Workers\u002FPages 移植版","",null,"JavaScript",247,123,197,2,0,3,7,33,9,56.08,false,"main",true,[26,27,28,29],"cloudflare-pages","cloudflare-workers","store","subscription","2026-06-12 04:00:10","\u003Cdiv align=\"center\">\n\u003Cbr>\n\u003Cimg width=\"200\" src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FYu9191\u002Fsub-store-workers\u002Fmain\u002Fpng\u002Fcloudflare4.png\" alt=\"Sub-Store Workers\">\n\u003Cbr>\n\u003Cbr>\n\u003Ch2 align=\"center\">Sub-Store Workers\u003C\u002Fh2>\n\u003C\u002Fdiv>\n\n\u003Cp align=\"center\" color=\"#6a737d\">\nSub-Store 后端的 Cloudflare Workers 移植版\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fdeploy.workers.cloudflare.com\u002F?url=https:\u002F\u002Fgithub.com\u002FYu9191\u002Fsub-store-workers\">\n\u003Cimg src=\"https:\u002F\u002Fdeploy.workers.cloudflare.com\u002Fbutton\" alt=\"Deploy to Cloudflare\">\n\u003C\u002Fa>\n\u003Cbr>\u003Cbr>\n\u003Ca href=\"mydocs\u002Fcodemap\u002Fproject-overview.md\">\n\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FArchitecture-Project_Overview-blue?style=flat-square\" alt=\"Project Overview\">\n\u003C\u002Fa>\n\u003C\u002Fp>\n\n> **注意**：一键部署按钮**仅供参考**，由于项目需要本地构建（esbuild + Sub-Store 源码），实际无法直接通过此按钮完成部署。请参照下方[手动部署步骤](#部署)。\n>\n> **自动部署**：本仓库已内置 GitHub Actions 工作流，每天自动检测上游 Sub-Store 更新并部署到 Cloudflare。只需配置 Secrets 即可开启，无需本地操作。详见 [GitHub Actions 自动同步上游](#同步更新)。\n\n## 简介\n\n将 [Sub-Store](https:\u002F\u002Fgithub.com\u002Fsub-store-org\u002FSub-Store) 后端部署到 Cloudflare Workers \u002F Pages，无需服务器，免费使用。\n\n- **零服务器**：运行在 Cloudflare 边缘网络\n- **KV 持久化**：数据存储在 Cloudflare KV\n- **完整功能**：复用原始后端全部业务逻辑（订阅管理、格式转换、下载、预览等）\n- **预编译解析器**：peggy 文法在构建时编译，避免运行时 eval()\n\n## 目录\n\n- [部署](#部署)（核心流程，建议从这里开始）\n- [进阶配置 \u002F 平台说明](#进阶配置--平台说明)（推送、环境变量、本地开发等，已折叠）\n- [FAQ](#faq)\n- [同步更新](#同步更新)\n- [Surge 面板脚本](#surge-面板脚本)\n- [致谢](#致谢) ｜ [许可证](#许可证)\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>架构说明\u003C\u002Fb>（如果你只想部署可跳过）\u003C\u002Fsummary>\n\n```\nsub-store-workers\u002Fsrc\u002F        ← Workers 适配层（6 个文件）\nSub-Store\u002Fbackend\u002Fsrc\u002F        ← 原始后端源码（直接复用）\nesbuild.js                    ← 构建脚本，通过插件桥接两者\n```\n\n仅替换了平台相关层，核心逻辑零修改：\n\n| Workers 文件 | 作用 |\n|---|---|\n| `vendor\u002Fopen-api.js` | KV 替换 fs，fetch 替换 undici |\n| `vendor\u002Fexpress.js` | Workers fetch handler 替换 Node express |\n| `core\u002Fapp.js` | 导入 Workers 版 OpenAPI |\n| `utils\u002Fenv.js` | 环境检测 |\n| `restful\u002Ftoken.js` | 允许 Workers 签发 token |\n| `index.js` | Workers 入口 |\n\n更详细的项目总图见 [`mydocs\u002Fcodemap\u002Fproject-overview.md`](mydocs\u002Fcodemap\u002Fproject-overview.md)。\n\n\u003C\u002Fdetails>\n\n## 部署\n\n> 部署总览：**1.准备 → 2.上传 Workers\u002FPages → 3.设密码（必做）→ 4.连接前端**\n>\n> 为什么两个都要部？`*.workers.dev` 在国内被 GFW 封锁，`*.pages.dev` 走 Cloudflare CDN 通常可直连。\n>\n> - **有自定义域名**：只用 Workers 即可\n> - **无自定义域名**：Pages 对外提供 API，Workers 在后台跑 Cron。\n\n### 1. 克隆仓库\n\n```bash\n# 目录结构必须如下：\n# parent\u002F\n#   ├── Sub-Store\u002F          ← 原始后端源码\n#   └── sub-store-workers\u002F  ← 本项目\n\ngit clone https:\u002F\u002Fgithub.com\u002Fsub-store-org\u002FSub-Store.git\ngit clone https:\u002F\u002Fgithub.com\u002FYu9191\u002Fsub-store-workers.git\n\ncd sub-store-workers\nnpm install\n```\n\n### 2. 登录 Cloudflare\n\n```bash\nnpx wrangler login\n```\n\n### 3. 创建 KV 命名空间\n\n```bash\nnpx wrangler kv namespace create SUB_STORE_DATA\n```\n\n将返回的 `id` 填入 `wrangler.toml`：\n\n```toml\n[[kv_namespaces]]\nbinding = \"SUB_STORE_DATA\"\nid = \"你的KV命名空间ID\"\n```\n\n### 4. 构建 & 部署\n\n**两者都需要部署：**\n\n| 部署方式 | 域名 | 用途 |\n|---|---|---|\n| **Workers** | `*.workers.dev` 或自定义域名 | API + Cron 定时同步 |\n| **Pages** | `*.pages.dev` | API（国内可直连） |\n\n> ⚠️ **执行下方部署命令前，请先确认已完成「1. 克隆仓库」「2. 登录 Cloudflare」「3. 创建 KV 命名空间」三步**，并完整阅读下文「5. 连接前端」「6. API 鉴权」两节。**部署完未设密码前 Worker 是公开的，任何人都能管理你的数据。**\n\n```bash\n# Workers 部署（含 Cron Triggers）\nnpm run deploy\n\n# Pages 部署（国内可用，一条命令）\nnpm run deploy:pages\n```\n\n> **强烈建议部署后立即设置鉴权密码**，否则任何人都能管理你的 Sub-Store 数据：\n>\n> ```bash\n> # Windows\n> npm run rotate-secret\n>\n> # Linux \u002F macOS\n> npm run rotate-secret:sh\n> ```\n>\n> 脚本会生成随机 URL-safe 密码，写入 Cloudflare Worker Secret，并复制到剪贴板。详细说明见下文“6. API 鉴权”。\n\n> Pages 部署完成后还需要在 Cloudflare Dashboard 中：\n>\n> 1. 绑定 KV 命名空间 `SUB_STORE_DATA`\n> 2. 设置鉴权密码 Secret `SUB_STORE_FRONTEND_BACKEND_PATH`\n>\n> 详细图文步骤见下文 [6. API 鉴权 → 方式 A.2 Pages 端](#6-api-鉴权强烈建议--已在第-4-步完成可跳过)。配置完成后必须再跑一次 `npm run deploy:pages` 让绑定生效。\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>自定义域名注意事项（如果你绑定了自有域名）\u003C\u002Fb>\u003C\u002Fsummary>\n\n- SSL\u002FTLS 加密模式必须设为 **Full**（Cloudflare Dashboard → 域名 → SSL\u002FTLS → 概述）\n- Cloudflare 免费 SSL 证书只覆盖**一级子域名**（`*.example.com`），不支持多级子域名（如 `a.b.example.com`）\n  - 正确 `substore.example.com`\n  - 错误 `substore.sub.example.com`（会导致 `ERR_CONNECTION_CLOSED`）\n\n\u003C\u002Fdetails>\n\n### 5. 连接前端\n\n打开 [Sub-Store 前端](https:\u002F\u002Fsub-store.vercel.app)，后端地址格式：\n\n```text\n你的域名\u002F你的密码\n```\n\n例如：\n\n```text\nhttps:\u002F\u002Fsub-store-workers.your.workers.dev\u002FaBc123XyZ\nhttps:\u002F\u002Fsub-store.your.pages.dev\u002FaBc123XyZ\n```\n\n> 注意：**末尾的 `\u002F密码` 不能省略**，否则 `\u002Fapi\u002F...` 会全部 401。\n\n部署完后访问 `https:\u002F\u002F你的域名\u002F你的密码\u002Fapi\u002Futils\u002Fworker-status`，应返回：\n\n```json\n{ \"kv\": { \"bound\": true }, \"auth\": { \"backendPathConfigured\": true } }\n```\n\n### 6. API 鉴权（强烈建议 \u002F 已在第 4 步完成可跳过）\n\n> 默认 API 无密码保护。**不设密码任何人都能管理你的订阅**。第 4 步执行 `npm run rotate-secret` 已经设过的话，可以跳过本节。\n\n> 推荐使用 **Worker \u002F Pages Secret**（加密存储）。**不要**写到 `wrangler.toml [vars]` 里——那里是明文，会随 commit 泄漏，并且 `wrangler deploy` 会用它覆盖同名 Secret，与下面的流程冲突。\n\n#### 方式 A（推荐）：使用 Cloudflare Secret\n\n##### A.1 Workers 端（项目自带脚本）\n\n仓库提供了密钥轮换脚本，一行命令完成生成 + 写入 + 复制到剪贴板：\n\n```bash\n# Windows\nnpm run rotate-secret\n\n# Linux \u002F macOS\nnpm run rotate-secret:sh\n```\n\n脚本会：\n\n- 用加密随机数生成 32 位 URL-safe 密码\n- 自动加 `\u002F` 前缀\n- 通过管道写入 Cloudflare Worker Secret `SUB_STORE_FRONTEND_BACKEND_PATH`（密码不落盘、不显示在屏幕、不进入 shell 历史）\n- 复制到剪贴板，方便粘贴到前端配置\n\n执行成功后，请同步更新：\n\n1. 前端后端地址：`https:\u002F\u002Fxxx.workers.dev\u003C剪贴板里的新密码>`\n2. 如果使用 GitHub Actions 自动部署，还要更新仓库 Secret（如 `SUB_STORE_PASSWORD_VALUE`）\n\n> 用完后建议清空剪贴板：\n> - PowerShell：`Set-Clipboard -Value $null`\n> - macOS：`pbcopy \u003C\u002Fdev\u002Fnull`\n> - Linux：`wl-copy --clear` 或 `xsel --clipboard --clear`\n\n也可以手动设置（提示输入时填带 `\u002F` 开头的密码）：\n\n```bash\nnpx wrangler secret put SUB_STORE_FRONTEND_BACKEND_PATH\n```\n\n##### A.2 Pages 端（在 Dashboard 配置）\n\n`wrangler.toml` 的 `[[kv_namespaces]]` 与 `[vars]` **只对 Workers 生效**。Pages 项目必须在 Cloudflare Dashboard 单独绑定 KV 与设置密码，否则 API 会因为缺少 KV 而 500，且任何人都可访问管理 API。\n\n**① 进入 Workers & Pages，点击 sub-store 项目**\n\n![进入项目](png\u002F1.png)\n\n**② 进入 设置 → 绑定，点击 + 添加 KV 命名空间**\n\n![添加绑定](png\u002F2.png)\n\n**③ 选择 KV 命名空间**\n\n![选择 KV](png\u002F3.png)\n\n**④ 变量名填 `SUB_STORE_DATA`，选择对应 KV，保存**\n\n![保存绑定](png\u002F4.png)\n\n**⑤ 进入 设置 → 变量和机密，点击 + 添加**\n\n![添加变量](png\u002F5.png)\n\n**⑥ 变量名填 `SUB_STORE_FRONTEND_BACKEND_PATH`，值填 `\u002F你的密码`（必须带 `\u002F` 开头），类型选 Secret（加密），保存**\n\n![填写变量](png\u002F6.png)\n\n> 保存后必须重新部署 `npm run deploy:pages` 才能生效。\n\n> Pages 不能跨项目共享 Worker Secret，建议把 Workers 与 Pages 的 `SUB_STORE_FRONTEND_BACKEND_PATH` 设为同一个值，方便前端切换。\n\n#### 方式 B（不推荐）：使用 `wrangler.toml [vars]` 明文变量\n\n```toml\n[vars]\nSUB_STORE_FRONTEND_BACKEND_PATH = \"\u002F你的密码\"\n```\n\n> 仅在临时调试时使用。明文写仓库文件容易随 commit 泄漏；同时 `wrangler deploy` 会用它覆盖 Secret，破坏方式 A 的 CI\u002FSecret 流程。生产环境请使用方式 A。\n\n> 分享链接（download\u002Fpreview）不受鉴权影响，无需密码即可访问。\n\n> **分享按钮**：订阅列表里的“分享”按钮仅在通过密码前缀访问时显示（与上游 Docker\u002FNode 部署的 `be_merge` 行为一致），未配置密码前缀的部署不会显示分享按钮。\n\n---\n\n## 进阶配置 \u002F 平台说明\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>本地开发\u003C\u002Fb>\u003C\u002Fsummary>\n\n```bash\nnpm run dev\n```\n\n访问 `http:\u002F\u002F127.0.0.1:3000`。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>推送通知（Bark \u002F Pushover）\u003C\u002Fb>\u003C\u002Fsummary>\n\n支持 HTTP URL 推送方式。在 `wrangler.toml` 中配置：\n\n```toml\n[vars]\nSUB_STORE_PUSH_SERVICE = \"https:\u002F\u002Fapi.day.app\u002F你的BarkKey\u002F[推送标题]\u002F[推送内容]\"\n```\n\nPages 需要在 Dashboard 手动添加同名环境变量。不支持 shoutrrr（命令行工具）。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>环境变量一览\u003C\u002Fb>\u003C\u002Fsummary>\n\n| 变量 | 说明 | 必填 |\n|---|---|---|\n| `SUB_STORE_FRONTEND_BACKEND_PATH` | API 路径前缀密码，推荐用 Worker Secret 管理 | 否（生产环境必设） |\n| `SUB_STORE_PUSH_SERVICE` | HTTP URL 推送地址 | 否 |\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>状态检查接口 \u002F Script Operator 限制\u003C\u002Fb>\u003C\u002Fsummary>\n\n```text\nhttps:\u002F\u002F你的域名\u002F你的密码\u002Fapi\u002Futils\u002Fworker-status\n```\n\n返回字段说明：\n\n- `kv.bound`：是否已正确绑定 KV\n- `auth.backendPathConfigured`：是否已配置鉴权\n- `auth.managementApiPublic`：管理 API 是否处于公开状态\n- `capabilities`：当前部署支持\u002F不支持的能力（脚本操作、Gist 备份、Cron 等）\n\n**脚本操作（Script Operator）受限**：Cloudflare Workers 禁止 `eval` \u002F `new Function`，本仓库在构建期将上游 `createDynamicFunction` 改为明确错误。替代方案：内置过滤\u002F操作器、mihomo YAML patch、或在外部可信服务中执行脚本。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>esbuild 插件\u003C\u002Fb>\u003C\u002Fsummary>\n\n| 插件 | 作用 |\n|---|---|\n| `路径别名解析` | 解析 `@\u002F` 导入，优先 Workers 覆盖 |\n| `eval 重写` | 将 eval() 调用替换为静态表达式 |\n| `peggy 预编译` | 构建时编译 PEG 文法，消除运行时 eval |\n| `Node 模块存根` | 存根 fs\u002Fcrypto 等不可用模块 |\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Cron 定时同步\u003C\u002Fb>\u003C\u002Fsummary>\n\nWorkers 版内置了 Cron Trigger，默认每天 **23:55（北京时间）** 自动同步 artifacts 到 Gist。\n\n可在 `wrangler.toml` 修改频率：\n\n```toml\n[triggers]\ncrons = [\"55 15 * * *\"]  # UTC 时间，+8 即北京时间\n```\n\n> 前提：在前端 Settings 中配置好 GitHub 用户名和 Gist Token。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>KV 读写优化\u003C\u002Fb>\u003C\u002Fsummary>\n\nCloudflare KV 免费额度：读 10 万次\u002F天，**写 1000 次\u002F天**。\n\n本项目已实现两层优化：\n\n- **脏标记**：仅在调用 `$.write()` \u002F `$.delete()` 时标记脏位，纯读请求不触发写入\n- **内容对比**：写入前将当前数据与加载时的快照对比，内容相同则跳过写入（防止 `$.write()` 写回相同数据）\n- **边缘缓存**：KV 读取设置 60 秒 `cacheTtl`，短时间内多次请求命中边缘缓存，不计入 KV 读次数\n\n| 操作 | KV 读 | KV 写 |\n|---|---|---|\n| 打开前端浏览数据（~8 个请求） | 1 次（其余命中缓存） | 0 次 |\n| 修改订阅\u002F设置 | 0~1 次 | 1 次 |\n| Cron 定时同步 | 1 次 | 1 次 |\n\n个人使用完全不用担心超额。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Workers 平台限制 \u002F 不支持的功能\u003C\u002Fb>\u003C\u002Fsummary>\n\n### 平台限制\n\n| 限制 | 说明 |\n|---|---|\n| **请求超时 30 秒** | 单次请求墙钟时间上限 30 秒，订阅源响应慢会超时失败 |\n| **出站 IP 为境外** | 从 Cloudflare 节点拉取订阅，部分限制国内 IP 的订阅源无法拉取 |\n| **推送通知** | 仅支持 HTTP URL 方式（Bark、Pushover 等），不支持 shoutrrr |\n\n> 如果你的订阅源限制国内访问或响应较慢，建议使用 VPS 自建 Node.js 版本。\n\n### Node 专属功能（Workers 无法实现）\n\n| 功能 | 原因 |\n|---|---|\n| 前端静态文件托管 | 需要 `express.static` + `fs`，无本地文件系统 |\n| 前端代理中间件 | 需要 `http-proxy-middleware`，Node 专属 |\n| MMDB IP 查询 | 需要读取本地 MMDB 文件（`@maxmind\u002Fgeoip2-node`） |\n| MMDB 定时下载 | 需要 `fs.writeFile` 写入本地文件 |\n| DATA_URL 启动恢复 | 需要 Node `fs` 写文件 |\n| Gist 备份定时下载 | 从 Gist 下载恢复备份的 Cron（手动触发仍可用） |\n| `ip-flag-node.js` 脚本 | 依赖本地 MMDB，可用 `ip-flag.js`（HTTP API）替代 |\n| jsrsasign TLS 指纹 | 全局作用域限制 |\n| shoutrrr 推送 | 需要 `child_process` 执行命令行工具 |\n| 代理请求 | Workers 出站走 Cloudflare 网络，不支持自定义 HTTP\u002FSOCKS5 代理 |\n\n\u003C\u002Fdetails>\n\n---\n\n## FAQ\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>常见问题\u003C\u002Fb>\u003C\u002Fsummary>\n\n**Q: 前端提示 `找不到 Sub-Store Artifacts Repository`**\nA: 正常现象，你还没创建同步配置。创建第一个同步后会自动生成。\n\n**Q: 拉取订阅超时**\nA: Workers 单次请求上限 30 秒。如果订阅源响应慢，会超时失败。可尝试换一个订阅链接。\n\n**Q: 某些订阅源返回空或报错**\nA: Workers 出站 IP 为境外 Cloudflare 节点，部分限制国内 IP 的订阅源无法拉取。\n\n**Q: 如何更新到最新版？**\nA: 见下方「同步更新」章节。\n\n**Q: 忘了设置的密码怎么办？**\nA: Worker Secret 在 Dashboard 看不到原文，无法找回。直接 `npm run rotate-secret` 重置即可。\n\n\u003C\u002Fdetails>\n\n---\n\n## 同步更新\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>更新 sub-store-workers（本项目）\u003C\u002Fb>\u003C\u002Fsummary>\n\n```bash\ncd sub-store-workers\ngit pull\nnpm run deploy\n```\n\n> Worker Secret 不会被 deploy 覆盖，密码保持不变。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>更新 Sub-Store 原始仓库\u003C\u002Fb>\u003C\u002Fsummary>\n\n当原始仓库有新版本时，手动执行：\n\n```bash\ncd Sub-Store\ngit pull\n\ncd ..\u002Fsub-store-workers\nnpm run deploy\n```\n\nesbuild 构建时会从 `Sub-Store\u002Fbackend\u002Fsrc\u002F` 读取最新源码，重新 build 即可包含新功能。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>GitHub Actions 自动同步上游（推荐）\u003C\u002Fb>\u003C\u002Fsummary>\n\n仓库内置了 `.github\u002Fworkflows\u002Fsync-upstream.yml` 工作流，每天自动检测 Sub-Store 上游更新并部署。\n\n#### 工作流程\n\n```\n每天 00:00（北京时间）自动触发\n  ↓\n拉取上游最新 commit，对比已部署版本\n  ↓ 有更新\n安装依赖 → 运行上游测试套件\n  ↓ 测试通过\n构建 → 部署 Workers → 部署 Pages → 健康检查\n  ↓ 全部成功\n记录已部署版本 + Bark 通知\n\n任何环节失败 → Bark 通知\"同步失败\"，线上版本不受影响\n```\n\n#### 配置步骤\n\n**1. 创建 Cloudflare API Token**\n\n打开 [Cloudflare API Tokens](https:\u002F\u002Fdash.cloudflare.com\u002Fprofile\u002Fapi-tokens) → Create Token → **Custom Token**，添加以下权限：\n\n| 资源 | 权限 | 级别 |\n|---|---|---|\n| Account → Workers 脚本 | 编辑 | 你的账号 |\n| Account → Cloudflare Pages | 编辑 | 你的账号 |\n| Account → Workers KV 存储 | 编辑 | 你的账号 |\n| User → 用户详细信息 | 读取 | -- |\n\nAccount Resources 选择 **Include → 你的账号**。\n\n**2. 添加 GitHub Repository Secrets**\n\n打开仓库 Settings → Secrets and variables → Actions → New repository secret，依次添加：\n\n| Secret 名称 | 值 | 说明 |\n|---|---|---|\n| `CLOUDFLARE_API_TOKEN` | 上一步创建的 Token | Cloudflare 部署认证 |\n| `CLOUDFLARE_ACCOUNT_ID` | 你的 Account ID | Cloudflare Dashboard 首页右侧可见 |\n| `KV_NAMESPACE_ID` | KV 命名空间 ID | 创建 KV 时返回的 id |\n| `PAGES_PROJECT_NAME` | Pages 项目名 | 例如 `sub-store` |\n| `WORKERS_SUBDOMAIN` | Workers 子域名 | 例如 `sub-store2`（即 `*.sub-store2.workers.dev` 中的部分）|\n| `BARK_KEY` | Bark 推送 Key | 可选，用于成功\u002F失败通知 |\n\n**3. 手动触发验证**\n\n打开仓库 Actions 页面 → Sync Upstream Sub-Store → Run workflow → 勾选 `force = true` → Run。\n\n全部绿色即配置成功，之后每天自动运行。\n\n#### 风险与失败场景\n\n| 场景 | 后果 | 处理方式 |\n|---|---|---|\n| **上游测试未通过** | 不会部署，线上不受影响 | 等上游修复后下次自动重试 |\n| **构建失败**（上游引入了 Workers 不兼容的 API） | 不会部署 | 需要手动适配 `src\u002F` 覆盖层，提 issue |\n| **Cloudflare API 超时\u002F限流** | 部署中断 | 下次自动重试 |\n| **API Token 过期或权限不足** | 部署失败 | 重新创建 Token 并更新 GitHub Secret |\n| **上游大版本重构**（目录结构变化） | 构建失败 | 需要手动更新 esbuild 配置 |\n| **健康检查失败** | Workers\u002FPages 已部署但版本标记不更新 | 手动检查线上是否正常 |\n\n> **安全提示**：Cloudflare API Token 和 Account ID 请通过 GitHub Secrets 管理，**不要**写入任何文件或提交到仓库。\n\n> **手动触发**：任何时候都可以在 Actions 页面手动 Run workflow，`force = true` 会跳过版本检查强制部署。\n\n\u003C\u002Fdetails>\n\n---\n\n## Surge 面板脚本\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>展开查看\u003C\u002Fb>\u003C\u002Fsummary>\n\n`surge\u002F` 目录下提供了一个 Surge Panel 脚本，可在 Surge 面板中实时监控 Cloudflare Workers 用量。\n\n### 功能\n\n- Workers \u002F Pages 请求次数及占比\n- KV 读写次数\n- Sub-Store 订阅数量、后端版本（可选）\n- 中英文切换\n\n### 使用方式\n\n在 Surge 中安装模块：\n\n```\nhttps:\u002F\u002Fraw.githubusercontent.com\u002FYu9191\u002Fsub-store-workers\u002Fmain\u002Fsurge\u002FSubStorePanel.sgmodule\n```\n\n安装后编辑模块参数填入：\n\n| 参数 | 说明 |\n|---|---|\n| `ID` | Cloudflare Account ID |\n| `Token` | Cloudflare API Token |\n| `Limit` | 每日请求额度，默认 `100000` |\n| `SubStoreURL` | Sub-Store 后端地址（可选，如 `https:\u002F\u002Fexample.com\u002Fyour-path`） |\n| `Lang` | 语言，`en` 或 `cn`，默认 `en` |\n\n### API Token 权限\n\n在 [Cloudflare API Tokens](https:\u002F\u002Fdash.cloudflare.com\u002Fprofile\u002Fapi-tokens) 页面创建 **Custom Token**，只需开启 **1 个权限**：\n\n| 权限 | 级别 |\n|---|---|\n| Account Analytics | Read |\n\n建议过期时间选「无过期时间」。\n\n\u003C\u002Fdetails>\n\n---\n\n## 致谢\n\n基于 [Sub-Store](https:\u002F\u002Fgithub.com\u002Fsub-store-org\u002FSub-Store) 项目，感谢原作者及所有贡献者。\n\n## 许可证\n\nGPL V3\n","Sub-Store Workers 是一个将 Sub-Store 后端移植到 Cloudflare Workers\u002FPages 的项目，允许用户在无需服务器的情况下免费使用。该项目的核心功能包括订阅管理、格式转换、下载和预览等，并且通过 Cloudflare KV 实现数据持久化存储。技术特点上，它利用了 Cloudflare 的边缘网络来运行服务，同时通过预编译解析器避免了运行时的 eval() 操作，提高了安全性。适用于需要轻量级后端支持的应用场景，特别是对于希望减少运维成本或对地理分布有要求的服务来说非常合适。此外，由于其部署方式灵活（支持自定义域名），并且可以自动同步上游更新，使得维护更加便捷。","2026-06-11 02:44:40","CREATED_QUERY"]