自托管这件事,20 年来一直卡在同一个地方:软件装得上,日子过不好。装一个 Nextcloud 十分钟,之后的证书续期、备份验证、版本升级、安全加固,全是没完没了的运维活。9 月 5 日,AI 公司 Imbue 发布了开源项目 Cloud in a Bottle(下文简称 CIAB),把这个问题的答案压进了一个 Ubuntu 虚拟机:一条命令装好后,你得到的是一个「个人云手机」——有应用商店、统一登录、应用间权限管理,所有应用跑在你自己的服务器上。项目发布当天在 Hacker News 拿下 407 分,评论近 200 条。

一个 AI 公司为什么做自托管
CIAB 的作者 Zack Polizzi 在发布文章里先讲了一笔账。云计算把软件体验做好了:不用安装、全设备同步、随手分享协作。但云端服务要花钱养,于是今天互联网上几乎所有能用的软件背后都站着一家公司,而这些公司的利益和用户的利益并不一致:广告、追踪、订阅费、数据变现。
开源软件本来是另一条路。作者把它拆给读者看:作者发布软件,用户各自在自己电脑上运行,成本和控制在用户手里。这个模式在前云时代成立,后来失效了,软件本身一直在变简单,缺的是「个人把软件放上云端」的可用路径。作者的结论写得很清楚:需要一个让普通人把自己装备成云的方式。
Imbue 的背景让这个项目看起来不那么偶然。这家公司在 2023 年 9 月完成 2 亿美元 B 轮融资,估值超过 10 亿美元,NVIDIA 参投,主业是让 AI 智能体写代码做研究。一家做 AI 智能体的公司去做自托管平台,逻辑线在产品里能找到:CIAB 的手册专门有一节叫 Use by AI agents,bottle CLI 把认证注入做好,让编码智能体可以自己打包应用、部署、读构建日志、修错误、重新发布,全程不需要经手令牌。自托管和 AI 智能体在这个设计里咬合在一起:前者提供一块用户自己控制的领地,后者是替用户打理这块领地的劳动力。
架构:一台机器上的五个部件
CIAB 的技术栈不追逐新概念,核心是在一台 Ubuntu 24.04 机器上跑一个 systemd 服务,把五个部件编排起来:
| 部件 | 职责 |
|---|---|
| Router(openhost.service) | 仪表盘、API、反向代理、构建并运行应用容器、管理域名和证书 |
| Caddy | 在 443 端口终结 TLS,80 端口重定向到 HTTPS |
| CoreDNS | 托管域名的权威 DNS,应答 ACME DNS-01 挑战 |
| 应用容器 | 每个应用一个 rootless Podman 容器,独立用户命名空间 |
| System agent | 以最小权限处理主机配置和系统更新 |
一个请求的完整路径能看出这套设计的用意。浏览器打开 notes.mycooldomain.com 时:DNS 的通配符记录把所有子域名指向这台机器;Caddy 用通配符证书终结 TLS;路由器读 Host 头,取出应用名 notes;在请求碰到应用之前,路由器先检查所有者会话,未登录的请求到不了应用;然后才代理到应用容器的回环端口。默认情况下,每个应用的每条路径都要求所有者登录,应用永远不会收到未认证的请求,除非应用自己在清单里声明了 public_paths。
这套 DNS 设计是 CIAB 最有辨识度的部分。它要求你把整个域名的 NS 记录委托给这台机器,机器上的 CoreDNS 成为权威服务器,自动维护通配符解析,并自己应答 Let's Encrypt 的 DNS-01 验证。收益是:装新应用不需要碰任何 DNS 配置,每个应用自动获得 app.yourdomain.com 子域名和 HTTPS 证书。代价也写在文档里:53 端口必须对公网开放,HN 评论里有人质疑这意味着用不了 Cloudflare 这类 CDN 挡流量。两种路线(平台全托管 DNS vs 自己管 DNS 配证书)文档都支持,只是前者才是「零配置」体验的来源。

容器沙箱与跨应用权限
应用隔离走的是 rootless Podman:容器内的 root 映射到宿主机的一个非特权 subuid,容器默认只拿到自己申请的数据目录、Docker 标准能力集外加 no-new-privileges,HTTP 端口只发布到 127.0.0.1。这回应了发布文章里对 yunohost 的批评(应用直接跑在宿主机上,一个应用被攻破全服务器沦陷),也接住了 Sandstorm 2014 年那篇著名文章没走完的路。
真正让 CIAB 区别于 Coolify、CapRover 这类「容器托管面板」的是跨应用服务接口。它的权限模型值得细看:应用在清单里声明提供或消费某个服务(如密钥存储、OAuth),消费方申请的 grant 是不透明载荷(字符串或 JSON),语义由提供方应用自己定义和解释;路由器只负责存储、传递和在 403 响应里附带授权页面链接。授权分两种作用域:global 作用域在安装时随清单声明授予;app 作用域留给数据相关的细粒度权限(比如「允许相册应用读取某个文件夹」),由提供方应用自己渲染同意页面,用户确认后提供方回调路由器的 API 落地授权。安全审查中最容易被糊弄过去的环节——应用到底拿走了什么权限——在这里被做成了默认可见、默认最小、更新时重新确认的流程。
存储是另一个经过认真分层的地方。每个应用有三层数据目录:permanent 层是本地磁盘,带真实 fsync 和严格 POSIX 语义,SQLite、LMDB 这类嵌入式数据库只能放这里;temporary 层放缩略图、构建产物这类可重建数据,不保证备份;archive 层是 JuiceFS 挂载的归档层,本地磁盘或 S3 都可以作为后端,给照片、视频、模型权重这类大块头用。手册里专门解释了为什么 archive 层不能当数据库盘用:它是网络形态的文件系统,写前日志和 fcntl 锁在这种挂载上不可靠。这套分层直接回应了 Immich、Jellyfin 这类应用的痛点:索引数据库要快盘,照片视频要大容量,混在一起要么贵要么慢。
三种部署形态与一条备份链路
部署路径文档分成三条:云 VPS(有静态公网 IP,全功能模式)、家用专职服务器、家用共享机器(桌面或 NAS 里开一个虚拟机)。共享机器场景提供预构建的 Ubuntu appliance(qcow2 和 ova 两种格式),QEMU 一条命令就能拉起来,最低要求 1 vCPU、2 GB 内存、20 GB 磁盘。家用宽带没有公网 IP 的场景,文档给了 Cloudflare Tunnel 和 Tailscale 两条隧道路线,连同各自的证书配置步骤。
备份走 restic:内置的 Backup 应用把所有应用的 permanent 层和 temporary 层做加密、增量、去重备份,目的地可以是 S3、B2、SFTP 或任何 rclone 远端。两个边界写得很诚实:archive 层不进备份(S3 后端下数据本来就在桶里,本地后端则明确警告你没有任何异地副本);路由器自身的状态(数据库、证书、身份密钥)在任何应用的挂载之外,备份应用碰不到它,迁移到新机器要自己用 bottle instance rsync 拉一份。安装时给一个 50 GB 小盘、把大文件挂到 S3 的用法,作者在 HN 评论里确认是预期用法。
应用目录与它没解决的问题
应用目录目前 38 个,全部人工筛选,覆盖了自托管的常见需求:Nextcloud、Jellyfin、Vaultwarden、Overleaf、Pi-hole、SearXNG、Uptime Kuma、Matrix 聊天,也有 Open WebUI 和 OpenClaw 这样的 AI 应用,还有 Apple Health、Oura 戒指的数据连接器。缺货也明显:HN 评论区呼声最高的 Immich(自托管照片库的事实标准)和 Home Assistant 都还不在列。
评论区的技术质疑集中在几个地方,文档和作者回复都算坦诚:默认 128 MB 内存限制会杀掉一部分应用(排障文档第一条就是它);没有冗余,一台机器宕机所有应用一起下线,有人认为这违背「云」的本义;安装仍然是服务器运维流程,离「双击安装包」还有距离,作者回复中提到预配置树莓派的方向在计划里;也有老用户指出 Cloudron、Yunohost、Umbrel、FreedomBox 这些先行者已经把类似问题解决过一遍,CIAB 的差异化最终要靠统一认证和应用间权限这两件事站住脚。
还有一个插曲值得记录:有评论者发现项目方在多个 GitHub 仓库开了 11 个宣传 issue 且未披露身份,作者回复确认是团队所为并致歉,承诺停止。开源项目冷启动的边界感,这个案例会被人反复引用。
对两拨人的实际意义
对已经有 NAS、VPS 或 Homelab 的人,CIAB 提供的是一套把散装自托管整理成平台的能力:不用再逐个应用配反代和证书,不用再记每个应用的独立账号,跨应用的密钥共享和备份有了统一入口。它对硬件的要求不高,家里一台闲置 x86 机器开个虚拟机就能跑,ARM 镜像还在路上。
对没有服务器的人,诚实的答案是这个项目此刻还不适合你:安装要碰 SSH、DNS 和虚拟机,管理要理解容器和存储分层。发布文章也承认早期用户需要技术背景,或者需要一个编码智能体代劳。但 Imbue 押注的方向在产品里已经能看出轮廓:当 AI 智能体能可靠地完成打包、部署、排障的全流程时,自托管的门槛会落到「你有没有一台机器和一个域名」,运维技能不再是必要条件。这家公司选择同时做平台和智能体,等两条线在某个版本汇合。
项目以 AGPL-3.0 协议开源,代码在 GitHub 的 cloud-in-a-bottle 组织下,Imbue 同时提供每月 10 美元额度的托管实例作为商业模型,自托管和托管跑的是同一份代码。
参考来源: