logo
1
1
WeChat Login
docs: refine product readme copy

BringCDN Serve

English

BringCDN Serve 是一个可配置的 CDN 源站服务,面向 CNB、GitHub 和 npm 资源分发。它提供兼容 jsDelivr 的资源路径、目录浏览、静态资源准入、响应内容改写,以及可配置品牌信息的包页面。

亮点

  • 用同一个 HTTP 服务分发 CNB 仓库、GitHub 仓库和 npm 包资源。
  • 使用统一模板展示仓库和包目录,页面内容和品牌信息可配置。
  • 文件响应支持 GETHEAD、Range 请求、CORS 响应头和耗时响应头。
  • CNB 和 GitHub 的 Git LFS pointer 会在服务端解析,客户端拿到真实对象。
  • 支持兼容 jsDelivr 的 /gh//github//npm/ 资源路径。
  • 文本响应内容可按规则改写,适合替换 CDN 域名。
  • 默认清理上游噪声响应头,包括常见 Cloudflare 响应头。
  • 站点名、页脚、ICP备案、公安备案、badge 图片/API、落地页文字都可通过环境变量配置。
  • 静态资源准入支持 header、query、cookie 和 bearer token。

路由

  • /cnb/{repo-path}@{ref}/{path}
  • /gh/{owner}/{repo}@{ref}/{path}/gh/{owner}/{repo}/{path}
  • /github/{owner}/{repo}@{ref}/{path}/github/{owner}/{repo}/{path}
  • /npm/{package}@{version-or-tag}/{path}/npm/{package}/{path}
  • /npm/@{scope}/{package}@{version-or-tag}/{path}/npm/@{scope}/{package}/{path}

/ 结尾的目录 URL 会渲染 templates/index.html。文件 URL 会返回 provider 资源 body;只有 REWRITE_ENABLED=true 且响应是文本类型时才会改写内容。未指定版本的 npm URL 会跳转到 latest;npm dist-tag 和简单 major/minor 别名(例如 @latest@next@18@18.2)会解析到具体版本。

Provider Token

CNB 和 GitHub 路由只有配置 token 后才启用:

  • CNB_TOKEN:启用 /cnb/,作为原始 Authorization 头发送。
  • GITHUB_TOKEN:启用 /gh//github/,作为 Bearer <token> 发送。
  • NPM_TOKEN:可选。公开 npm 不需要;私有 registry/package 或 registry 认证场景再配置。

不要提交 .env,里面通常会有密钥。

配置

复制 .env.example.env 后修改:

cp .env.example .env

程序启动时会先加载工作目录下的 .env。如果进程环境变量里已经有同名配置,则进程环境变量优先。

关键变量:

  • PORT / ADDR:监听端口或地址。
  • TEMPLATE_PATH:目录页模板,默认 templates/index.html
  • USER_AGENT:请求上游 provider 时使用的 User-Agent。
  • CNB_API_BASE_URL:默认 https://api.cnb.cool
  • CNB_WEB_BASE_URL:默认 https://cnb.cool,用于页面里的仓库链接。
  • GITHUB_API_BASE_URL:默认 https://api.github.com
  • GITHUB_LFS_BASE_URL:默认 https://github.com,用于 Git LFS batch 下载解析。
  • GITHUB_RAW_BASE_URL:默认 https://raw.githubusercontent.com
  • NPM_REGISTRY_URL:默认 https://registry.npmjs.org
  • STRIP_RESPONSE_HEADERS:需要移除的响应头,逗号分隔。

品牌和页脚

以下字段只有配置后才会渲染:

  • SITE_NAME
  • SITE_HOME_URL
  • LANDING_TEXT
  • FOOTER_LOGO_SRC
  • FOOTER_NAME
  • FOOTER_COPYRIGHT
  • ICP_TEXT
  • ICP_URL
  • POLICE_TEXT
  • POLICE_URL
  • BADGE_HTML
  • BADGE_SVG
  • BADGE_IMG_SRC
  • BADGE_HREF
  • BADGE_TITLE
  • BADGE_ALT

品牌字段支持占位符:

{site_name}, {home_url}, {provider}, {kind}, {provider_key}, {resource}, {resource_url}, {ref}, {path}

{provider_key} 会把 GitHub 映射为 gh。例如 badge API:

BADGE_IMG_SRC=https://cdn.bring.cool/cdn-cgi/package/{provider_key}/{resource}

GitHub 资源会渲染为:

https://cdn.bring.cool/cdn-cgi/package/gh/dler-io/Rules

响应内容改写

文本响应改写由这些变量控制:

REWRITE_ENABLED=true
REWRITE_TEXTUAL_TYPES=text/,application/javascript,application/json,text/css,image/svg+xml
REWRITE_PAIRS=cdn.jsdelivr.net=>cdn.bring.cool||fastly.jsdelivr.net=>cdn.bring.cool

REWRITE_PAIRS 格式是 from=>to||from=>to。允许空替换。

非文本响应会保持流式转发,不改 body。代理响应会包含:

  • bring-upstream-ms
  • bring-rewrite-ms

静态资源准入

静态资源准入会作用在配置的扩展名上:

  • STATIC_ACCESS_ENABLED:默认 true
  • STATIC_ACCESS_EXTS:文件扩展名,逗号分隔。
  • STATIC_ACCESS_HEADER:默认 bring-origin
  • STATIC_ACCESS_VALUES:允许的值,逗号分隔,默认 EdgeoneBackSource
  • STATIC_ACCESS_QUERY:query 参数名,默认 bring-origin
  • STATIC_ACCESS_COOKIE:cookie 名,默认 bring-origin
  • STATIC_ACCESS_BEARER_TOKENS:允许的 bearer token,逗号分隔。

运行

go run .

然后打开:

http://127.0.0.1:8080/npm/is-number@7.0.0/

CNB 和 GitHub 路由需要先在 .env 里配置对应 token。

Docker

构建镜像:

docker build -t docker.cnb.cool/bring/project/bringcdn/serve:latest .

通过环境变量运行预构建镜像:

docker run --rm -p 8080:8080 \
  -e SITE_NAME=BringCDN \
  -e GITHUB_TOKEN=github_pat_xxx \
  -e CNB_TOKEN=your_cnb_token \
  docker.cnb.cool/bring/project/bringcdn/serve:latest

或者挂载本地 .env

docker run --rm -p 8080:8080 \
  -v "$PWD/.env:/app/.env:ro" \
  docker.cnb.cool/bring/project/bringcdn/serve:latest

测试

go test ./...