有时候最好的方案,是彻底绕开那个你搞不定的东西。
一、背景:一场 3/15 的培训
3/15 下午 17:30,有一场演示培训。我要在现场展示洵儿——让现场的人扫一个二维码,连上 Mac mini,跟洵儿直接对话。
这听起来不复杂。但有一个问题:演示现场不在家里,我的 Mac mini 在书房。现场的人要访问 Mac mini 上的 Gateway,必须有一条从外网打进来的通路。
我们之前配了 Cloudflare Tunnel,chat.stuartstrategy.cn 正常可用。但有一个麻烦:Cloudflare Access 的邮箱验证 OTP 一直收不到,现场如果突然出问题,没有备用方案。

二、老钳的方案:SSH 隧道 + 零 Cloudflare 依赖
老钳花了 15 分钟 52 秒,完成了整套培训演示方案的部署。
核心思路:完全绕开 Cloudflare。
用 localhost.run 建一条 SSH 隧道,把本地 18789 端口映射到一个临时公网 URL。零配置,零成本,无需任何账号。
# 建立隧道(在 Mac mini 上执行)ssh -R 80:localhost:18789 nokey@localhost.run执行后会输出一个类似 https://xxx.lhr.life 的临时 URL。这个 URL 就是现场演示用的地址。
关键限制:localhost.run 每次 SSH 连接都会生成新 URL。这意味着到培训现场后需要重建隧道,重新生成二维码。

三、配套输出物
老钳同步输出了四个文件,让培训准备变成一套可执行的 checklist:
① training-demo-plan.md(175 行)
完整方案文档,包含操作流程、现场风险应对、故障排除步骤。这是整个演示的「剧本」。
② training-qr-code.png(370×443px)
指向当前隧道 URL 的二维码。注意:到现场后 URL 会变,需要用 training-gen-qr.py 重新生成。
③ training-cleanup.sh
培训结束后一键关闭隧道和 demo session,撤销现场公开访问。
# 培训结束后执行bash ~/.openclaw/workspace/training-cleanup.sh④ training-gen-qr.py
URL 变更时重新生成二维码,用 Python qrcode 库,输出到同一路径覆盖。
四、MacBook 操作手册
培训当天我会带 MacBook 去,通过 Tailscale SSH 连接书房的 Mac mini。老钳顺势创建了一份 Notion 页面作为现场操作手册,包含:
到场后的操作流程:SSH 连接 Mac mini → 确认 Gateway 存活 → 重建隧道 → 生成二维码 → 投屏展示 Tailscale 连接方式:所有 SSH / SCP 命令使用 Tailscale IP( 100.x.x.x),不依赖局域网故障排除:Gateway 挂了怎么拉起,隧道断了怎么重建,二维码怎么更新 速查卡片:常用命令一页纸,不需要翻文档
这份手册的设计原则是:现场不应该有任何需要思考的时刻,每一步都是查手册、照着执行。
五、培训前必做 Checklist
lsof -i:18789) | ||
localhost.run 隧道 | ||
training-gen-qr.py 生成新二维码 | ||
labokoushitou | ||
training-cleanup.sh 关闭公开访问 |
六、踩坑与反模式
踩坑一:localhost.run 隧道 URL 每次都会变
不要提前把 URL 印在 PPT 里。到场重建隧道后,立刻用 training-gen-qr.py 重新生成二维码,再投屏。
踩坑二:演示结束后不要忘记关闭隧道
localhost.run 的临时 URL 在 SSH 连接断开后自动失效,但如果忘记执行 cleanup,tmux session 里的隧道进程还在跑。执行 training-cleanup.sh 确保完整关闭。
踩坑三:Gateway 密码不要只靠口头传达
现场人员需要输入 Gateway 密码才能访问。把密码写在二维码旁边的投屏里,或者提前打在纸上,避免口头传达出错。
踩坑四:不要依赖现场 Wi-Fi
MacBook 连现场 Wi-Fi,Mac mini 在家走宽带,Tailscale 穿透。这条链路不依赖任何额外条件,但要提前确认 Tailscale 两端都在线。
七、可复用 Checklist
[ ] 演示环境隔离:建 localhost.runSSH 隧道,不动生产 Cloudflare 配置[ ] 培训前准备: training-demo-plan.md+ 二维码 + cleanup 脚本三件套[ ] 到场后第一件事:重建隧道,重新生成二维码 [ ] 演示完最后一件事: bash training-cleanup.sh关闭公开访问[ ] 双端 Tailscale 确认:MacBook + Mac mini 均在线 [ ] Gateway 密码放到可视位置,不依赖口头传达
八、下一步
培训准备全部就绪。3/15 下午需要在 16:30 执行一次培训前操作:SSH 连 Mac mini → 重建隧道 → 生成二维码 → 确认 Gateway 存活。
同时,P6.8 的最后一步仍然待完成:企微客户端建群 + 真机测试「洵儿你好」。这件事可以在培训之后找个安静的时间处理。
九、后记:3/15 实战结果
事情比预想的顺。
3/15 的培训,满堂彩。
到场前按 checklist 执行:SSH 连上 Mac mini,重建 localhost.run 隧道,training-gen-qr.py 生成新二维码,确认 Gateway 存活。整套流程在 16:30 之前全部跑完,没有临时状况。
现场二维码投屏,现场人员扫码接入,跟洵儿实时对话。连接稳定,回答流畅,没有 Connection error,没有超时,没有需要临场救火的时刻。演示方案完整落地。

培训结束后,顺势推进了 P6.8 的最后一步:企微智能机器人建群 + 群聊验证。
企微端创建了演示群 洵儿以智能机器人身份接入,长连接模式稳定 群内发送「洵儿你好」,洵儿响应,回复正常 群聊链路验证通过 ✅
P6.8 正式收工。
至此,洵儿的公开触达能力完整了:从「只能本机聊」到「培训现场可演示、企微群聊可响应」,这条路从 2/24 的七个坑走到 3/15,走了整整二十天。
作者:喜感星球 × 老钳 | 2026.03
*localhost.run:一个零账号、零配置的 SSH 隧道服务,适合临时演示场景。每次连接生成不同的临时 URL,断开即失效。*
夜雨聆风