跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

Back to all posts

通过 Cloudflare Tunnel 分享 sandbox 预览

Sandboxes 可以通过 sandbox.tunnels 命名空间将容器内运行的服务暴露到公共预览 URL。SDK 在 sandbox 内部使用 cloudflared,因此你可以在不配置 exposePort() 或自定义域名的情况下共享正在运行的服务。

默认情况下,sandbox.tunnels.get(port) 会在零配置的 *.trycloudflare.com URL 上创建一个快速隧道——无需 Cloudflare 账户、DNS 记录或自定义域名。这非常适合快速开发以及 .workers.dev 部署。

import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "my-sandbox");
await sandbox.startProcess("python -m http.server 8080");

const tunnel = await sandbox.tunnels.get(8080);
console.log(tunnel.url); // → https://random-words-here.trycloudflare.com
import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "my-sandbox");
await sandbox.startProcess("python -m http.server 8080");

const tunnel = await sandbox.tunnels.get(8080);
console.log(tunnel.url); // → https://random-words-here.trycloudflare.com

命名隧道

如需更多控制,你可以通过 sandbox.tunnels.get(port, { name }) 创建命名隧道。命名隧道绑定一个由 Cloudflare Tunnel 支持的主机名(<name>.<your-zone>),并在你的区域上创建 CNAME 记录,最终生成类似 https://my-app-preview.example.com 的地址。

与每次都生成新随机 URL 的快速隧道不同,命名隧道生成的持久 URL 在容器重启后仍然有效。这使命名隧道适用于需要对隧道及其源站进行控制的生产用途。

const tunnel = await sandbox.tunnels.get(8080, { name: "my-app-preview" });
console.log(tunnel.url); // → https://my-app-preview.example.com
const tunnel = await sandbox.tunnels.get(8080, { name: "my-app-preview" });
console.log(tunnel.url); // → https://my-app-preview.example.com

调用 sandbox.destroy() 会在销毁容器的同时拆除 Cloudflare Tunnel 和关联的 DNS 记录,因此不会留下悬空的隧道或记录。

升级

升级到最新版本:

npm i @cloudflare/sandbox@latest

有关完整的 API 详情,请参阅 Sandbox 隧道参考