一、环境
- 硬件:
- CPU E3-1245 V2;
- 内存 16G;
- 硬盘:
- 128G SSD 系统盘
- 1TB SSD 虚拟机磁盘
- 8TB备份盘
- Raid5 Nas数据盘
- 系统部署:
- 主机PVE系统
- 虚拟机-Ubuntu:数据盘直通,挂在到
/backup目录 - 虚拟机-飞牛/Nas:挂在Nas数据盘。
- 云盘:阿里网盘
二、备份逻辑
- 3 份数据:Nas中一份、Ubuntu备份服中一份,阿里网盘中一份
- 2 种不同介质:本地服务器、阿里网盘
- 1 份一异地备份:阿里网盘
- 本地冗余:Nas中Raid5硬盘做本地冗余。
- 本地备份:虽然主机只有一台,但是二个独立的虚拟机加独立的硬盘直通,二台电脑互不干扰且硬盘独立,相当于本地外部备份了。
三、备份步骤
- 在Nas中安装BorgBackup将Nas中的数据通过ssh备份快照到Ubuntu备份服中
- Ubuntu中安装Openlist挂载阿里网盘,并提供Webdav共享。
- Ubuntu中安装rclone将Nas中使用borg备份来的快照通过Webdav同步到阿里网盘
四、实现步骤
1. 部署BorgBackup
BorgBackup 原生支持通过 SSH 直接备份到远程服务器上的目录,为了防止Nas服务器被黑客入侵后直接删除或修改Ubuntu备份服上的快照,我们需要将给Nas borg使用的SSH用户权限做一些限制,只能使用borg 部分操作,禁止borg外的所有ssh命令,这样才能使得备份服务器不受Nas服务器破坏。
| 操作 | 是否允许 |
|---|---|
borg create |
✅ 允许(追加新快照) |
borg list |
✅ 允许 |
borg extract |
✅ 允许 |
borg delete |
❌ 拒绝 |
borg prune |
❌ 拒绝 |
| 修改仓库配置 | ❌ 拒绝 |
在Ubuntu服务器中设置
- 修改
/etc/ssh/sshd_conf,禁用密码登录。
# 取消注释并将值改为 no
PasswordAuthentication no
- 安装borg
sudo apt install borgbackup -y
- 创建borgbackup用户,给Nas borg使用
sudo adduser --system --disabled-password --home /home/borgbackup --gecos "" borgbackup
- 创建仓库目录,
/backups为直通硬盘挂在目录
sudo mkdir -p /backups/borg
sudo chown borgbackup:borgbackup /backups/borg
- 设置主目录权限
sudo chown root:root /home/borgbackup
sudo chmod 755 /home/borgbackup
- 配置 SSH 密钥
sudo mkdir -p /home/borgbackup/.ssh
- 获取原始公钥,设置到
PUBKEY环境变量中来。
如果已有公钥直接将整个文件内容复制进来 如果没有可以在Nas服务器用ssh-keygen -t ed25519 -C "borg-backup-key"创建,并将id_ed25519.pub文件内容全复制过来。
PUBKEY="ssh-ed25519 AAAA..."
- 重建 authorized_keys(使用标准空格)
echo "restrict,command=\"/usr/bin/borg serve --restrict-to-path=/backups/borg --append-only\",no-pty ${PUBKEY}" | sudo tee /home/borgbackup/.ssh/authorized_keys
- 修复 .ssh 权限
sudo chown borgbackup:borgbackup /home/borgbackup/.ssh
sudo chmod 700 /home/borgbackup/.ssh
sudo chown borgbackup:borgbackup /home/borgbackup/.ssh/authorized_keys
sudo chmod 600 /home/borgbackup/.ssh/authorized_keys
- 确认 borg 可执行
sudo -u borgbackup /usr/bin/borg --version
# 应该输出类似于这样的版本号, borg 1.2.8
在Nas中设置
- 安装borg
# Debian / Ubuntu / Linux Mint 中
sudo apt update
sudo apt install borgbackup
# RHEL 8/9, CentOS Stream, Rocky, Alma
sudo dnf install epel-release -y
sudo dnf install borgbackup
- 配置SSH免密登录,编辑
~/.ssh/config,
Host borg-server # ssh连接服务器名(自定义,后面连接直接用这个)
HostName 192.168.1.100 # Ubuntu服务器IP
User borgbackup # 用户名
IdentityFile ~/.ssh/id_ed25519 # 密钥文件所在路径
IdentitiesOnly yes
- 测试,命令挂起(
borg serve在等待数据),按回车或Ctrl+C退出,说明SSH免密配置成功。
ssh -T borg-server
- 初始化远程仓库
# 设置强密码(建议存入文件)
echo "YourSuperStrongBorgPass123!" | sudo tee /etc/borg-pass.txt
sudo chmod 600 /etc/borg-pass.txt
# 初始化仓库(AES-256 加密)
export BORG_PASSPHRASE=$(cat /etc/borg-pass.txt)
borg init --encryption=repokey-blake2 ssh://borg-server/backups/borg/repo
unset BORG_PASSPHRASE
- 自动同步仓库
#!/bin/bash
# borg_backup.sh - Borg 增量备份脚本
set -euo pipefail
REPO="ssh://borg-server:/backups/borg/repo"
SOURCE_DIRS=(
"/vol1/1000/Photos"
"/vol1/1000/Video"
# 添加更多目录...(以换行分割)
)
PASS_FILE="/etc/borg-pass.txt"
export BORG_PASSPHRASE=$(cat "$PASS_FILE")
# 创建快照名(含日期和主机名)
SNAPSHOT="backup-$(hostname)-$(date +%Y-%m-%d-%H%M)"
echo "[$(date)] 开始备份到 $REPO :: $SNAPSHOT"
# 执行备份(自动去重+压缩)
borg create \
--verbose \
--filter AME \
--list \
--stats \
--compression zstd,6 \
--exclude-caches \
--exclude '*/.cache/*' \ # 排除目录
--exclude '*.tmp' \ # 排除文件
"$REPO::$SNAPSHOT" \
"${SOURCE_DIRS[@]}"
unset BORG_PASSPHRASE
echo "[$(date)] 备份完成"
- 自动化(cron)
# 每天凌晨 3点 备份
echo "0 3 * * * root /home/backups/borg_backup.sh >> /var/log/borg-backup.log 2>&1" | sudo tee /etc/cron.d/borg-backup
BorgBackup部署完成
到此,borg部署完成了,每天3天会从Nas快照备份到Ubuntu服务器的 /backups/borg目录中了。由于Ubuntu账号设置了--append-only参数,不能执行borg prune清理,我们可以固定时间手动清理。
- 清理方式1:在Ubuntu服务器中,使用相同的密码直接用
borg prune清理对应仓库 - 清理方式2:临时修改
authorized_keys文件,删除--append-only参数,再Nas中使用borg prune清理完后再添加回去。
2. 部署rclone + openlist
部署openlist
这个网上教程太多了,就不多复述了,假设openlist已经挂载了阿里网盘。
- webdav:http://192.168.1.100/dav
- 账号:backup
- 密码:123456
- 备份目录:/Backups
部署rclone
- 安装rclone
# Debian/Ubuntu
sudo apt install rclone
# 或使用官方脚本(推荐,版本更新)
curl https://rclone.org/install.sh | sudo bash
- 生成加密密码
rclone obscure "123456"
# 输出加密字符串,填入 下面的pass=
- 配置
~/.config/rclone/rclone.conf
[openlist]
type = webdav
url = http://192.168.1.100/dav
vendor = other
user = admin
pass = rclone obscure生成的密码字符串
- 测试
rclone lsd openlist:
# 注意后面的`:`,连接成功应该输入根目录内在文件(夹),如 `Backups/`
- 同步到Openlist中
rclone sync backups/borg/repo openlist:Backups\
--checksum \
--verbose \
--transfers=2
- 自动化(cron)
# 每天凌晨 4点 备份
echo "0 4 * * * root /home/backups/rclone_backup.sh >> /var/log/rclone-backup.log 2>&1" | sudo tee /etc/cron.d/rclone-backup
评论区