BringCDN Serve 是一个可配置的 CDN 源站服务,面向 CNB、GitHub 和 npm 资源分发。它提供兼容 jsDelivr 的资源路径、目录浏览、静态资源准入、响应内容改写,以及可配置品牌信息的包页面。
GET、HEAD、Range 请求、CORS 响应头和耗时响应头。/gh/、/github/、/npm/ 资源路径。/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)会解析到具体版本。
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_NAMESITE_HOME_URLLANDING_TEXTFOOTER_LOGO_SRCFOOTER_NAMEFOOTER_COPYRIGHTICP_TEXTICP_URLPOLICE_TEXTPOLICE_URLBADGE_HTMLBADGE_SVGBADGE_IMG_SRCBADGE_HREFBADGE_TITLEBADGE_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-msbring-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 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 ./...