自托管
通过 SSH,把备份存到你自己管理的电脑上的一个文件夹里。可以是 Linux 服务器、NAS、Raspberry Pi、VPS,也可以是开启了 SSH 服务器的 Mac 或 Windows 电脑。Frost 使用你电脑上已有的 SSH 客户端,所以服务器上不需要安装任何东西。
#开始之前
- 服务器需要开启 SSH 和 SFTP。大多数 Linux 服务器两者都有。在 NAS 上,请到终端或文件服务的设置中查找。
- 你需要一个能写入目标文件夹的服务器账户。最好专门为备份建一个账户。
- 在 Windows 上,需要安装 OpenSSH 客户端。通常已经装好了。如果没有,请在“设置”的“系统 > 可选功能”中添加。
#在设置程序中
运行 frost init,选择 Self-hosted。
| 设置程序的问题 | 回答 |
|---|---|
| What is the server SSH address? | 用户和主机,比如 [email protected],或者 SSH 配置中的某个 Host。如果端口不同,加上 :2222 这样的后缀 |
| Which folder on the server? | 默认是 frost,位于你在服务器上的主文件夹中。也可以填写完整路径,比如 /srv/backups/frost |
如果文件夹的最后一级不存在,设置程序会创建它。它所在的上级文件夹必须已经存在。
#Frost 的 SSH 密钥
Frost 会在首次设置时创建专用的 SSH 密钥。不需要你的个人密钥或 SSH 代理,也不会询问密码,因此计划备份每次都以相同的方式登录。
服务器还不认识 Frost 的密钥,所以第一次时,设置程序会问你怎样添加:
- Add it for me(替我添加)会把终端交给 ssh。第一次连接某台服务器时,ssh 会显示它的指纹,并询问你是否信任它。接着它会询问你在服务器上的密码,添加 Frost 的密钥,然后设置程序继续。你的密码只交给 ssh。Frost 永远看不到也不会保存它。
- I'll add it myself(我自己添加)会显示 Frost 公钥文件的位置。把这个文件中的那一行添加到服务器上的
~/.ssh/authorized_keys,然后按[enter]。
| 电脑 | Frost 的公钥 |
|---|---|
| macOS 和 Linux | ~/.config/frost/ssh/frost_ed25519.pub |
| Windows | %AppData%\frost\ssh\frost_ed25519.pub |
由设置程序添加密钥时,那一行以 restrict 开头。它会禁用连接转发和终端分配,但 Frost 仍然可以读写文件。除非服务器将该账户限制为仅使用 SFTP,否则仍然可以执行 shell 命令。
#手动添加密钥
在 macOS 或 Linux 上,下面的命令会在密钥前加上 restrict 再添加,并询问你在服务器上的密码:
(printf 'restrict '; cat ~/.config/frost/ssh/frost_ed25519.pub) | ssh [email protected] 'umask 077; mkdir -p .ssh; cat >> .ssh/authorized_keys'
有些 NAS 系统也允许你在账户设置中粘贴 SSH 密钥。
Windows 服务器把密钥放在别的位置,所以 Add it for me 在那里用不了。如果是标准账户,把那一行添加到 C:\Users\<you>\.ssh\authorized_keys;如果是管理员,添加到 C:\ProgramData\ssh\administrators_authorized_keys。
#端口和 SSH 配置
Frost 与 ssh 一样读取 ~/.ssh/config。你可以用 Host 条目设置用户、端口等选项,并将条目名称作为地址输入。Frost 会提供专用密钥,但 SSH 配置中通过 IdentityFile 明确指定的密钥也可能被提供给服务器。
#注意事项
- 服务器的文件系统需要支持硬链接,Frost 用它来确保两台电脑永远不会互相覆盖备份记录。ext4、Btrfs、XFS、ZFS、APFS 和 NTFS 都支持。设置程序会在连接时检查这一点。
- 如果服务器的主机密钥变了,Frost 会像 ssh 一样拒绝连接。如果你重装了服务器,请用
ssh-keygen -R <host>删除旧密钥,然后再次运行frost init。 frost status会显示服务器磁盘的使用情况,frost backup会在快满时发出警告。- 如果文件夹位于服务器挂载的磁盘上,备份运行时这块磁盘必须已经挂载。如果文件夹不在,备份会失败,而不会写到别的地方。