基于免费的Cloudflare搭建单细胞可视化网站

这一篇是在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设置自定义域名。

image-1768737508340

如果你的后台服务器处于内网

借助于赛博活菩萨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_IDHOST_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 入口)

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×