使用 Plakar 进行异地备份和复制

4 分钟阅读·Matthieu·caddydebiansystemds3ubuntuplakaroffsite-backupbackupreplication|

将 plakar 快照复制到远程服务器(通过 HTTPS)或 S3 兼容对象存储。使用 plakar 内置调度器作为 systemd 服务,在 Debian 12 或 Ubuntu 24.04 上自动化备份和异地同步。

为什么需要异地备份?

本地备份可以防止意外删除和文件损坏,但无法防范磁盘故障、勒索软件或服务器被入侵。如果备份和数据在同一台机器上,一个事件就能同时摧毁两者。3-2-1 备份规则是:三份副本,两种不同介质,一份异地。本指南涵盖异地部分。

本文接续 使用Plakar备份你的Linux VPS。你应该已经在 Debian 12 或 Ubuntu 24.04 VPS 上安装了 plakar,有一个位于 /var/backups/plakar 的本地 Kloset 存储,并且至少有一个快照。如果没有,请先从那篇指南开始。

plakar 内置两种异地选项。路径 A 将快照复制到运行 plakar server 的第二台服务器(通过 HTTPS)。路径 B 将快照推送到 S3 兼容对象存储。两者都使用 plakar sync,并保持 Kloset 端到端加密。选择一条路径或两条都用。末尾的自动化部分适用于两者。

如何将 plakar 快照复制到远程服务器?

在第二台 VPS 上运行 plakar server,通过 HTTP 暴露 Kloset 存储。在前面放置 Caddy 实现自动 TLS。从源机器编译 HTTP 集成插件,将远程服务器添加为命名存储,然后使用 plakar sync to 推送快照。数据在 Kloset 存储中静态加密,通过 HTTPS 传输加密。这种方式让你完全控制两个端点。

本节需要两台机器。VM1 是拥有现有 plakar 备份的生产服务器。VM2 是位于不同数据中心或提供商的远程备份服务器。VM2 需要一个指向其 IP 地址的域名以获取 TLS 证书。示例使用 backup.example.com 作为域名。

本指南中的所有命令以 root 身份运行。如果使用 sudo 用户,请在每条命令前加 sudo

如何在 VM2 上设置 plakar server?

使用与主文章相同的步骤在 VM2 上安装 plakar:

apt update
apt install -y curl gnupg2
curl -fsSL https://plakar.io/dist/keys/community-v1.1.0.gpg | gpg --dearmor -o /usr/share/keyrings/plakar.gpg
echo "deb [signed-by=/usr/share/keyrings/plakar.gpg] https://plakar.io/dist/repos/deb/ stable main" | tee /etc/apt/sources.list.d/plakar.list
apt update
apt install -y plakar
plakar version
plakar/v1.0.6

在 VM2 上创建 Kloset 存储。生成一个强密码短语并保存在密码管理器中。这是一个与 VM1 不同的存储,所以有自己的密码短语:

mkdir -p /var/backups/plakar
openssl rand -base64 32

保存输出。你在 VM2 和 VM1 上都需要这个密码短语。创建存储:

plakar at /var/backups/plakar create
repository passphrase:

输入刚生成的密码短语。限制存储目录的权限:

chmod 700 /var/backups/plakar

将密码短语保存到文件中,使 plakar server 可以无交互启动:

mkdir -p /etc/plakar
cat > /etc/plakar/passphrase <<'EOF'
YOUR_GENERATED_PASSPHRASE_HERE
EOF
chmod 600 /etc/plakar/passphrase
chown root:root /etc/plakar/passphrase
ls -la /etc/plakar/passphrase
-rw-------  1 root root 45 Mar 20 14:00 /etc/plakar/passphrase

按名称注册存储:

plakar store add backups \
  location=/var/backups/plakar \
  passphrase_cmd="cat /etc/plakar/passphrase"

启动 plakar server 通过 HTTP 暴露存储。仅绑定到 localhost。Caddy 将处理外部连接:

plakar at @backups server -listen 127.0.0.1:9876

服务器在前台运行,将请求日志输出到 stdout。保持此终端打开。稍后你将为其设置 systemd 服务。

默认情况下,plakar server 禁用删除操作。这可以防止远程客户端删除快照。同步只需要写权限。除非有特定原因,否则保持删除禁用。

如何在 plakar server 前放置 Caddy 实现 TLS?

Caddy 提供自动 HTTPS 和 Let's Encrypt 证书。它终止 TLS 并将请求代理到 localhost 上的 plakar server。外部客户端连接到 443 端口,Caddy 转发到 9876 端口。

安装 Caddy 之前,确保 backup.example.com 的 DNS A 记录指向 VM2 的 IP 地址。Caddy 需要这个来通过 ACME HTTP-01 挑战获取 TLS 证书。80 端口也必须开放。

在 VM2 上安装 Caddy:

apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install -y caddy

用反向代理配置替换默认的 Caddyfile。将 backup.example.com 替换为你的实际域名:

cat > /etc/caddy/Caddyfile <<'EOF'
backup.example.com {
    reverse_proxy 127.0.0.1:9876
}
EOF

重新加载 Caddy 以应用配置:

systemctl reload caddy
systemctl status caddy
 caddy.service - Caddy
     Loaded: loaded (/lib/systemd/system/caddy.service; enabled; preset: enabled)
     Active: active (running)

Caddy 在第一次请求时自动获取 TLS 证书。从 VM1 或任何外部机器测试:

curl -I https://backup.example.com

200 或 404 响应表示 Caddy 正在成功代理到 plakar 服务器。TLS 错误表示证书尚未就绪。

如何用防火墙规则保护 plakar 服务器?

开放 80 端口(ACME 挑战)和 443 端口(HTTPS)。9876 端口绑定到 127.0.0.1,即使没有显式阻止规则也无法从外部访问。详细的防火墙设置请参见 如何在Linux VPS上使用UFW和nftables配置防火墙

使用 UFW:

ufw allow 80/tcp
ufw allow 443/tcp
ufw status

使用 nftables,添加到你的规则集:

nft add rule inet filter input tcp dport 80 accept
nft add rule inet filter input tcp dport 443 accept

证书签发后,如果你配置 Caddy 使用 TLS-ALPN-01 挑战,可以关闭 80 端口。默认的 HTTP-01 挑战需要 80 端口保持开放以进行续期。

如何在 VM2 上将 plakar server 作为 systemd 服务运行?

创建一个 systemd 单元,使 plakar server 开机启动并在失败时重启:

cat > /etc/systemd/system/plakar-server.service <<EOF
[Unit]
Description=Plakar Backup Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/plakar at @backups server -listen 127.0.0.1:9876
Restart=on-failure
RestartSec=10
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

如果前台服务器仍在运行则先停止(在那个终端按 Ctrl+C),然后启用 systemd 服务。enable --now 使其在重启后存活并立即启动:

systemctl daemon-reload
systemctl enable --now plakar-server.service
systemctl status plakar-server.service
 plakar-server.service - Plakar Backup Server
     Loaded: loaded (/etc/systemd/system/plakar-server.service; enabled; preset: enabled)
     Active: active (running)

监控服务器日志:

journalctl -u plakar-server.service -f

如何在 VM1 上安装 HTTP 集成?

回到 VM1。Plakar 需要 HTTP 集成来连接远程存储。HTTP 后端是一个与核心包分开发布的插件。使用 plakar 插件服务器的配方从源码编译。需要 Go 和 Make:

apt install -y golang-go make

下载配方文件并编译插件:

curl -fsSL https://plugins.plakar.io/kloset/recipe/v1.0.0/http.yaml -o /tmp/http.yaml
plakar pkg build /tmp/http.yaml

编译过程从其源代码仓库创建 HTTP 集成,并在当前目录生成 .ptar 归档文件。安装编译好的插件:

plakar pkg add ./http_v1.0.5_linux_amd64.ptar

确切的文件名取决于版本和架构。用 ls *.ptar 检查 pkg build 生成了什么。列出已安装的插件:

plakar pkg list
http@v1.0.5

如何将快照从 VM1 同步到远程服务器?

将远程服务器注册为命名存储。将 backup.example.com 替换为你的域名。passphrase_cmd 必须返回 VM2 存储的密码短语,而不是 VM1 的。将 VM2 的密码短语复制到 VM1 上的单独文件:

cat > /etc/plakar/remote-passphrase <<'EOF'
VM2_STORE_PASSPHRASE_HERE
EOF
chmod 600 /etc/plakar/remote-passphrase
chown root:root /etc/plakar/remote-passphrase

添加远程存储:

plakar store add remote \
  https://backup.example.com \
  passphrase_cmd="cat /etc/plakar/remote-passphrase"

将本地存储的所有快照推送到远程:

plakar at @mybackups sync to @remote
info: sync: synchronization from fs:///var/backups/plakar to https://backup.example.com completed: 3 snapshots synchronized

Plakar 使用 @mybackups 的密码短语读取,使用 VM2 的密码短语写入 @remote。只传输缺失的快照和数据块。后续同步跳过远程已有的数据。

按 ID 推送单个快照:

plakar at @mybackups sync a5bcf13b to @remote

只同步最近 7 天的快照:

plakar at @mybackups sync -since 7d to @remote

如何验证远程服务器上的复制?

在 VM2 上列出快照确认其已到达:

plakar at @backups ls
2026-03-20T10:05:12Z   a5bcf13b   1.4 MiB        0s /etc
2026-03-20T10:06:01Z   5fc17459       0 B        0s /home
2026-03-20T10:06:15Z   7ed22fb8      24 B        0s /var/www

快照 ID 和时间戳与 VM1 上的一致。从同步的快照中恢复单个文件以检查数据完整性:

plakar at @backups cat a5bcf13b:/etc/hostname

VM1 的主机名打印到 stdout。完整恢复测试:

mkdir -p /tmp/restore-test
plakar at @backups restore -to /tmp/restore-test a5bcf13b
ls /tmp/restore-test/etc/
info: a5bcf13b: OK /etc
info: restore: restoration of a5bcf13b:/etc at /tmp/restore-test completed successfully
rm -rf /tmp/restore-test

如何将 plakar 备份同步到 S3 兼容存储?

将 S3 兼容的存储桶添加为命名存储,然后使用 plakar sync 推送快照。这适用于任何支持 S3 协议的提供商。你提供自己的端点、存储桶和凭据。plakar 端不需要特定于提供商的配置。

如何安装 S3 集成?

S3 后端是一个插件,与 HTTP 相同。从源码编译:

curl -fsSL https://plugins.plakar.io/kloset/recipe/v1.0.0/s3.yaml -o /tmp/s3.yaml
plakar pkg build /tmp/s3.yaml
plakar pkg add ./s3_v1.0.7_linux_amd64.ptar

如果 Go 和 Make 尚未安装(如果你已经做了 HTTP 插件则已安装),请先安装:apt install -y golang-go make

两个插件现在都应该已安装:

plakar pkg list
http@v1.0.5
s3@v1.0.7

如何添加 S3 存储?

首先在你的 S3 提供商处创建存储桶。存储桶必须已经存在。Plakar 不创建存储桶。

使用 plakar store add 添加 S3 存储。将端点、存储桶名称和凭据替换为你自己的:

plakar store add s3 \
  s3://s3.eu-west-1.example.com/my-plakar-backups \
  access_key=YOUR_ACCESS_KEY \
  secret_access_key=YOUR_SECRET_KEY \
  use_tls=true \
  passphrase_cmd="cat /etc/plakar/passphrase"

s3:// 位置格式为 s3://端点/存储桶名称。设置 use_tls=true 以使用 HTTPS 连接到 S3 端点。passphrase_cmd 返回用于加密此新 Kloset 存储中数据的密码短语。

在存储桶内初始化 Kloset 存储:

plakar at @s3 create

Plakar 提示输入密码短语。输入与 passphrase_cmd 返回相同的密码短语。这会在存储桶中创建 Kloset 结构(元数据、索引)。存储桶本身存储加密的数据对象。

如何将快照推送到 S3?

将本地存储的所有快照推送到 S3:

plakar at @mybackups sync to @s3
info: sync: synchronization from fs:///var/backups/plakar to s3://s3.eu-west-1.example.com/my-plakar-backups completed: 3 snapshots synchronized

推送单个快照:

plakar at @mybackups sync a5bcf13b to @s3

列出 S3 存储上的快照:

plakar at @s3 ls
2026-03-20T10:05:12Z   a5bcf13b   1.4 MiB        0s /etc
2026-03-20T10:06:01Z   5fc17459       0 B        0s /home
2026-03-20T10:06:15Z   7ed22fb8      24 B        0s /var/www

从 S3 存储恢复文件:

plakar at @s3 cat a5bcf13b:/etc/hostname

从 S3 完整恢复目录:

mkdir -p /tmp/restore-test
plakar at @s3 restore -to /tmp/restore-test a5bcf13b:/etc/ssh
ls /tmp/restore-test/etc/ssh/
rm -rf /tmp/restore-test

plakar 需要哪些 S3 权限?

你的 S3 凭据需要存储桶上的这些最低权限:

  • s3:GetObjects3:ListBucket 用于读取快照和元数据
  • s3:PutObject 用于写入新快照
  • s3:DeleteObject 用于同步操作期间的锁清理

创建专用的 IAM 用户或服务账户,策略仅限于备份存储桶。不要重用具有更广泛访问权限的凭据。

如果你的提供商支持存储桶版本控制和对象锁定,请同时启用。版本控制防止意外覆盖。对象锁定(合规或治理模式)在可配置的保留期内阻止删除备份数据。这是你对抗入侵源服务器及其 S3 凭据的勒索软件的最后防线。

如何自动化 plakar 备份和同步?

设置 plakar 调度器进行本地备份,然后用 systemd 定时器链接异地同步。目标:备份按计划运行,然后快照自动同步到远程目标。初始设置后无需人工干预。

如何配置存储以实现无人值守运行?

如果你按照 使用Plakar备份你的Linux VPS 操作,你已经有了一个带 passphrase_cmd 的命名存储 mybackups。你还需要按前面章节所示配置带 passphrase_cmd 的异地存储(remotes3)。两个存储都必须无交互提示即可工作。

测试两个存储是否可访问:

plakar at @mybackups ls
plakar at @remote ls

如果任一命令提示输入密码短语,则 passphrase_cmd 配置不正确。返回修复后再继续。

如何为 plakar 编写 scheduler.yaml?

plakar 调度器按定义的间隔执行备份任务。它原生处理文件系统备份。创建调度器配置:

cat > /etc/plakar/scheduler.yaml <<'EOF'
agent:
  tasks:
    - name: backup etc
      repository: "@mybackups"
      backup:
        path: /etc
        interval: 24h
        check: true
    - name: backup home
      repository: "@mybackups"
      backup:
        path: /home
        interval: 24h
    - name: backup www
      repository: "@mybackups"
      backup:
        path: /var/www
        interval: 24h
EOF
chmod 600 /etc/plakar/scheduler.yaml

每个任务指定一个仓库、路径和间隔。第一个任务的 check: true 选项在每次备份后运行完整性验证。如果你更看重安全性而非速度,可以将其添加到所有任务。

调度器不原生支持同步作为任务类型。使用包装脚本和 systemd 定时器进行同步步骤。

如何在备份后自动同步?

创建一个包装脚本,将所有快照同步到异地目标:

cat > /etc/plakar/sync-offsite.sh <<'SCRIPT'
#!/bin/bash
set -euo pipefail

# Change to "s3" if using S3 instead of a remote server
OFFSITE_STORE="remote"

echo "$(date -Iseconds) Starting offsite sync to @${OFFSITE_STORE}"
plakar at @mybackups sync to @${OFFSITE_STORE}
echo "$(date -Iseconds) Offsite sync complete"
SCRIPT
chmod 700 /etc/plakar/sync-offsite.sh

手动测试脚本:

/etc/plakar/sync-offsite.sh
2026-03-20T14:00:00+00:00 Starting offsite sync to @remote
info: sync: synchronization from fs:///var/backups/plakar to https://backup.example.com completed: 0 snapshots synchronized
2026-03-20T14:00:01+00:00 Offsite sync complete

如果同时使用远程服务器和 S3,在脚本中添加第二行同步:

plakar at @mybackups sync to @remote
plakar at @mybackups sync to @s3

如何将 plakar 调度器作为 systemd 服务运行?

在 VM1 上为调度器创建 systemd 单元。-foreground 标志使调度器在前台运行,以便 systemd 可以跟踪进程:

cat > /etc/systemd/system/plakar-scheduler.service <<EOF
[Unit]
Description=Plakar Backup Scheduler
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/plakar scheduler start -foreground -tasks /etc/plakar/scheduler.yaml
ExecStop=/usr/bin/plakar scheduler stop
Restart=on-failure
RestartSec=30
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

为异地同步脚本创建 systemd 定时器。安排在备份有时间完成后每天运行:

cat > /etc/systemd/system/plakar-sync.service <<EOF
[Unit]
Description=Plakar Offsite Sync
After=network.target

[Service]
Type=oneshot
ExecStart=/etc/plakar/sync-offsite.sh
User=root
StandardOutput=journal
StandardError=journal
EOF
cat > /etc/systemd/system/plakar-sync.timer <<EOF
[Unit]
Description=Run Plakar Offsite Sync Daily

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

Persistent=true 表示如果服务器在定时器应该触发时关机,systemd 会在下次启动时立即运行同步。

启用所有服务:

systemctl daemon-reload
systemctl enable --now plakar-scheduler.service
systemctl enable --now plakar-sync.timer
info: Plakar scheduler up

调度器正在运行:

systemctl status plakar-scheduler.service
 plakar-scheduler.service - Plakar Backup Scheduler
     Loaded: loaded (/etc/systemd/system/plakar-scheduler.service; enabled; preset: enabled)
     Active: active (running)

同步定时器已计划:

systemctl list-timers plakar-sync.timer
NEXT                         LEFT          LAST  PASSED  UNIT                  ACTIVATES
Fri 2026-03-21 03:30:00 UTC  15h left      n/a   n/a     plakar-sync.timer     plakar-sync.service

监控调度器和同步日志:

journalctl -u plakar-scheduler.service --since today
journalctl -u plakar-sync.service --since today

如果你也运行 使用Plakar备份你的Linux VPS 中的数据库备份脚本,将同步定时器链接到数据库备份完成后运行。在 plakar-sync.service[Unit] 部分添加 After=plakar-db-backup.service,并调整定时器中的 OnCalendar

出了问题?

**"backend 'http' does not exist" 或 "backend 's3' does not exist"。**集成插件未安装。使用 plakar pkg build 和插件服务器的配方从源码编译,如上面 HTTP 或 S3 安装部分所示。运行 plakar pkg list 查看已安装的插件。

**同步到远程时 "connection refused"。**检查 VM2 上 plakar server 是否在运行:systemctl status plakar-server.service。检查 Caddy 是否在运行:systemctl status caddy。确认 DNS A 记录指向 VM2 的 IP。从 VM1 测试:

curl -I https://backup.example.com

此时出现 "connection refused" 错误意味着 Caddy 未运行、DNS 错误或 443 端口被防火墙阻止。

**Caddy 的 "TLS handshake error"。**Caddy 无法从 Let's Encrypt 获取证书。常见原因:DNS 尚未传播(等几分钟重试)、80 端口被阻止、或达到速率限制。检查 Caddy 日志:

journalctl -u caddy --since "10 minutes ago"

**同步时提示 "passphrase"。**某个存储的 passphrase_cmd 未配置或返回空字符串。检查两个密码短语文件:

cat /etc/plakar/passphrase
cat /etc/plakar/remote-passphrase

两个文件必须包含各自存储的正确密码短语。检查权限为 600,所有者为 root

**S3 同步时 "access denied"。**仔细检查访问密钥和秘密密钥。确认 IAM 策略授予存储桶的 s3:GetObjects3:PutObjects3:ListBuckets3:DeleteObject。某些提供商要求端点 URL 中包含存储桶区域。仔细检查 s3:// URL 格式。

**调度器立即退出。**没有 -foreground 标志,plakar scheduler start 会守护进程化,systemd 单元会认为它已退出。确保 ExecStart 行包含 -foreground

ExecStart=/usr/bin/plakar scheduler start -foreground -tasks /etc/plakar/scheduler.yaml

重新加载并重启:systemctl daemon-reload && systemctl restart plakar-scheduler.service

**首次同步耗时很长。**初始同步传输所有现有快照及其数据块。后续同步是增量的。如果有很多大快照,首次同步可能需要数小时。在 tmux 或 screen 会话中运行。

**远程端缺少快照。**比较快照列表:

plakar at @mybackups ls
plakar at @remote ls

如果数量不同,再次运行同步。同步是幂等的。

**重启后调度器未运行。**检查服务是否已启用:

systemctl is-enabled plakar-scheduler.service

输出应为 enabled。如果是 disabled,运行 systemctl enable plakar-scheduler.service

**同步定时器未触发。**检查定时器是否活跃:

systemctl is-active plakar-sync.timer

如果是 inactive,启用它:systemctl enable --now plakar-sync.timer。检查 systemctl list-timers 查看下次计划运行时间。

对于 Docker 工作负载,考虑将 在VPS上备份和恢复Docker卷 与此设置结合使用,在 plakar 快照之前备份 Docker 卷。


版权所有 2026 Virtua.Cloud。保留所有权利。 本内容为 Virtua.Cloud 团队原创作品。 未经书面许可,禁止复制、转载或再分发。

准备好亲自尝试了吗?

几秒内部署您自己的服务器。支持 Linux、Windows 或 FreeBSD。

查看 VPS 方案