Webhook 要公网 HTTPS?hostc 借 Cloudflare 边缘,免注册临时穿透
本地 Vite、Next.js、Spring Boot 跑得好好的,产品经理突然说「手机扫一下看看」;GitHub / Stripe / 飞书 Webhook 只认公网 HTTPS;同事在另一座城市,你却不想为一次 Demo 买服务器、配 Nginx、等备案。这类「临时把 localhost 变成公网入口」的需求,过去常用 ngrok、frp、localtunnel,国内开发者圈子里也常见 bore(纯 TCP)和 tunnelto(HTTPS 子域名)。
2026 年又多了一条更「边缘化」的路径:hostc(Host + Cloudflare)。它把隧道控制面直接架在 Cloudflare Workers 与 Durable Objects 上,CLI 免注册、零配置,一行 npx 就能拿到类似 https://t-xxxx.hostc.dev 的临时 HTTPS。本文基于官方仓库 akazwz/hostc、文档 hostc.dev/docs 与本机实测,讲清它和 bore / tunnelto / cloudflared 的差异,以及什么时候该用、什么时候不该用。

一、hostc 到底是什么:边缘临时隧道,不是生产网关
hostc 的定位写得很克制:给本地 HTTP / WebSocket 服务一个临时公网 URL,适合分享本地 Web 应用、测 Webhook、预览带 HMR 的前端,以及把短生命周期服务暴露出去——而不是替代正式部署。
名字拆开就是 Host + Cloudflare。请求路径大致是:
1. 你在本机监听某个端口(如 3000 / 5173)。
2. CLI / SDK 连到 hostc 服务端,由 Durable Object 管理一条名为 tunnel 的公共隧道。
3. 公网客户端访问 https://t-<id>.hostc.dev,流量经 Cloudflare 边缘进入 Worker,再通过二进制 data channel(WebSocket)回传到你的本机 SDK。
4. 本机把请求代理到 http://localhost:<port>;WebSocket 升级则走 ws:// → wss:// 映射。
协议侧(官方称为 v4)把概念拆得很清楚:tunnel(DO 托管的公共隧道)、client connection(当前 CLI/SDK 连接)、data channel(SDK↔服务端 WebSocket)、stream(一次公网 HTTP 或 WebSocket)、frame(通道上的协议单元)。流一旦分配到某条 data channel 就会钉住;单条流失败只关流,通道级失败则客户端会新建临时隧道——这也解释了为什么断线后 URL 往往会变。
官方明确:hostc 仍处 preview。核心穿透路径可用,但早期协议版本故意不向后兼容,协议变更时请用
npx hostc@latest,避免全局装死旧版。
它和「买 VPS + frp」「注册 ngrok 账号绑域名」的心态完全不同:默认无账号系统、无预留域名、无控制台仪表盘、无长驻守护进程——这些都在路线图里,但当前产品刻意保持简单。

二、本机实测:一行命令拿到公网 HTTPS
环境要求很轻:Node.js 18+,本机已有 npx 即可。官方强烈建议用 @latest,让 CLI 与当前服务端协议对齐。
先起一个本地服务(任意静态站或开发服务器均可):
python3 -m http.server 8765 --bind 127.0.0.1
另开终端创建隧道:
npx hostc@latest 8765
本机实测输出(隧道 ID 每次不同):
Success Tunnel ready
Public URL: https://t-cl96jgxy3i.hostc.dev
Local: http://localhost:8765/
Tunnel: t-cl96jgxy3i
Channels: 2
此时用手机或另一台电脑打开 Public URL,就能打到本机 8765。常用变体:
# Vite 默认端口
npx hostc@latest 5173
# 指定本地绑定主机 / 多通道 / 终端二维码
hostc 3000 --local-host 127.0.0.1 --data-channels 4 --qr
# 指向自建或 staging 服务端
hostc 3000 --server https://your-hostc.example.com
# 连通性自检(本机 doctor 结果:Node / 配置 / https://hostc.dev 均 OK)
npx hostc@latest doctor
全局安装也可以,但 preview 阶段更建议每次 npx hostc@latest:
npm install -g hostc@latest
hostc 5173
配置持久化走本地文件(hostc config get|set|unset|path),例如把默认 server-url 指到自托管实例。诊断命令 hostc doctor [port] 会检查 Node、配置路径、服务端健康度,以及可选的本地端口是否在听。
给 AI Agent 的 skill:如果你用 Codex / Claude Code 一类助手帮你起预览,可安装官方 skill,让 Agent 知道「优先 npx hostc@latest <port>、等 Public URL、预览结束要停进程」:

npx skills add akazwz/hostc
停止隧道的方式就是结束 CLI 进程(交互终端通常是 Ctrl+C)。后台起的要记得 kill,否则本机端口还在被占用,公网 URL 却已失效或变成新 ID。
三、和 bore / tunnelto / cloudflared 怎么选?
仓库里我们已经写过 bore 与 tunnelto 的对比文;hostc 不是它们的「换皮」,而是第三条设计轴:把中继能力外包给 Cloudflare 边缘。下面这张表按「你真正要什么」来选。
| 维度 | hostc | tunnelto | bore | cloudflared |
|---|---|---|---|---|
| 一句话 | Cloudflare 边缘上的临时 HTTPS / WS | Rust HTTPS 子域名 + 本地调试面板 | 极简 TCP 管道 | Cloudflare Tunnel 官方客户端 |
| 公网形态 | https://t-*.hostc.dev |
https://*.tunnelto.dev |
bore.pub:端口(裸 TCP) |
你的域名 / trycloudflare 临时域 |
| 是否要账号 | 公共实例免注册 | 免费可用,绑子域名需 key | 公共实例免注册 | 正式隧道通常要 Cloudflare 账号 |
| 协议范围 | HTTP + WebSocket | 偏 Web HTTP(S) | 任意 TCP | HTTP/TCP 等,能力完整 |
| HTTPS 证书 | 边缘侧自带 | SaaS 自带 | 不管证书 | Cloudflare 侧终结 |
| 典型场景 | 临时 Demo、Webhook、Agent 预览 | 联调 + 请求面板 | SSH / DB / 游戏端口 | 长期稳定、自有域名生产入口 |
| 断线行为 | 常换新 tunnel id / URL | 视会话而定 | 重连端口可能变 | Named tunnel 可稳定 |
选型口诀(更新版):
- 只要「手机扫一下 / Webhook 打一下 / Agent 分享预览」,且不想注册 → 优先 hostc。
- 需要本地 HTTP 流量面板、固定子域名(有 API key)→ tunnelto。
- 要穿透 MySQL、SSH、非 HTTP → bore(或 frp / rathole)。
- 要绑自己的域名、做长期入口、团队统一运维 → cloudflared(或自建 frp)。
- 只要 SSH 一行、接受限时随机域 → 也可看 Pinggy / localhost.run;它们和 hostc 同属「临时档」,但中继栈不同。
hostc 的差异化卖点有三点:① 默认走 Cloudflare 全球边缘,延迟与证书链路「借」成熟基础设施;② 对带 HMR 的前端 / WebSocket 做了一等公民支持;③ 提供可嵌入的 @hostc/client SDK,方便 Electron、守护进程、自定义 CLI 把隧道嵌进产品,而不只是给人敲命令。
代价同样清楚:你依赖 Cloudflare 可达性;公共实例是匿名临时隧道,断线换 URL;暂无账号级 ACL、预留域名和长驻 daemon。把它当「演示胶布」,别当「生产前门」。

四、进阶:SDK 嵌入、自托管与安全边界
4.1 用 @hostc/client 嵌进自己的工具
CLI 只是薄产品层;协议与重连逻辑在 SDK。Node / 桌面应用可以这样起隧道:
npm install @hostc/client
import { HostcClient, localOriginAdapter } from "@hostc/client";
const client = new HostcClient({
serverUrl: "https://hostc.dev",
upstream: localOriginAdapter({
origin: "http://localhost:5173/",
}),
});
client.on("ready", (event) => {
console.log(event.publicUrl);
});
client.on("reconnecting", (event) => {
console.error(`reconnecting: ${event.reason}`);
});
await client.start();
应用代码应依赖 @hostc/client,不要直接依赖内部的 @hostc/protocol(协议包是 wire contract 的源码真源,已打进 SDK)。
4.2 自托管:Workers + 自己的域名
官方 monorepo 拆成 packages/protocol、packages/client、apps/server(Worker + Durable Object)、apps/cli。本地开发需要 Node 18+、pnpm 与 Cloudflare 账号;pnpm dev:server 起本地 Worker 后,用 HOSTC_SERVER_URL=http://127.0.0.1:8787 指向自建端。正式自托管则把 Worker 部署到自己的账号,并把 CLI --server / config set server-url 指过去。
源文与官方限制可汇总为:
| 限制 | 说明 |
|---|---|
| 子域名 | 公共实例自动分配;CLI 暂不支持自定义友好名 |
| 会话 | 客户端断开后需重连;重连常得到新 tunnel id |
| 默认域名 | 公共实例用 hostc.dev |
| 账号能力 | 尚无预留隧道、稳定域名、仪表盘、长驻 daemon |
| 协议兼容 | preview 期不保证旧 CLI 能连新服务端 |
4.3 安全与合规提醒
临时隧道等于把本机某个端口「短暂挂到公网」。务必做到:
1. 只暴露开发端口,不要穿透数据库、SSH、管理后台默认口。
2. 演示接口加 Basic Auth / Token / IP 限制(应用层自己做;hostc 公共实例目前不是安全网关)。
3. 演示结束立即 Ctrl+C;不要在 CI 里把永久密钥打进临时隧道日志。
4. 公司内网 / 合规环境先确认是否允许流量经 Cloudflare 出境。
5. 国内部分网络访问 Cloudflare 不稳定时,体验会抖——这是架构边界,不是配置手残。
五、场景清单与落地建议
| 场景 | 是否推荐 hostc | 备注 |
|---|---|---|
| 前端本地联调给测试 / 产品看 | ✅ | 一行命令 + HTTPS,手机真机友好 |
| GitHub / 支付 / 飞书 Webhook | ✅ | 填 Public URL 即可;注意 URL 会变 |
| Vite / Next HMR、WebSocket Demo | ✅ | 官方强调 WS / HMR 路径 |
| Agent 自动起公网预览 | ✅ | 配合 npx skills add akazwz/hostc |
| 长期生产 API 入口 | ❌ | 用 cloudflared / 正规部署 |
| 穿透 SSH / MySQL | ❌ | 用 bore / frp / Tailscale 等 |
| 需要固定子域名与流量面板 | ⚠️ | 更看 tunnelto 或自建方案 |
实践建议:把 hostc 放进个人「应急工具箱」——alias 或 Makefile 里留一行 npx hostc@latest $(PORT);真正对外服务仍走 CI/CD 与云主机。若团队已经深度使用 Cloudflare,可评估自托管 hostc server,把临时隧道收拢到自己的账号与域名策略下。
项目地址:https://github.com/akazwz/hostc(Apache-2.0)
官网与文档:https://hostc.dev / https://hostc.dev/docs
一句话收尾:hostc 不是又一个 bore/tunnelto 仿品,而是「用 Cloudflare 边缘做临时 HTTPS 胶布」——快、免注册、适合 Demo 与 Webhook;一旦你开始在乎稳定域名与权限模型,就该毕业去更重的方案。
💻 配套实训环境与动手练习
本文涉及的相关技术指令、开发环境与工具链已内置在边学边练在线实验室中,无需繁琐安装配置,随时在浏览器中实践体验: