公开测试版 · macOS 14 及以上
免费的菜单栏应用:先在 Mac 上加密你的文件夹,再按时间表备份到你自己的硬盘、存储桶或服务器。
01 · 文件去哪儿
你的 Mac
你挑的文件夹
…任何你选的文件夹
Keelhaven
住在你的菜单栏里
你自己的存储
你信得过的地方
路径上没有:Keelhaven 的服务器账号遥测
02 · 怎么用

文件夹、目的地、时间表。

绿点亮着,说明上次备份成功了。

恢复到新文件夹,不覆盖任何文件。
03 · 不锁定
每个计划都是标准的 restic 仓库。在任何 Mac 或 Linux 上都能恢复,装不装 Keelhaven 都一样。
$ restic -r sftp:you@nas.local:/backups \
restore latest --target ~/Restored04 · 定价
GPLv3 开源。没有账号,没有订阅,没有遥测。
无 Dock 图标,没有主窗口。选定文件夹、备份存储介质、定时策略,后台静默执行,出错才推送通知。密码仅保存在 macOS 钥匙串,生成标准 restic 仓库,脱离本软件也能用 restic 命令行恢复。
05 · 常见问题
不能,两个一起用。时间机器擅长把整台 Mac 恢复原样,用的是桌上那块硬盘;Keelhaven 管的是第二份副本:丢不起的那些文件夹,加密后放到别的地方。
没出问题。Beta 版还没做 Apple 公证,macOS 对所有没法在线验证的应用都会弹这个警告。允许一次,同一版本就不会再问:
xattr -d com.apple.quarantine /Applications/Keelhaven.app 一条命令清掉隔离标记,连对话框都不会弹。备份就找不回来了,这是有意为之:仓库端到端加密,备用钥匙谁手里都没有,我们没有,你的存储服务商也没有。Keelhaven 把密码存在钥匙串里,过一道 Touch ID 随时能拷出来;最好也存一份进你的密码管理器。
计划的 ⋯ 菜单里有 恢复文件…,它会列出这个计划的每一个快照(日期、文件数、大小,最新的在最上面),你挑一个时间点,再挑放到哪儿。它会恢复进一个以计划名和时刻命名的新文件夹,不覆盖你现在手上的任何文件,所以恢复这件事本身永远不会让你丢掉当前的版本。
不必整个恢复。点 选择文件… 可以打开你选的那个快照,按文件夹展开或按名称搜索,选中要的文件或文件夹,再点 恢复选中的项目…,就只恢复这些。(0.9.2 及以后的版本。)
这一切都不依赖 Keelhaven 还在:仓库是标准 restic 格式,在任何 Mac 或 Linux 上用 restic restore 一样能恢复。
没有套路。Keelhaven 的备份引擎是 restic,免费、开源、久经考验;Keelhaven 补上命令行工具留给用户自己操心的部分:定时真的会跑,密码放钥匙串、不落盘不进日志,菜单栏没事不吭声。它没有服务器要养,背后也没有公司,整个项目开源,不需要商业模式也能活下去。要是它在你的 Mac 上站住了脚,向朋友推荐一句,就是对它最好的支持。
不会。每个计划写入的都是标准 restic 仓库,在任何 Mac 或 Linux 上用开源的 restic 命令行就能列出、校验、恢复,不需要装 Keelhaven。哪天 Keelhaven 没了,你的备份还在。
读不到。所有内容上传前就在你的 Mac 上加密完成,仓库密码只在你的钥匙串里。没有服务器、没有账号、没有遥测,这个应用就算想发数据,也没有地方可发。
挂在 Mac 上的外置硬盘或网络硬盘;任何兼容 S3 的存储桶(AWS、Backblaze B2、Wasabi、Cloudflare R2、MinIO);用 SFTP 连自己的服务器或 NAS;以及你自己架设的 restic REST server。
因为 B2 不是删除,而是隐藏。Keelhaven 通过 B2 的 S3 兼容 API 访问它,而经由这个 API 删除对象,只会把旧版本标记为隐藏,并不会真正移除。隐藏的版本照样占用存储、照样出现在账单上,而且 restic forget --prune 再跑多少次也够不着它们——删除指令早就发出去了,它已经做完了这个 API 允许它做的事。
解法是存储桶上的一个设置,不在 Keelhaven 里。在 B2 存储桶的生命周期设置中选择 Keep only the last version of the file(只保留文件的最新版本)。这正是 restic 官方文档对 B2 的建议,文档里也写明了之后会发生什么:文件的旧版本会被「隐藏」一天,然后由 B2 自动删除。
空间通常会在随后一两天内回来,而不是立刻。B2 按它自己的节奏执行生命周期规则,所以第二天早上看桶还没什么变化是正常的,并不代表规则没生效。
默认会,因为删你的数据这件事,Keelhaven 从不自作主张。每次运行加一个去重后的快照,只存变化的部分。
想让某个计划别再涨,编辑计划 → 保留策略里有三种停下来的办法。保留一年和保留一个月会把较旧的快照按每日、每周、每月逐级精简,越往前留得越稀。保留固定份数的备份更直接也更好算:只留最近 N 次,更早的一律删掉,不管它有多新,所以在一下午里连着备好几次,就可能把上个月整个挤掉——选它就是接受这笔账。
无论选哪种,空间都在备份完成后回收,每周最多清一次。仓库始终是标准 restic 格式,想自己用 restic forget --prune 按别的策略清,随时可以。
能。编辑计划 → 高级里有一项上传限速(KiB/秒),填上之后 restic 就不会再压过这个速度,第一次全量备份也不至于让你开会时卡到说不出话。同一处还能调低同时读取的文件数——机械移动硬盘上尤其值得,同时读多个文件只会让它反复寻道;也能调大打包大小,适合按请求次数计费的云存储。三项默认都是空的,留空就是 restic 出厂时的样子。
备份失败或没跑完不会悄无声息,引擎报的错会立刻出现在菜单栏和系统通知里。Keelhaven 还会定期用 restic 自带的完整性检查验证仓库,默认每周一次,可按计划调整;通过了就在计划行里安静记一条「已验证」,有问题才会吵你。当然,隔三差五真恢复一个文件出来,才是检验备份的金标准,用什么工具都一样。
这是 macOS 在保护你的文件,不是备份引擎出了问题。桌面、文稿、下载、iCloud 云盘以及资源库中的部分位置,在你授权之前对所有 App 都是关闭的——而这些恰好就是人们做第一个备份计划时会选的文件夹。Keelhaven 会把读不到的文件列出来,而不是丢一句笼统的失败;计划那一行还有个按钮,直接打开对应的设置面板。
一次性解决:打开 系统设置 › 隐私与安全性 › 完全磁盘访问权限,打开 Keelhaven 的开关——然后退出并重新打开 Keelhaven,再运行备份。macOS 只会把新授予的权限交给重新启动的进程(系统设置里的「退出并重新打开」按钮就是干这个的)。
如果更新之后又出现,原因在这里。 macOS 把这项权限绑定在授权时的那个具体构建上。Keelhaven 的 beta 版本还没有 Developer ID 签名,所以每个新版本在它眼里都是另一个 App,权限需要重新给一次:用 − 按钮把 Keelhaven 移除,再从「应用程序」里重新添加,然后退出并重新打开。签名和公证之后这一步会消失;在那之前,一次发版就可能让它回来。
有一点值得知道:这次运行可能已经把能读到的内容存成了一个快照——restic 会先写下读得到的部分,再报告其余。这类快照在恢复窗口里会标注为不完整,所以不会出现「看着像备份好了、其实缺文件」的情况。
这也是它为什么是一个 App 而不是一个脚本。把这项权限交给一个 shell 脚本,等于交给你的终端——那扇门比一个 App 大得多。
不用。Keelhaven 需要的都在应用包里,包括备份引擎:没有第二步安装,不依赖 Homebrew,也没有要你自己保持更新的组件。
能,两种方式,装的都是下载按钮那个 DMG。有 Homebrew:brew install --cask shenxianpeng/tap/keelhaven,以后 brew upgrade 自动跟进新版本。没有:curl -fsSL https://keelhaven.app/install.sh | bash 下载最新版并拷进「应用程序」。脚本就一页 shell,不放心可以先看一遍。
App Store 要求应用跑在沙盒里,而备份引擎得读你指定的任意文件夹、连网络和 SSH。反过来,待在沙盒之外也意味着你可以给它「完全磁盘访问权限」——macOS 要求任何 App 读取桌面、文稿、下载之前必须先拿到的那项授权。Keelhaven 开着强化运行时(hardened runtime),只是不走商店;Beta 期间也还没公证,所以第一次打开要多点一次确认。
macOS 14 及以上 · Apple 芯片和 Intel