一条命令分享开发服务器: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 会自动做三件事:
- 自动启动一个 HTTPS 反向代理(默认 443 端口)
- 给你的应用分配一个随机空闲端口(4000–4999),并通过
PORT环境变量注入 - 把
https://myapp.localhost注册到代理,之后你访问的就是稳定地址
💡 如果项目里配置了
package.json的dev脚本,直接运行portless即可,它会自动推断项目名。更多细节见 README.md 与 skills/portless/SKILL.md。
三种分享模式一图看懂:本地、内网、公网
portless 把「开发服务器分享」分成三种粒度,对应不同的受众:
| 模式 | 启动参数 | 别人打开的地址 | 适用场景 |
|---|---|---|---|
| 本地模式(默认) | portless myapp next dev | https://myapp.localhost | 自己开发调试 |
| Tailscale 内网 | portless myapp --tailscale next dev | https://devbox.yourteam.ts.net | 与同一团队的同事协作 |
| Tailscale 公网 | portless myapp --funnel next dev | https://devbox.yourteam.ts.net(公网可访问) | 给客户/外部演示 |
| ngrok 公网 | portless myapp --ngrok next dev | https://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),仅供参考