一条命令分享开发服务器:portless Tailscale Funnel 与 ngrok 公网分享实战
2026/9/15 18:05:28 网站建设 项目流程

一条命令分享开发服务器:portless Tailscale Funnel 与 ngrok 公网分享实战

【免费下载链接】portlessReplace port numbers with stable, named local URLs. For humans and agents.项目地址: https://gitcode.com/GitHub_Trending/por/portless

portless 是一款本地开发服务器工具,它用「稳定命名 URL」(如https://myapp.localhost)替代localhost:3000这类端口地址。它更吸引人的地方在于:只需加一个参数,就能把本地开发服务器通过 Tailscale Funnel 或 ngrok 一键分享到公网,让同事、客户随时打开演示链接。本文面向新手,带你从零跑通「安装 → 本地命名 → 公网分享」全流程。

为什么"分享开发服务器"总是很麻烦?

传统做法下,把本地 demo 给别人看通常需要:

  • 📣 口头告诉对方「IP 是 192.168.x.x,端口 5173」,换个网络就失效
  • 🧱 配置路由器端口转发、防火墙规则,非技术同事根本不敢碰
  • ⚙️ 每个框架(Vite、Next.js、Flask)配置不同,还要担心端口冲突
  • 🕐 演示一结束链接就失效,下次又要重新折腾

portless 的思路是:本地访问用一个永远不会变的命名地址,对外分享则交给 Tailscale Funnel 或 ngrok 这类隧道工具,而注册、清理、端口分配全部自动化,你只需要记一条命令。

三步装好 portless:先获得一个"命名 URL"

# 1. 全局安装 npm install -g portless # 2. 用命名地址启动你的应用(以 Next.js 为例) portless myapp next dev # -> https://myapp.localhost

就这一步,portless 会自动做三件事:

  1. 自动启动一个 HTTPS 反向代理(默认 443 端口)
  2. 给你的应用分配一个随机空闲端口(4000–4999),并通过PORT环境变量注入
  3. https://myapp.localhost注册到代理,之后你访问的就是稳定地址

💡 如果项目里配置了package.jsondev脚本,直接运行portless即可,它会自动推断项目名。更多细节见 README.md 与 skills/portless/SKILL.md。

三种分享模式一图看懂:本地、内网、公网

portless 把「开发服务器分享」分成三种粒度,对应不同的受众:

模式启动参数别人打开的地址适用场景
本地模式(默认)portless myapp next devhttps://myapp.localhost自己开发调试
Tailscale 内网portless myapp --tailscale next devhttps://devbox.yourteam.ts.net与同一团队的同事协作
Tailscale 公网portless myapp --funnel next devhttps://devbox.yourteam.ts.net(公网可访问)给客户/外部演示
ngrok 公网portless myapp --ngrok next devhttps://abc123.ngrok.app快速公网演示、Webhook 测试

注意一个关键设计:本地地址始终保留。开启--funnel--ngrok后,https://myapp.localhost依然可用,你和对方访问的是同一个服务,只是多了一条公网入口。

Tailscale Funnel:一条命令把开发服务器安全暴露到公网

前置准备(一次性)

  • 安装 Tailscale 客户端并运行tailscale up完成登录连接
  • 在 Tailscale 后台为你的 tailnet 启用HTTPS 证书
  • 在 Tailscale 后台为你的节点启用Funnel

启动并分享

portless myapp --funnel next dev # -> https://myapp.localhost (本地) # -> https://devbox.yourteam.ts.net (公网)

启动后,终端里会同时打印本地 URL 和公网 URL,直接把公网链接丢进群聊即可。

多应用同时分享时端口如何分配?

每个--tailscale应用都会独占一个 HTTPS 端口:第一个应用用 443,之后依次是 8443、8444……而 Funnel 模式只允许使用 443、8443、10000 三个端口,这一限制直接写死在源码 packages/portless/src/tailscale.ts 中:

# 应用 1:https://devbox.ts.net portless myapp --funnel next dev # 应用 2:https://devbox.ts.net:8443 portless api --funnel pnpm start

省心设计:自动清理

应用进程退出(Ctrl+C 或崩溃)时,portless 会自动注销 Tailscale 注册,不会留下"幽灵隧道"。如果你希望所有应用默认都开启分享,可以设置环境变量,省去每次手敲参数:

export PORTLESS_TAILSCALE=1 # 默认分享到尾网 export PORTLESS_FUNNEL=1 # 默认分享到公网

ngrok 公网隧道:开发服务器分享的另一种选择

如果你不想让外部访问者安装 Tailscale(或者你只是临时要一个公网链接,比如测试支付回调、Webhook),ngrok 是更轻量的选择。

前置准备(一次性)

# 安装 ngrok CLI 后,配置你的 authtoken ngrok config add-authtoken <token>

启动并分享

portless myapp --ngrok next dev # -> https://myapp.localhost (本地) # -> https://abc123.ngrok.app (公网)

portless 启动 ngrok 隧道的细节(重写 Host 头、解析隧道 URL)在 packages/portless/src/ngrok.ts 中实现,它会自动把本地端口与公网地址绑定,应用退出时隧道随之关闭,同样无需手动清理。

与 Tailscale 方案一样,ngrok 地址也会注入到子进程环境变量PORTLESS_NGROK_URL中,方便你在代码里直接读取当前公网地址。

查看与管理分享链接:portless list 与 doctor

分享过程中最实用的两条命令:

portless list # 查看当前所有路由:本地 URL + tailnet/ngrok 公网 URL portless doctor # 体检:检查代理、路由、DNS、证书信任等,输出修复建议

常用环境变量速查(完整列表见 skills/portless/SKILL.md):

环境变量作用
PORTLESS_TAILSCALE=1每次运行应用时默认分享到尾网(等价于--tailscale
PORTLESS_FUNNEL=1每次运行应用时默认公网分享(等价于--funnel
PORTLESS_NGROK=1每次运行应用时默认走 ngrok(等价于--ngrok
PORTLESS=0完全绕过 portless,直接执行原命令

常见问题排查:分享失败怎么办?

portless 的设计是**「先校验、后启动」**:如果 Tailscale 或 ngrok 环境不满足条件,它会在启动你的应用之前就直接退出并给出明确报错,避免你面对一个半启动的坏状态。

Tailscale 报"未启用"

tailscale status # 确认节点已连接 tailscale up # 若未连接,先登录

然后到 Tailscale 后台确认两件事:tailnet 已启用 HTTPS 证书、目标节点已启用 Funnel。两者缺一,--funnel都会提前报错退出(对应逻辑见 packages/portless/src/tailscale.ts)。

ngrok 报认证错误

ngrok version # 确认已安装 ngrok config add-authtoken <token> # 配置认证

portless 会识别 ngrok 输出中的认证错误并转成友好的中文提示,提示你补上 authtoken 后重试。

端口冲突

Funnel 模式下如果 443、8443、10000 三个端口都被占用,portless 会提示「所有 Funnel 端口均被占用,请停止一个已有 Funnel 释放端口」。

本地一切正常但 URL 打不开

优先运行portless doctor,它会只读地检查 Node.js、状态目录、代理存活、路由条目、HTTPS 证书信任、主机名解析等,并直接打印修复建议。

总结

  • 🔗本地portless myapp next dev获得稳定的https://myapp.localhost
  • 🏢团队内网:加--tailscale,同事通过 tailnet 域名访问
  • 🌍公网演示:加--funnel(Tailscale Funnel)或--ngrok(ngrok),一条命令完成分享
  • 🧹零残留:应用退出后,隧道与注册自动清理
  • 📋可观测portless list看地址、portless doctor做体检

对新手来说,最值得记住的就是这一行:在你熟悉的启动命令前加一个--funnel--ngrok,开发服务器就上了公网。其余的端口分配、证书、注册与清理,portless 都替你做了。

【免费下载链接】portlessReplace port numbers with stable, named local URLs. For humans and agents.项目地址: https://gitcode.com/GitHub_Trending/por/portless

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询