# 前言

服务器上重要数据的日常备份是非常重要的,然鹅使用一般的全量备份太过于占空间,并且如果无加密备份至第三方平台还有数据安全风险(例如学生或企业 OneDrive 几 T 的空间,管理员是能够看见你的文件的)。

因此,能有一个安全,省心,方便的备份工具十分重要。

而今天的主角就是 ——kopia

当前 kopia 仍处于快速迭代阶段,更新时请务必查看相关 Break Change,以免对存储库造成不可逆的损害!!!

# 开始

kopia 支持 Windows,Linux,macOS 等多个平台,可以说是全平台支持了。

kopia 支持命令行和 GUI 两种管理方式,在 Linux server 上还可以通过 Web UI 的方式管理(功能会少一些,但是正常启动备份没问题)(本质上还是通过调用的命令行)

如果需要使用 GUI 就安装带有 UI 字段的包,需要使用命令行就直接安装不带 UI 字段的 kopia 包即可

tips:kopia-ui 包含了 kopia,因此安装了 kopia-ui 就不用再安装 kopia 了。

我这里因为使用的是 Linux 服务器,因此安装的是 kopia 并且使用 WebUI + 命令行的方式管理。(部署和安装会使用命令行,日常管理使用 WebUI)

# 安装

打开官方下载页面,找到适合自己系统的 kopia 并安装

https://kopia.io/docs/installation/

这里我安装的为不带 UI 的 kopia。

安装完成后输入 kopia 能输出信息则安装成功。

这是 kopia 常用命令列表 https://kopia.io/docs/reference/command-line/common/

# 创建存储库

目前 kopia 的策略是只能同时连接一个存储库,所以我们先创建一个存储库。

1
kopia repository create filesystem --path /tmp/my-repository

上面命令的 filesystem 为本地存储, --path 后的 /tmp/my-repository 为存储库位置,想要其他存储方式可以参考常用命令列表中的 Commands to manipulate repository 一节。

当然你也可以使用挂载的方式先将其他存储挂载至本地目录也行。

输入完命令后会要求输入密码用于加解密存储库,输入你的密码回车即可

tips:请一定牢记密码!!!一旦遗忘密码除了暴力穷举目前没有任何人和任何方法能够打开你的存储库!!!

# 连接存储库

输入以下命令进行连接存储库

1
kopia repository connect filesystem --path /tmp/my-repository

# 启动 kopia 服务器

这个环节不是必须的,但是使用 WebUI 管理会方便很多(打命令太痛苦了。。。)

因为我前端有 openresty 进行反向代理并且配置有 SSL,因此我不需要在 kopia 配置 ssl 证书。

1
kopia server start --address 0.0.0.0:51515 --insecure --server-password=进入WebUI所需要的密码

这里的 --insecure 参数使 kopia 直接使用 http 进行通信,如果你服务器暴露于公网并且没有进行反代,建议一定不要加上 --insecure 参数并完整配置 SSL,否则有遭受中间人攻击的风险!!!

相关资料请参考官方说明:https://kopia.io/docs/repository-server/#auto-generated-tls-certificate

登录 WebUI 有多种验证组合,但是 Bug 真的是有亿点点多,反正就是登录不进去,最后采用最简单的方式。而这种方式的用户名是锁死为 kopia ,并且 WebUI 采用基础的 HTTP Auth,所以没有验证码,2FA,因此一定要将 --server-password 设置为强密码,否则有被暴力破解的风险!!!

我则是在不使用 WebUI 时将反向代理关闭防止被其他人访问。

# 创建系统服务

如果不创建系统服务那么 kopia 的定时备份功能将无法使用!!!

1
2
touch /lib/systemd/system/kopia.service
nano /lib/systemd/system/kopia.service
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=kopia
Documentation=kopia
After=network.target
[Service]
User=root
Group=root
ExecStart=上面启动server的命令

[Install]
WantedBy=multi-user.target

然后就是 enable+start 了

1
2
systemctl start kopia.service 
systemctl enable kopia.service

当然你也完全可以按照自己喜欢的来创建服务或者开机启动项。

# 创建快照

kopia 采用目录级别的备份

进入 WebUI,点击 SnapShots 下的 New snapshot 按钮新增快照。

输入你想要增量备份的目录,然后将会出现一系列配置策略,这里我们着重关注这几点:

  • Snapshot Retention 下的 Latest Snapshots
  • File 下的 Ignore Rule FilesIgnore Files
  • Compression 下的 Compression Algorithm
  • Scheduling 下的 Snapshot Frequency 或者 Times Of Day

Latest Snapshots 它决定了你将要保留多少份快照,具体设置需要根据备份频繁程度以及实际情况考虑。

Ignore FilesIgnore Rule Files 顾名思义就是用来忽略文件的,我推荐使用 Ignore Rule Files ,感觉 Ignore Rule Files 更方便一点,具体 Ignore Rule Files 写法可以参考官方:https://kopia.io/docs/advanced/kopiaignore/

Compression Algorithm 则是选择存储库的压缩算法,具体算法区别官方已经列出,可根据实际情况选择:https://kopia.io/docs/advanced/compression/

Snapshot Frequency 或者 Times Of Day 决定何时备份快照。

最后点击 Snapshot Now 即可完成配置并立即拍摄快照。

回到首页可以很方便的看到快照目录以及刚刚拍摄的快照,就像正常的文件浏览器一样浏览文件。

# 同步存储库

有时一个存储库并不安全,我们需要将存储库同步至多个地方才能保证存储库的容灾,使用 repository sync-to 即可完成存储库的同步。

1
kopia repository sync-to filesystem --path=...

这个命令会将当前连接的存储库同步至目标位置,位置可以是本地文件系统,也可以是 s3,webdav,sftp 等。

输入完命令后等待同步完成即可。

不过默认同步不会对目标存储库执行任何删除操作,下面是官方的原话:

By default, synchronization does not perform any deletions in the destination location, even if the source file has been deleted. Without deletions, the resulting repository will still be correct, but will not benefit from compaction and will run more slowly. To allow deletions, pass --delete option

1
kopia repository sync-to filesystem --path ... --delete

# 清除文件缓存

kopia 的机制,当你删除快照后,文件仍会暂留在存储库内,直到触发 blob gc。

如果想要立即释放空间,可以手动执行不安全的完全维护。(不推荐直接使用 blob gc)

tips:请确保当前存储库没有正在发生并发操作,并且存储库存储已经正确同步,否则可能会导致存储库损坏!!!

1
kopia maintenance run --full --safety=none

# 后记

kopia 采用拍摄快照的方式进行增量备份,和 Git 类似,但不支持对某个快照内的文件单独进行修改,因此请先配置好策略再进行拍摄,以免造成各种不便。

kopia 存储库加密方式一旦确立,后续就无法进行修改。