news 2026/10/22 10:41:42

Cloud in a Bottle 是什么?用自托管 Web 应用打造属于自己的云

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cloud in a Bottle 是什么?用自托管 Web 应用打造属于自己的云

【免费下载链接】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(简称 bottle)是一个开源的自托管平台:它让你在一台自己控制的服务器上,一键部署、使用和分享 Web 应用。你的应用、数据和基础设施全部归你自己——不需要在几十个 SaaS 账号之间切换,也不用手动折腾 Docker、Nginx 和证书。

为什么需要"瓶子里的云" 🍾

大多数人能用的"云",都隔着一家公司——它们有完全不同的商业诉求。开源 Web 软件虽然很多,但要把它们真正跑起来,意味着你要和基础设施搏斗:域名、反向代理、HTTPS、数据库、备份……

Cloud in a Bottle 把这些复杂度一次性吞掉:

  • ✅应用安装像手机 App 一样简单——从应用目录(Catalog)一键安装,或粘贴一个 Git 仓库地址自动部署
  • ✅数据留在你自己的硬件上——服务器、虚拟机还是家里的旧电脑,随你选
  • ✅默认安全——每个应用都跑在 rootless Podman 容器沙箱里,默认只有你能访问
  • ✅一个域名走天下——通配符 DNS + 自动 HTTPS,每个应用自动获得<应用名>.<你的域名>的公网地址

能部署什么应用?📦

  • 个人小工具:AI 生成的应用、脚本、没有地方托管的各种 utility
  • 开源软件:Matrix 聊天、Minecraft 服务器、笔记、项目管理工具
  • 开发/创意工具:编码 Agent、绘图软件,或者你自己写的、想分享给别人的东西
  • 任何容器化 Web 应用:只要仓库里有 Dockerfile,再加一个cloudinabottle.toml清单文件,就能部署

仓库里自带的示例应用可以参考 apps/test_app/,清单文件长这样(apps/test_app/cloudinabottle.toml):

[app] name = "test-app" version = "0.1.0" [runtime.container] image = "Dockerfile" port = 5000

它是怎么工作的?⚙️

整个实例就是一台机器 + 一个核心服务——Python 路由程序(router),一切围绕它展开:

组件职责
Router(openhost.service)仪表盘 + API、按子域名代理请求、构建和运行应用容器、管理域名与证书
Caddy443 端口终结 TLS,把请求转发给 router
CoreDNS负责你整个域名的权威 DNS,提供通配符解析和证书签发
App 容器每个应用一个 rootless Podman 容器,互不可见
System agent无权限的host用户做不到的主机级操作

一次浏览器访问https://notes.mycooldomain.com/的完整链路:

  1. DNS:通配符记录*.mycooldomain.com解析到服务器公网 IP
  2. TLS:Caddy 用通配符证书终结连接
  3. 匹配:router 从Host头取出应用名notes
  4. 鉴权:默认所有路径都需要 owner 登录,未登录直接跳登录页
  5. 代理:请求转发到应用容器,WebSocket 同样支持

想深入了解,可阅读官方文档中的工作原理概览。

部署指南:三步跑起来 🚀

前置条件

  • 一个你自己控制的域名(可以用子域名,如bottle.yourdomain.com)
  • 一台带静态公网 IPv4的机器,全新安装Ubuntu 24.04
  • SSH root 访问权限
  • 放行80、443和53(TCP/UDP)端口

第 1 步:把域名委托给服务器

Cloud in a Bottle 会运行自己的权威 DNS 服务器,所以要把它整个 zone 委托出去。在 DNS 服务商处创建两条记录:

类型名称值
Ans1.mycooldomain.com203.0.113.10
NSmycooldomain.comns1.mycooldomain.com

委托生效前用dig +short NS mycooldomain.com确认一下。

第 2 步:运行安装脚本

SSH 到机器上,一条命令完成所有安装(对应 scripts/provision.sh):

curl -fsSL https://raw.githubusercontent.com/cloud-in-a-bottle/cloud-in-a-bottle/main/scripts/provision.sh \ | sudo bash -s -- --domain mycooldomain.com --acme-email you@example.com

脚本会创建无权限的host用户、安装 Podman、克隆代码、写入配置、注册 Let's Encrypt 账号并启动openhost服务。

第 3 步:认领你的实例

公网实例采用 token 门控,防止陌生人抢先。安装结束时输出一个 Claim URL:

Claim URL: https://mycooldomain.com/setup?claim=<token>

打开它,创建你的 owner 账号——搞定!🎉 完整的云端部署步骤见 docs/src/setup/cloud_instance.md,家用服务器场景也有专门的指南。

日常使用:全在浏览器里完成 💻

打开https://<你的域名>/就是仪表盘:

  • Dashboard:所有应用、状态和入口链接
  • Catalog / Deploy app:两种安装方式——目录里一键装,或粘贴任意含cloudinabottle.toml的仓库 URL
  • Settings:账号、API token、域名、归档存储、平台更新
  • System info:内存、磁盘、每个应用的资源占用
  • Terminal:浏览器里直接开 shell,不用 SSH 客户端

新实例预装了一批实用应用:Catalog(应用商店)、Backup(加密备份)、Files(文件浏览器)、Secrets(密钥管理)、OAuth provider(托管你的 Google/GitHub token)、Community chat(Matrix 聊天)。全部是普通应用,随时可删。

安装前请注意 🛡️

安装页面会展示应用在其清单里声明的一切:需要多少内存、要访问哪些数据、是否要其他应用的数据、额外 Linux capabilities、宿主机设备或网络权限。更新时同样会显示变更并需要你批准——平台默认给应用最小权限,提权完全由你决定。

应用数据存哪里?🗄️

应用存储分三个层级,清单文件控制容器能访问哪些层:

层级内容
持久数据应用的永久数据(数据库等),存在你的实例上
临时数据构建产物、容器日志等 scratch 空间
归档存储大批量内容,可用本地磁盘,也可指向你配置的 S3 兼容存储

详细机制见数据文档。

如何打造自己的应用?🛠️

想把自己写的 Web 应用部署上去?两步:

  1. 仓库根目录放一个Dockerfile
  2. 加一个cloudinabottle.toml清单,声明名称、版本、端口、资源需求

router 会自动克隆仓库、读取清单、用 rootless Podman 构建镜像、启动容器,应用随后出现在https://<app>.<your-domain>/。完整的应用创建流程和清单字段说明在 docs/src/creating_an_app/ 下,包括清单规范和跨应用服务。

常见问题 📋

Q:安全吗?应用之间能互相访问吗?不能。每个容器只能看到自己的数据目录,应用间的通信必须走带权限校验的 Service Interface,任何未认证请求到不了应用。详见安全文档。

Q:可以不给别人访问权吗?可以,默认只有你能用。应用也可以通过清单的public_paths把特定路由开放给公网(比如博客或分享链接)。

Q:不想自己维护服务器?项目方提供了托管服务(Managed hosting),帮你配好 SSH 后把实例交给你。也可以克隆仓库 https://link.gitcode.com/i/cb3366f426bfd3602b46334b7b8adfc2 在本地虚拟机里体验。

Q:怎么更新?仪表盘 Settings 页面点按钮即可,进度实时可见;应用更新则在应用详情页手动触发。

总结

Cloud in a Bottle 把"跑自己的云"从系统工程活变成了点几次按钮的事:一个 Python router 统一管路由、证书、容器和数据,应用装起来像装手机 App,数据永远躺在你自己的硬件里。对于厌倦了 SaaS 全家桶、又想把开源软件真正跑起来的人,这是一条很平滑的入口。 🌱

【免费下载链接】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/23 7:15:12

gpt-image2文生图入门心得笔记

GPT-Image2 文生图入门 文章分享自己实操过程中的心得体会&#xff0c;或许对你有帮助。 提示词应该是什么样的 场景&#xff1a;摩纳哥 vs 切尔西 一种文本描述 realistic sports broadcast screenshot-style documentary photo set in the spectator stands of UEFA Champ…

作者头像 李华
网站建设 2026/10/23 5:06:46

Cortex-M0嵌入式解压缩:资源受限下的启动流程重构

1. 为什么 Cortex-M0 上的代码解压缩不是“锦上添花”&#xff0c;而是“生死线” 你手头有一块基于 Cortex-M0 的嵌入式设备&#xff0c;Flash 容量只有 64KB&#xff0c;但固件编译出来却有 92KB——超了整整 28KB。这时候&#xff0c;有人告诉你&#xff1a;“加个解压缩就行…

作者头像 李华
网站建设 2026/10/19 6:13:35

递归下降分析器实战:LL(1)文法改造、词法协同与状态同步

简介&#xff1a;本资源是一份面向计算机专业本科生与编译原理初学者的实验教学材料&#xff0c;聚焦自上而下语法分析核心技能——递归下降分析器的设计与实现。内容涵盖LL(1)文法改造&#xff08;含左递归消除&#xff09;、FIRST/FOLLOW集手工推导、词法分析器扩展&#xff…

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

Android音视频开发:MediaCodec解码AAC为PCM全流程详解

做Android音视频开发的时候&#xff0c;我经常被同一个问题卡住&#xff1a;AAC音频明明放得好好的&#xff0c;但我想拿到声音本身的数字数据——比如做音频可视化画波形、做混音、做变声、分析响度——系统播放器根本不给你这个机会。翻来覆去之后&#xff0c;最直接的办法都…

作者头像 李华
网站建设 2026/10/20 10:15:10

嵌入式Flash时钟:RTC时间掉电保持的工程实现方案

简介&#xff1a;本资源是一份基于Adobe Flash平台开发的桌面时钟实现方案&#xff0c;面向ActionScript初学者与Flash动画爱好者&#xff0c;解决动态时钟组件开发与桌面集成的实际问题。压缩包共3个文件&#xff08;562KB&#xff09;&#xff0c;含核心源码文件时钟的制作.f…

作者头像 李华