news 2026/10/22 19:32:27

没有公网 IP 也能玩:Cloud in a Bottle 家用服务器公网暴露的 3 种方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
没有公网 IP 也能玩:Cloud in a Bottle 家用服务器公网暴露的 3 种方案

【免费下载链接】cloud-in-a-bottle

Deploy, use, and share web apps on a server you control. Your apps, data, and infrastructure stay yours.

项目地址:https://gitcode.com/gh_mirrors/cl/cloud-in-a-bottle
点击查看免费下载

Cloud in a Bottle 是一个让你把自己的服务器变成"私有云"的开源项目:应用像装手机 App 一样从 Git 仓库一键部署,数据全部留在你自己的硬件上。但它的价值在于"拥有可公开访问的 URL",而家宽用户最大的痛点恰恰是没有公网 IP。别担心,本文带你用 3 种方案把家里的 Cloud in a Bottle 安全地"搬"到公网——从最简单的 Cloudflare Tunnel 隧道,到 Tailscale 组网,再到动态 IP 端口转发,总有一款适合你。

为什么必须把家用服务器暴露到公网?

Cloud in a Bottle 的设计目标是:你的应用(笔记、邮箱、AI 工具、游戏服务器……)部署后拥有https://<应用名>.你的域名.com这样的正式网址,任何设备上的普通浏览器都能打开。要达成这一点,实例需要两样东西:

  • 公网可达性:互联网上的请求能到达你的机器;
  • 独立域名:用于 HTTPS 证书和给每个应用分配子域名。

家里通常两样都没有——ISP 给的是动态 IP,甚至还是 CGNAT(多户共享一个出口 IP)。所以家用场景的公网暴露方案,本质上都是"绕过公网 IP 的缺失"。

方案一:Cloudflare Tunnel 隧道(最推荐 ⭐)

一句话:免费、无需改路由器、无需公网 IP,10 分钟搞定。

Cloudflare Tunnels 的原理是"反向隧道":由 Cloudflare 在公网侧接收流量,按 HTTP 请求里的域名(Host 头)识别用户,再主动建立隧道把流量送进你家这台被防火墙挡住的机器。因为连接是从内网主动向外发起的,所以路由器不需要任何端口映射,动态 IP 完全不影响使用。

这也是官方文档 docs/src/setup/home_network.md 中推荐的第一方案,步骤概要如下:

  1. 前提:你有一个顶级域名(如example.com),且 DNS 托管在 Cloudflare,并开启了 "Always Use HTTPS";
  2. 在面板注册域名:打开 Dashboard 的Settings → Domains,填入域名并选择Public (HTTPS)。此时会报证书错误(ACME account key path must be set...),这是预期现象——因为证书由 Cloudflare 边缘节点终结,实例本身不需要证书;
  3. 安装cloudflared:通过 apt 安装 Cloudflare 官方客户端;
  4. 创建隧道并授权:执行cloudflared tunnel login在浏览器中授权你的域名,再执行cloudflared tunnel create bottle创建名为 bottle 的隧道;
  5. 配置通配符路由:核心是把example.com和*.example.com两条 ingress 规则都指向本地路由器的http://127.0.0.1:8080——Cloud in a Bottle 的 Python 路由器会按应用子域名自动分发请求到对应容器;
  6. 注册为系统服务:sudo cloudflared service install后开机自启,从此无需干预。

完成后,在任意设备的浏览器访问你的域名即可看到 Dashboard,应用则位于https://<应用名>.example.com。

⚠️小提醒:隧道方案只转发 HTTP/HTTPS 流量。绝大多数应用都够用,但如果某个应用的 cloudinabottle.toml 清单里声明了非标准[[ports]](例如 SMTP 收信端口),这类流量在隧道模式下将无法正常工作。

方案二:Tailscale 虚拟组网(适合只给自己和家人用)

一句话:不暴露给公网,只让你的设备(无论在哪)能访问,安全性最高。

如果你并不需要让"互联网上任何人"都能访问,只是希望出差、旅行时手机也能打开家里的服务,Tailscale 是最优雅的选择。它在你的设备间建立端到端加密的虚拟局域网(tailnet),实例仅对 tailnet 内设备可见,公网完全摸不到。

操作步骤:

  1. 安装 Tailscale:在实例上执行sudo snap install tailscale --classic,然后sudo tailscale up登录。长期运行的服务器建议在管理后台关闭密钥过期,避免定期重新认证;
  2. 域名指向 Tailscale IP:执行tailscale ip -4取得分配的 100.x 内网 IP,在你的 DNS 服务商处创建一条A记录和一个通配符A记录(如*.bottle.example.com),值都填这个 Tailscale IP。通配符记录保证每个应用都有自己的可用子域名;
  3. 在面板添加域名:Settings → Domains中填入域名,选择HTTP(最省事)或HTTPS(需通过 acme.sh 的 DNS API 插件完成 DNS-01 验证来签发通配符证书,完整命令见官方文档);
  4. 设为主域名:新域名生效后点击Make primary,实例与应用会重启并切换到新域名。

细节可直接查阅官方指南 docs/src/setup/home_network.md 的 "Tailscale" 章节。

对比维度Cloudflare TunnelTailscale
公网暴露程度完全公开(需认证保护)仅 tailnet 设备可见
配置难度低低
支持 HTTPS 自动证书是(Cloudflare 终结)需 acme.sh 配合 DNS API
非 HTTP 协议不支持tailnet 内全协议可达
适合场景分享给朋友/对外服务纯个人私有云

方案三:动态 IP + DDNS 端口转发(进阶玩法)

一句话:最"传统"的路子,能走通全端口,但前提条件最多、收益相对最小。

官方文档明确标注这条路不是官方支持路径,但如果你就是喜欢完全掌控链路,原理如下:

  1. 确认你的网络不是 CGNAT:登录光猫/路由器查看 WAN 口 IP,若为10.、100.64.、172.16.等内网段,说明 ISP 做了大内网,此方案直接作废;
  2. DDNS 动态解析:家用 IP 会周期性变化,需要 DDNS 客户端(或脚本)监控 WAN IP 变化并自动更新域名 A 记录;
  3. 路由器端口转发:把外部 80/443(以及 53,因为实例自带 CoreDNS 权威 DNS)转发到家庭服务器。注意 53 端口转发在家用 NAT 下非常棘手,这也是官方不推荐的原因之一;
  4. ISP 端口封锁:居民线路通常封禁 25(SMTP)等端口,收信类应用会受限。

官方原文的结论很直白:"好处相比 Cloudflare Tunnel 来说收益很低,设置却难得多。" 因此它只适合折腾爱好者。

顺带一提:另外 2 条"正规军"路线

  • 静态 IP 服务器:如果你有一台带静态公网 IPv4 的机器(哪怕家里的宽带升级了静态 IP 套餐),流程反而最简单——把整个域名区(NS 记录)委托给实例自己,实例内置的 CoreDNS + Caddy 会自动完成通配符解析和 ACME DNS-01 证书签发,详见 docs/src/setup/static_ip.md;
  • IPv4 隧道服务:团队也观察到"给一台被防火墙挡住的实例挂一个 IP"是刚需,目前正在自研这项服务,官方预告"即将上线",可以先关注项目路线图 docs/src/roadmap.md。

部署与延伸阅读

想先在家里把 Cloud in a Bottle 跑起来(先装成仅本地访问的模式,再按上面的方案上公网),仓库提供了一键部署脚本,参考官方文档 docs/src/setup/dedicated_homeserver.md:

git clone https://gitcode.com/gh_mirrors/cl/cloud-in-a-bottle # 按照 dedicated_homeserver 文档执行 provision.sh, # 用 --local-http-only 参数装成纯本地模式,SSH 隧道即可访问 Dashboard

更多操作细节:

  • 家用网络暴露完整指南:docs/src/setup/home_network.md
  • 静态 IP 暴露指南:docs/src/setup/static_ip.md
  • 域名与 TLS 配置相关源码:compute_space/src/compute_space/core/domains.py
  • 域名 API 路由:compute_space/src/compute_space/web/routes/api/domains.py
  • Caddy HTTPS 反向代理集成:compute_space/src/compute_space/core/caddy.py

写在最后

没有公网 IP,只是少了一台"路由器上的门牌",并不是私有云的死胡同:Cloudflare Tunnel 适合想要公开分享的你,Tailscale 适合纯粹自用、安全优先的你,动态 IP 转发留给享受折腾的你。三条路走通任何一条,你家里的旧电脑、树莓派,就正式成为你云端版图里真正属于自己的一块角落了 🍾

【免费下载链接】cloud-in-a-bottle

Deploy, use, and share web apps on a server you control. Your apps, data, and infrastructure stay yours.

项目地址:https://gitcode.com/gh_mirrors/cl/cloud-in-a-bottle
点击查看免费下载

相关推荐

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 13:28:46

MS5837-30BA水深传感器:STM32 I2C驱动与校准实战

简介&#xff1a;面向嵌入式开发者与水下传感应用工程师&#xff0c;MS5837-30BA水深传感器资料包整合官方英文手册与作者翻译的中文版本&#xff0c;中文翻译加入逐段解读与关键代码注释&#xff0c;帮助快速理解压力/水深换算原理、I2C通信时序与温度补偿机制。压缩包共150个…

作者头像 李华
网站建设 2026/10/23 7:41:03

Linux下QT串口通信实战:权限、时序与稳定性全攻略

简介&#xff1a;面向Linux环境下的Qt开发者&#xff0c;这份资源聚焦串口通信&#xff0c;讲解从Linux串口设备基础到Qt程序实现的完整路径。内容涵盖串口设备命名、RS-232标准参数配置、系统调用底层交互&#xff0c;以及Qt串口模块的常用API封装&#xff0c;并附带一个可直接…

作者头像 李华
网站建设 2026/10/22 11:14:21

玲珑轮胎登上山东台:一条轮胎凭什么跑出“山东好品”的底气

近日&#xff0c;玲珑轮胎登上山东电视台新闻频道《市场监管在线》栏目“好品山东‘链’成记—企业说好品”&#xff0c;以“质量是企业的生命线”为主题&#xff0c;玲珑轮胎常务副总裁孙松涛介绍了玲珑通过提高制造标准、加大研发能力、提升产品性能、严格把控质量、紧抓细节…

作者头像 李华
网站建设 2026/10/18 0:21:23

STM32三路超声波自动跟随小车:硬件设计与状态机实现

简介&#xff1a;一套基于STM32的三路超声波自动跟随小车完整工程&#xff0c;面向嵌入式入门者、电子竞赛选手及智能车爱好者&#xff0c;可用于课程设计或动手实践。项目通过三个超声波传感器采集前方不同方位距离数据&#xff0c;由STM32解析并控制电机&#xff0c;实现目标…

作者头像 李华