如何在 Linux 上安装和配置 Restic REST 服务器
Restic是一个高效、现代化的重复数据删除备份系统,支持加密;它能够通过 SFTP 连接或在许多受支持的存储平台之一(例如 Amazon S3 存储桶和 Google 云存储)上本地和远程存储备份。通过使用 Restic REST 后端 API,还可以使用 HTTP 或 HTTPS 协议将备份推送到实现 Restic REST API 的远程服务器。
在本教程中,我们将学习如何使用 Docker 在 Linux 上部署和配置 Restic REST 服务器实例。
在本教程中您将学习:
- 如何在 Linux 上使用 Docker 部署 Restic REST 服务器
- 如何配置身份验证和使用 SSL/TLS 加密
创建存储库目录并生成凭据
在使用 docker 部署 Restic REST 服务器之前,我们需要选择用于托管存储库和备份数据的目录。为了本教程的目的,我将在我的主目录中创建一个“data”目录。该目录将绑定安装在容器内:
$ mkdir ~/data
在 docker 容器内运行的 Restic REST 服务器默认启用身份验证。这对于避免未经授权访问我们的数据非常重要。 Restic REST 服务器身份验证是通过 .htpasswd 文件实现的; REST 服务器在存储快照的同一目录中查找此文件。
要生成身份验证凭据,我们需要使用 htpasswd 实用程序。在 Fedora 和基于 Fedora 的发行版上,该实用程序包含在 httpd-tools 包中。我们可以用dnf安装它:
$ sudo dnf install httpd-tools
在 Debian 和基于 Debian 的发行版上,该软件包称为 apache2-utils:
$ sudo apt-get update && sudo apt-get install apache2-utils
要填充 .htpasswd 文件,我们运行:
$ htpasswd -B -c ~/data/.htpasswd resticuser
使用上面的命令,我们创建使用“resticuser”用户名访问服务器所需的配置。如果我们不直接提供密码作为命令的参数,系统会提示我们以交互方式输入密码:
New password:
Re-type new password:
Adding password for user restserver
由于我们使用了-B
选项,密码将使用bcrypt算法进行哈希处理,这被认为是非常安全的。
运行 Restic REST 服务器容器
Restic REST 服务器是免费的开源软件;与 Restic 应用程序一样,它是用 Go 编写的,并在 GitHub 上开发。部署 Restic REST 服务器的最快、最简单的方法是使用 Docker(或 Podman),基于项目提供的服务器镜像运行容器,该镜像可在 DockerHub 上获得。要创建并生成 Restic REST 服务器容器,我们所要做的就是使用以下命令:
$ docker run -p 8000:8000 -v ~/data:/data:z --name restic_rest_server docker.io/restic/rest-server
让我们看一下该命令使用的选项。默认情况下,容器内的 REST 服务器侦听端口 8000,因此我们使用 -p
选项将主机上的端口 8000 映射到容器内的同一端口(我们可以使用任何主机端口) ,例如端口 80,但是使用非特权端口,我们可以轻松地以非 root 用户身份生成容器(如果您想在没有 root 权限的情况下运行 Docker 或 Podman 时使用更高的端口,请查看本教程)。
为了使备份持久化,如前所述,我们将主机上的 ~/data
目录绑定安装到容器内的同一目录,这是存储快照的位置。在示例中,我们使用 :z 选项进行绑定挂载:仅当 SELinux 处于活动状态时才需要此选项,并且会导致挂载目录的上下文发生更改,以便可以从容器访问它。
初始化存储库
此时,我们应该已经能够使用 Restic 客户端初始化 Restic 存储库,使用 rest:http://resticuser:resticpassword@localhost:8000 URL:
restic -r rest:http://resticuser:resticpassword@localhost:8000 init
如果一切按预期进行,存储库将正确生成并初始化:
created restic repository 0216975ff5 at rest:http://resticuser:***@localhost:8000/
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
尽管存储库已正确生成,但我们应该真正避免通过纯文本 HTTP 连接传递凭据。要通过 HTTPS 使用 Restic REST 服务器,我们需要使用 SSL/TLS 证书。让我们看看如何做。
使用安全的 HTTPS 连接
我们可以通过多种方式获取 SSL/TLS 证书。如果我们打算将 Restic REST 服务器公开到互联网,我们需要为我们的域使用有效的第三方证书。我们可以使用 certbot 轻松地从 Let’s Encrypt 获取一个。然而,如果我们只想执行一些测试,或者我们计划在自己的网络中专门使用我们的服务器,那么生成自签名证书就足够了。
在这里,我假设我们已经拥有证书(包含公钥)和私钥,分别存储为public_key和private_key。我们可以将它们与在 docker 容器内运行的 REST 服务器一起使用的最简单方法是将它们放置在我们绑定安装在容器内的数据目录中(与 .htpasswd 文件所在的目录相同) ),并使用 --tls
选项运行服务器。然而,由于我们不直接运行服务器,因此在运行容器时,我们需要通过 OPTIONS 环境变量传递此选项:
$ docker run -p 8000:8000 -v ~/data:/data:z -e OPTIONS="--tls" --name restic_rest_server docker.io/restic/rest-server
我们现在可以通过 HTTPS 与服务器通信。由于在本例中我们使用了无效的自签名证书,因此我们需要使用 --insecure-tls
选项运行 Restic 客户端,该选项在连接到存储库时会跳过 TLS 证书验证:
$ restic -r rest:https://resticuser:resticpassword@localhost:8000 --insecure-tls init
结论
在本教程中,我们学习了如何在 Linux 上使用 Docker 部署 Restic REST 服务器。借助 Restic,我们可以使用 SFTP 连接(受支持的第三方存储服务之一)或 Restic REST 服务器在本地或远程创建备份。与 SFTP 相比,后者提供了更好的性能,并且使我们能够运行仅附加连接。要了解有关 Restic 以及如何执行高效备份的更多信息,您可以查看我们的分步教程。