如何使用 docker-compose 在 5 分钟内设置 bup remote 服务器
bup 备份系统通过 SSH 连接到服务器、在那里启动 bup 进程然后通过 SSH 隧道通信来实现服务器上的远程备份。
在本文中,我们将基于我们的 ulikoehler/bup-server 镜像(包含 bup 和 dropbear 作为 SSH 服务器)设置 bup 远程备份服务器。
1. 初始化目录结构并创建 SSH 密钥集以访问服务器
我建议在 /opt/bup 中执行此操作,但原则上任何目录都可以。
mkdir -p dotssh bup
# 生成新的椭圆曲线公钥
ssh-keygen -t ed25519 -f id_bup -N ""
# 将 SSH 密钥添加到授权密钥列表
cat id_bup.pub | sudo tee -a dotssh/authorized_keys
# 修复权限以便 dropbear 不会抱怨
sudo chown -R 1111:1111 bup
sudo chmod 0600 dotssh/authorized_keys
sudo chmod 0700 dotssh1111 是 VM 中 bup 用户的用户 ID。
2. 创建 docker-compose.yml
*注意:*此 docker-compose.yml 使用本地备份目录 - 你也可以从例如 NAS 设备挂载 CIFS 目录。有关更多详细信息,请查看带 CIFS 挂载备份存储的 bup 远程服务器 docker-compose 配置。
services:
bup-server:
image: ulikoehler/bup-server:latest
environment:
- SSH_PORT=2022
volumes:
- ./dotssh:/home/bup/.ssh
- ./dropbear:/etc/dropbear
# BUP 备份存储:
- ./bup:/bup
ports:
- 2022:2022
restart: unless-stopped3. 启动容器
此时,你可以使用 docker-compose up 启动服务。但是,通常更容易的是使用 TechOverflow 的脚本来生成 systemd 脚本以在启动时自动启动服务(并立即启动它):
curl -fsSL https://techoverflow.net/scripts/create-docker-compose-service.sh | sudo bash /dev/stdin运行 docker-compose logs -f 时,你应该看到来自 dropbear 的问候消息,如
bupremotedocker-bup-remote-1 | [1] Dec 25 14:58:20 Not backgrounding4. 在客户端创建 .ssh/config 条目
你需要为每个客户端执行此操作。
将 id_bup(我们之前生成的)复制到每个客户端的文件夹中,如 ~/.ssh。你复制到哪里并不重要,但稍后运行备份的用户需要访问此文件。此外,对于该用户,你需要创建一个 .ssh/config 条目告诉 SSH 如何访问 bup 服务器:
Host BupServer
HostName 10.1.2.3
User bup
Port 2022
IdentityFile ~/.ssh/id_bup将 HostName 设置为运行 docker 容器的主机的 IP 或域名。
将 User 设置为 bup。这在容器中是硬编码的。
将 Port 设置为你在 docker-compose.yml 中映射的任何端口。如果 docker-compose.yml 中的 ports: 行是 - 1234:2022,则 .ssh/config 中 Port 的正确值是 1234。
将 IdentityFile 设置为 id_bup 所在的位置(见上文)。
现在你需要为每个客户端连接一次 bup 服务器容器。这既是为了发现 SSH 配置问题(如 id_bup 文件权限错误),也是为了将容器的 SSH 主机密钥保存为已知密钥:
ssh BupServer如果这提示你输入密码,则你的配置有问题 - 可能你连接到了错误的 SSH 主机,因为 bup 服务器容器已禁用密码认证。
5. 使用 bup 连接
每个客户端都需要安装 bup。请查看如何在 Ubuntu 22.04 上安装 bup及类似文章。
你必须理解 bup 需要一个本地目录(称为索引)和 bup 服务器上的一个目录(称为目标目录)。你必须每个备份项目使用一个索引目录和一个目标目录。你定义什么为备份项目取决于你,但我强烈建议为你备份的每个应用程序使用一个备份项目,以便具有数据局部性:来自一个应用程序的备份应该在一起。
按照约定,服务器(即容器)上的 /bup 目录专用于此目的(并映射到容器外的目录或卷)。
在本地主机上,我建议使用 /var/lib/bup/project.index.bup 或 ~/bup/project.index.bup,让 bup 从那里自动创建项目特定目录。如果你在客户端使用特殊用户进行备份,你也可以放置索引。如果索引丢失,只要备份正常工作就不是问题(只需几分钟重新检查所有文件)。你不应该备份索引目录。
.bup 或 .index.bup 后缀没有要求,但如果你使用它,它将允许你快速辨别目录是什么以及是否重要。
要使用 bup,你首先需要初始化目录。你可以多次执行此操作而不会出现任何问题,所以我在每个备份脚本的开头都这样做。
bup -d ~/buptest.index.bup init -r BupServer:/bup/buptest.bup之后,你可以开始备份。通常这通过首先运行 bup index(此操作仅在本地)然后运行 bup save(将备份保存在 bup 远程服务器上)来完成。
bup -d ~/buptest.index.bup index . && bup save -r BupServer:/bup/buptest.bup -9 --strip-path $(pwd) -n mybackup .一些参数需要进一步解释:
-9:最大压缩。bup非常快,几乎没有区别,但它节省了大量磁盘空间,特别是对于类文本数据。--strip-path $(pwd)如果你备份目录/home/uli/Documents/,其中包含文件/home/uli/Documents/Letters/Myletter.txt,这会使bup以Letters/Myletter.txt而不是/home/uli/Documents/Letters/Myletter.txt的名称保存该文件的备份。-n mybackup。此备份的名称。这允许你在单个仓库中分离不同的备份。
6. 让我们恢复!
你可能想说希望我永远不需要恢复。错误。你现在就需要恢复,而且你需要定期恢复,作为如果你实际需要通过恢复来恢复数据时它确实有效的测试。
为此,我们首先需要访问文件夹所在的位置。这通常存储在某种 Linux 服务器上,所以只需在那里安装 bup。在上面的示例中,我们将使用的目录名为 buptest.bup。
有两种方便的方法查看 bup 备份:
- 使用
bup web并在浏览器中打开http://localhost:8080查看备份数据(包括历史记录):
bup -d buptest.bup web- 使用
bup fuse将整个树(包括历史记录)挂载到目录如/tmp/buptest:
mkdir -p /tmp/buptest && bup -d buptest.bup fuse /tmp/buptest