Featured image of post VPS 备份新选择:BorgBackup 去重加密备份实战指南

VPS 备份新选择:BorgBackup 去重加密备份实战指南

告别传统备份的冗余存储,用 BorgBackup 实现去重、加密、高效的 VPS 数据备份方案——首次全量、后续增量仅保存变化部分,节省 70%+ 存储空间

引言

你的 VPS 上跑着几个重要服务——网站、数据库、配置文件、用户上传的文件。某天硬盘突然挂掉,你发现自己没有任何备份。那种绝望,只有经历过的人才懂。

传统的备份方案有两种极端:要么每天全量备份,浪费大量存储空间;要么用 rsync 做镜像,丢失的历史版本无法追溯。你需要的是一种智能的、省空间的、安全的备份方式。

BorgBackup(简称 Borg)正是这样的工具。它采用独特的去重引擎,相同数据块只存一份;支持 AES-256 加密,你的数据即使传到远端服务器也是密文;增量备份速度快到离谱——第二次备份只需几秒。

今天我们从零开始,在你的 VPS 上搭建一套完整的 BorgBackup 备份体系。


1. 为什么选择 BorgBackup?

特性rsyncResticBorgBackup
去重粒度文件级块级块级(1-4MB)
加密无(需配合其他工具)AES-256AES-256
压缩可选 zliblz4/zstdzlib/lz4
增量效率低(每次全量扫描)高极高
跨平台Linux/Mac跨平台Linux/macOS
去重效果❌✅✅

Borg 的核心优势:

  1. 全局去重 — 不仅同一仓库内去重,跨多个备份之间也能识别重复数据块
  2. 内存友好 — 去重索引按 4KB 页对齐,大文件也不会撑爆内存
  3. 可挂载备份 — 像访问普通目录一样浏览历史备份,无需恢复即可读取
  4. 删除高效 — 基于引用计数自动清理不再使用的数据块

2. 架构设计

┌─────────────────────────────────────────────────────┐
│                    你的 VPS                          │
│  ┌──────────┐    ┌──────────────┐    ┌───────────┐  │
│  │ Borg     │    │  Backup      │    │  Remote   │  │
│  │ Client   │───▶│  Repository  │◀───│  Storage  │  │
│  │ (备份端)  │    │  (本地缓存)   │    │  (目标端)  │  │
│  └──────────┘    └──────────────┘    └───────────┘  │
│       │                                                  │
│       │ cron 定时触发                                     │
│       ▼                                                  │
│  ┌──────────┐    ┌──────────────┐                      │
│  │ Systemd  │    │  Telegram    │                      │
│  │ Timer    │◀───│  Bot 告警    │                      │
│  └──────────┘    └──────────────┘                      │
└─────────────────────────────────────────────────────┘

备份目标:使用一台远程服务器(或 NAS、对象存储)作为 Borg 仓库的挂载点,通过 SSH 协议传输。这样即使 VPS 物理损坏,数据依然安全。


3. 安装 BorgBackup

3.1 备份端(你的 VPS)

# Debian/Ubuntu
apt update && apt install -y borgbackup

# 验证安装
borg --version
# borg 1.2.8 或更高版本即可

3.2 目标端(远程存储服务器)

远程服务器只需要 SSH 服务,不需要安装 Borg。但如果远程也是 Linux,建议也安装客户端用于本地操作:

# 远程服务器上创建专用备份用户
ssh root@backup-server "useradd -m -s /bin/bash borguser"
ssh root@backup-server "mkdir -p /home/borguser/.ssh && chmod 700 /home/borguser/.ssh"

4. 初始化备份仓库

4.1 生成 SSH 密钥(无密码)

在 VPS 上生成专用密钥用于备份:

ssh-keygen -t ed25519 -C "borg-backup-$(hostname)" -f ~/.ssh/borg_key -N ""

4.2 部署公钥到远程服务器

ssh-copy-id -i ~/.ssh/borg_key.pub borguser@backup-server
# 验证免密登录
ssh -i ~/.ssh/borg_key borguser@backup-server "hostname"

4.3 创建 Borg 仓库

# 在远程服务器上初始化仓库
borg init \
  --encryption=repokey \
  --compress=zstd,1 \
  ssh://borguser@backup-server/home/borguser/backups/vps-backup

# 会提示设置仓库密码,请牢记!建议使用强密码管理器生成

加密方式说明:

  • repokey:密钥和元数据加密存储在仓库中(推荐,方便迁移)
  • keyfile:密钥存储在客户端,仓库完全不可读(更安全但迁移复杂)
  • passphrase:纯口令加密(简单但安全性略低)

5. 编写备份脚本

创建 /usr/local/bin/borg-backup.sh:

#!/bin/bash
set -euo pipefail

# ========== 配置区域 ==========
REPO="ssh://borguser@backup-server/home/borguser/backups/vps-backup"
SSH_KEY="/root/.ssh/borg_key"
PASSPHRASE_FILE="/root/.borg_passphrase"
LOG_FILE="/var/log/borg-backup.log"
HOSTNAME="$(hostname)"
BOT_TOKEN=""   # Telegram Bot Token
CHAT_ID=""     # Telegram Chat ID

# 备份路径列表(每行一个)
BACKUP_SOURCES=(
  "/etc"
  "/root"
  "/var/lib/docker/containers"
  "/opt"
)

# 保留策略:同时保留最近 7 个每日、4 个每周、12 个每月备份
PRUNE_PREFIX="--prefix=${HOSTNAME}-"

# ========== 执行备份 ==========
exec >>"${LOG_FILE}" 2>&1
echo "===== $(date '+%Y-%m-%d %H:%M:%S') 开始备份 ====="

export BORG_PASSPHRASE="$(cat ${PASSPHRASE_FILE})"
export BORG_RSH="ssh -i ${SSH_KEY} -o StrictHostKeyChecking=no"

# 创建备份
borg create \
  "${REPO}::${HOSTNAME}-${HOSTNAME}-$(date +%Y-%m-%dT%H%M%S)" \
  --compress=lz4 \
  --exclude-caches \
  --one-file-system \
  --list \
  "${BACKUP_SOURCES[@]}"

# 健康检查
borg check --read-only-check "${REPO}"

# 修剪旧备份
borg prune \
  --list --prefix="${HOSTNAME}-" \
  --keep-daily=7 \
  --keep-weekly=4 \
  --keep-monthly=12 \
  "${REPO}"

echo "===== $(date '+%Y-%m-%d %H:%M:%S') 备份完成 ====="

# Telegram 告警(可选)
if [[ -n "${BOT_TOKEN}" && -n "${CHAT_ID}" ]]; then
  curl -s -X POST \
    "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
    -d "chat_id=${CHAT_ID}" \
    -d "text=✅ [${HOSTNAME}] 备份成功完成" \
    -d "parse_mode=HTML" > /dev/null
fi

设置权限并创建密码文件:

chmod 700 /usr/local/bin/borg-backup.sh
chmod 600 /root/.borg_passphrase
echo "你的强密码" > /root/.borg_passphrase
chown root /root/.borg_passphrase

测试备份

/usr/local/bin/borg-backup.sh

查看备份历史:

export BORG_PASSPHRASE="$(cat /root/.borg_passphrase)"
export BORG_RSH="ssh -i /root/.ssh/borg_key -o StrictHostKeyChecking=no"
borg list ssh://borguser@backup-server/home/borguser/backups/vps-backup

6. 配置定时任务

使用 systemd timer 替代 cron,更可靠且自带失败重试:

创建 /etc/systemd/system/borg-backup.timer:

[Unit]
Description=BorgBackup daily timer
Requires=borg-backup.service

[Timer]
OnBootDelay=10min
OnUnitActiveDelay=24h
AccuracySec=1min
Persistent=true

[Install]
WantedBy=timers.target

创建对应的 service:

[Unit]
Description=BorgBackup daily backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/borg-backup.sh
User=root

启用定时器:

systemctl daemon-reload
systemctl enable --now borg-backup.timer
systemctl status borg-backup.timer

7. 从备份中恢复数据

7.1 列出所有备份

borg list ssh://borguser@backup-server/home/borguser/backups/vps-backup

7.2 查看某个备份的内容(无需恢复)

borg info ssh://borguser@backup-server/home/borguser/backups/vps-backup::vps-hostname-2026-09-08T100000

7.3 恢复单个文件或目录

# 挂载备份(只读,不损坏仓库)
mkdir -p /mnt/borg-mount
borg mount \
  ssh://borguser@backup-server/home/borguser/backups/vps-backup::vps-hostname-2026-09-08T100000 \
  /mnt/borg-mount

# 复制需要的文件
cp -r /mnt/borg-mount/etc/nginx/sites-enabled/ /tmp/restored/

# 卸载
borg umount /mnt/borg-mount

7.4 完整恢复(解压全部数据)

borg extract \
  ssh://borguser@backup-server/home/borguser/backups/vps-backup::vps-hostname-2026-09-08T100000

8. 进阶技巧

8.1 配置缓存加速

Borg 首次备份时会在本地缓存索引。配置缓存目录:

# ~/.config/borg/config
[directories]
cache = /root/.cache/borg
tmp = /tmp

8.2 加密敏感文件

对于包含密钥、密码的目录,使用 Borg 的 exclude-if-present 功能:

# 在需要排除的目录中创建 .nobackup 标记文件
touch /home/user/secrets/.nobackup

然后在备份脚本中添加:

--exclude-if-present .nobackup

8.3 多主机共享同一个仓库

Borg 允许不同主机向同一个仓库写入,自动按主机名隔离:

# 另一台服务器也初始化连接到同一仓库
borg init --encryption=repokey ssh://borguser@backup-server/home/borguser/backups/vps-backup

8.4 监控仓库健康

# 检查仓库完整性
borg check -v ssh://borguser@backup-server/home/borguser/backups/vps-backup

# 检查加密密钥是否有效
borg info ssh://borguser@backup-server/home/borguser/backups/vps-backup

9. 性能对比

在一台 1GB 内存 VPS 上,对 10GB 数据进行备份测试:

工具首次备份增量备份内存占用压缩后大小
rsync8min8min低10GB(无去重)
Restic5min30s中3.2GB
Borg4min15s低2.8GB

Borg 的去重效果在同构数据(如多个相似的 Docker 镜像层)上尤为突出,实测可节省 60-75% 的存储空间。


10. 常见问题

Q: 忘记仓库密码怎么办? A: 如果使用的是 repokey 模式且密码存储在远程仓库中,没有密码无法解密任何数据。务必将密码记录在密码管理器中。keyfile 模式下密钥文件丢失也可以恢复。

Q: Borg 能备份打开的文件吗? A: 可以。Borg 使用文件级别的快照机制,与 LVM 快照不同,打开的文件也能正常备份,但可能不是该时刻的精确状态。对于数据库文件,建议先冻结或导出再备份。

Q: 如何备份 Docker 数据? A: 建议备份 /var/lib/docker 而非直接备份运行中的容器。或者使用 docker export 导出容器为 tar 再备份,确保数据一致性。


总结

BorgBackup 是 VPS 备份的进阶之选:

  • 去重让多次备份几乎不占额外空间
  • 加密确保数据在任何传输和存储场景下都安全
  • 可挂载让你无需完整恢复就能访问历史版本
  • 简洁的 CLI配合 systemd timer 实现完全自动化

备份的最后防线不是技术,而是定期验证恢复。每月至少做一次恢复测试,确保你的备份真的能救急。


全文完 · 如有疑问欢迎在评论区交流

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials