这一篇是在AtlasMap重构已发表的单细胞数据库的基础上,使用Cloudflare提供的page和worker功能进行前后端分离搭建。
如果你的后台服务器可以公网访问
在frontend生成用于发布的静态文件,这里你需要设置你的后台服务器。
UPSTREAM_ORIGIN=http://your.backend.server npm run build:cloudflare
此时会在frontend目录下生成两个子目录:
- dist: 静态资源站点
- functionns : 基于worker实现方向代理
使用cloudflare wrangler命令进行部署。这一步需要你的注册一个Cloudflare的账号
# 1) 登录
npx wrangler login
# 2) (可选)创建 Pages 项目
npx wrangler pages project create <PROJECT_NAME>
# 3) 部署:在项目根目录执行(根目录要有 functions/)
npx wrangler pages deploy dist --project-name <PROJECT_NAME>
注: 后台服务器 nginx 转发设置保持不变,参考AtlasMap重构已发表的单细胞数据库里的后端配置部分。
此时,他会提供一个跟项目关联的域名给你,类似于 https://plantcellatlas.pages.dev , 当然你也可以选择使用CNAME设置自定义域名。

如果你的后台服务器处于内网
借助于赛博活菩萨Cloudflare提供tunnel服务。
目标:无需公网服务器/公网 IP(后端在内网/NAT/校园网),实现前后端分离部署:
- 前端:Cloudflare Pages 托管静态站点
- 后端:任意一台可出网的机器上运行
server/bin/server(只需本机可监听端口) - 连接:用 Cloudflare Tunnel 把后端暴露到一个 Cloudflare 子域名;前端通过 Pages Functions 同源代理
/api/*、/d/*到该子域名(浏览器侧无 CORS 问题)
注: 后端主机必须能连通到Cloudflare tunnel服务, 参考Connectivity pre-checks, 即,如果内网服务器被屏蔽这类服务,或者无法访问外网,无法使用改方案。
后端:启动服务(内网机器即可)
后端数据准备与 server.yaml 配置同其它方式一致,然后在后端机器上启动:
server/bin/server -config "data/server.yaml"
默认后端监听 :8080(以实际配置为准)。不需要给这台机器配置公网 IP,也不需要额外的 nginx 反代(Tunnel 会负责入口)。
后端:创建并运行 Cloudflare Tunnel
从Github上下载cloudflared
wget https://github.com/cloudflare/cloudflared/releases/download/2026.1.1/cloudflared-linux-amd64
mv cloudflared-linux-amd64 cloudflared
chmod +x cloudflared
参考Create a locally-managed tunnel
安装完成后,登录并创建 Tunnel, 此时会弹出一个网页,要求你选择一个 Cloudflare 托管域名下的子域名作为上游入口
cloudflared tunnel login
创建一个隧道,名字自取,这里我写的是atlasmap
cloudflared tunnel create atlasmap
后续步骤中的<USER>, TUNNEL_ID 和 HOST_DOMAIN 是需要根据实际结果进行修改。
创建 cloudflared 配置文件(示例路径 ~/.cloudflared/config.yml):
tunnel: atlasmap
credentials-file: /home/<USER>/.cloudflared/<TUNNEL_ID>.json
ingress:
- hostname: <HOST_DOMAIN>
service: http://127.0.0.1:8080
- service: http_status:404
建立DNS记录(非常重要,也可以在Cloudflare dashboard中DNS里面手动创建)
cloudflared tunnel route dns atlasmap <HOST_DOMAIN>
启动 Tunnel:
cloudflared tunnel run atlasmap
日志信息只要不出现ERR都算运行正常。
可选:将 Tunnel 配置为 systemd 服务,保证重启后自启动(按 cloudflared 官方文档即可)。
前端:构建 Cloudflare Pages 产物(包含 Functions 代理)
本项目已提供 Pages Functions 的同源代理实现:部署到 Pages 后,/api/* 与 /d/* 会被转发到 UPSTREAM_ORIGIN 指定的上游。
在 frontend/ 目录构建(把上游指向刚才的 Tunnel 子域名):
cd frontend
UPSTREAM_ORIGIN=<HOST_DOMAIN> npm run build:cloudflare
构建完成后会生成:
frontend/dist/:静态站点frontend/functions/:Pages Functions(同源反代/api/*、/d/*)
部署到 Cloudflare Pages
用 wrangler 一键发布
cd frontend
npx wrangler login
npx wrangler pages project create <PROJECT_NAME>
npx wrangler pages deploy dist --project-name <PROJECT_NAME>
验证与排错
- 访问 Pages 域名(例如
https://<PROJECT>.pages.dev) - 打开浏览器 Network:确认请求打到同源的
/api/...、/d/...(由 Pages Functions 转发到https://api.example.com) - 如果接口返回 502/超时:
- 确认后端机器上
server正在运行,且本机可访问http://127.0.0.1:8080/health(或你配置的健康检查) - 确认
cloudflared tunnel run ...正在运行,且api.example.com已在 Cloudflare DNS 中生效 - 确认
UPSTREAM_ORIGIN使用https://api.example.com(Tunnel 默认提供 HTTPS 入口)
- 确认后端机器上
