作为一个爱折腾的人,我的服务器上有几个自己写的 web 服务在跑,也有部署的开源软件。时间长了七八个服务分散在三四个平台上,经常需要到处续费,还要偶尔备份数据,部署的开源软件还要记得升级,可以说是挺烦的了。前两天偶然接触到 Cloudron 和 YunoHost,才知道有专门服务我这种需求的自托管平台,可以一键安装应用并通过面板管理。
我为了选到最适合自己的,不但安装了这两个平台,还又找到了一个竞品 Sandstorm。在选择的过程中我发现不但中文网络上没有比较它们的文章,英文网络上也没有写的很详细的,所以选择完了顺便写篇博客,也给大家介绍一下我的发现。
- 本文不是广告。
- 本文中的 Cloudron 链接是带 Ref 的,使用 Ref Code
059fff403129974a
付费你我均可获得 30 美元优惠。
自托管平台不是什么
自托管平台不是 ownCloud, Nextcloud 之类的私有云,尽管他们也提供文件存储,文档表格之类的应用,但是不能安装外来应用(比如 WordPress)。反而,在自托管平台上,我们可以安装一个私有云(例如在 Cloudron 提供了 Nextcloud).
需求
在开始比较几个平台之前,我先列一下我的需求:
- 尽量多的提供我正在使用的应用(Wordpress, Monica, FreshRSS, Confluence)
- 自动备份到外部存储
- 应用之间相互隔离,提高安全性
- 可以自动升级应用
- 可以使用自己写的应用
Cloudron
Cloudron 是一家商业公司提供的产品,在功能上远远领先其他两个产品,缺点是免费方案只能安装两个应用。付费的话是 $15 每月,可以在一台主机上安装不限数量的应用,并且绑定不限数量的域名。付费版还提供域名邮箱服务。
Cloudron 安装非常简单,在一台 Ubuntu 18.04 的机器上执行一个脚本就可以了(Installation)。安装的时候需要提供一个域名,将来的控制面板和各个应用都会使用它的子域名,并且 Cloudron 支持很多域名服务商的 DNS 管理 API,可以自动帮你创建子域名,也会自动申请 Let’s Encrypt 的 HTTPS 证书应用到你的网站上。
安装应用也非常简单,它提供一个 App Store,找到你需要的应用,只要点一下,提供一个域名前缀就可以安装到你的主机上了。
Cloudron 的备份功能是最方便的,支持很多对象存储平台的接口,主流的云计算和 VPS 平台都包括了,而其他不支持的平台(比如阿里云、腾讯云)也可以通过 S3 兼容 API 使用,需要注意的是它提供的存储里不包括网盘,所以备份的存储应该需要额外付费。我使用的是 aws lightsail 主机,备份到不同区域的 aws S3.
Cloudron 使用 docker 做应用之间的隔离,这样一个应用有漏洞,攻击者借此入侵其他应用的可能性就会降低。在使用 docker 的同时 Cloudron 也在控制台提供了很好的日志和 web terminal 工具,这让管理文件和导入数据都变的容易了许多。
Web terminal,我就是在这里上传了 SQL 文件并导入 Cloudron 的数据库:
应用日志:
在 Cloudron 中使用自己的应用也很容易,对于 PHP 应用,可以直接安装一个 LAMP Empty Stack 并且上传代码。其他语言的应用也可以按照文档中的步骤(Packaging Tutorial)自己打包。
YunoHost
YunoHost 是一个开源项目,没有付费选项,和 Cloudron 非常类似,除了它没有使用 Docker,应用是直接安装在主机上的。它有一个由社区维护的应用目录,只是应用数量相对较少。
安装时,YunoHost 会默认给你提供一个二级域名(根域名是 noho.st),也就是你不需要准备域名就可以使用。但是也可以绑定自带的域名,并且使用 Let’s Encrypt 签发证书。和 Cloudron 不同的是,它的每个应用会默认提供一个 URL 路径而不是子域名。例如,https://example.noho.st/freshrss。也因此它无法帮你连接域名服务商管理 DNS。
备份方面,Yuno 只能备份数据到本地硬盘,也就是不小心删掉主机,备份数据可能会一起丢掉。所以要安心使用的话还要自己写脚本同步。
因为 YunoHost 并没有使用 docker 隔离应用,所以想要读写应用的文件和数据库时直接 SSH 登录到主机上就可以了,MySQL 的密码也可以通过 root 权限拿到,然后就能直接从命令行向里写入数据。
YunoHost 并没有提供 LAMP 空应用,要添加应用目录里没有的应用,都要通过 App packaging 来自己打包。
Sandstorm
Sandstorm 是我最喜欢的一个项目,它和另外两个平台走了不同的路子,对平台上的应用做了深度定制。用户系统必须集成 Sandstorm 的,应用的界面也只能显示在 Sandstorm 里,并且程序和数据是分离的,每份数据被称为一个 Grain。
这是在 Sandstorm 中使用财务管理软件 Firefly 的截图,左侧和顶部的黑色边栏都是 Sandstorm 的,Firefly 的界面被嵌入其中。因此 Sandstorm 中的每个应用,不但不需要域名,连 url 入口都没有,用户必须先登录 Sandstorm 才能使用,从架构上就比另外两个安全。
Sandstorm 的安装也很简单,安装时会分配一个 sandcats.io 下的二级域名。不同的是 Sandstorm 不使用账号密码登录,你需要去 GitHub 里新建一个 App,然后用户使用 Github 账号授权登录。这进一步的提高了 Sandstorm 的安全性。
安装好 Sandstorm 之后,就可以去 App Market 安装应用了。可能是因为需要深度定制的原因,它的应用数量是三个之中最少的。
安装好 App 之后你还不能马上使用,而是要给 App 新建一个 Grain(上图左侧栏就是最近使用的 Grains)。这也是 Sandstorm 的一个特色,以 WordPress 为例,每个站点就是一个 Grain,多个站点共用一份程序,但是数据保存在不同的 Grain 里,每个 Grain 的数据都可以单独保存下载。问题是,我觉得 Grain 的粒度并不合理,我试用了两个笔记 App,一个是每个笔记本是一个 Grain,另一个竟然每一篇笔记是一个 Grain,这就太细了。Gitlab 的 Grain 是一个 repo,我觉得也不合理。
权限的控制和数据的备份都是针对 Grain 的,可惜的是 Sandstorm 并没有提供全站自动备份,只能手动下载一个 Grain 的 zip 包,或者通过上传 zip 包来导入数据。
最后,想要打包自己的 App,Sandstorm 也提供了文档(Packaging Tutorial),不过看起来是最复杂的。
Sandstorm 曾经是一家商业公司开发的,但是在 2017 年宣布经营失败已经解散了,现在是由社区维护的开源项目。
总结
经过比较后,我觉得三个平台各有千秋,Cloudron 就是省心,但是要花钱。YunoHost 和 Sandstorm 都是免费的,但是需要一点折腾,和我想节省时间的初衷不符。最后我还是选择了 Cloudron 用来托管服务,但是留下了 Sandstorm 用来玩。
性能方面,我没有认真测试,但是 Cloudron 的性能似乎是最好的,在 1GB RAM 的机器上跑了三个应用,非常流畅。YunoHost 会感觉到卡顿,Sandstorm 在 1GB RAM 的机器上安装都成问题。
Last but not Least
如果要为 Cloudron 付费,不要忘记我的 Ref Code 059fff403129974a
😊