利用 Rclone 对服务器备份

2023-09-17

非常简略地记录下利用 Rclone 备份服务器的过程。

由于我基本上都是 docker 应用,volume 又设置在同一个文件夹的子文件里,所以只需要备份这一个文件夹即可。如果需要备份多个文件夹,可以略微改动 bak.sh 即可。

原理

将要备份的文件打包为 .tar.gz 存入本地的一个备份文件夹中,再将这个文件夹备份到 Google Drive 或其他 rclone 支持的地方。默认保留三个备份。

安装与远程配置

官网:https://rclone.org/

安装官网指引安装并配置好需要使用的服务,比如 Google Drive。

同时了解自己的配置文件的地址:一般在配置是使用的账户的 home 文件夹的 .config/rclone/rclone.conf

编写备份脚本

先创建本地的目标文件夹。将以下 bash 脚本复制到合适的地方,命名为 bak.sh,修改 source_dir 等选项。

#!/bin/bash

# 要备份文件夹路径
source_dir="/home/yunfi/docker/"
# 备份的文件在本地存储的位置
target_dir="/home/yunfi/baks/usrdocker/"
# 备份的文件在远程的存储位置
remote_dir="gd:/bak/nc/docker"
# Rclone 配置文件位置
config_path="/home/yunfi/.config/rclone/rclone.conf"
# 最多保留的备份数
max_files=3

# 以下内容无须修改

# 获取当前时间作为文件名后缀
prefix="nc-yunfi-docker-"
suffix=$(date +%Y%m%d%H%M%S)
target_file="${target_dir}${prefix}${suffix}.tar.gz"

# 打印开始信息
echo "------ START ${suffix} ------"

# 执行打包操作
tar -czPf "$target_file" "$source_dir"
# chown -R -v yunfi:yunfi "$target_file"

echo "已成功创建打包文件:$target_file"

# 查找目标文件夹中所有以 prefix 开头,'.tar.gz'结尾的文件
files_count=$(find $target_dir -maxdepth 1 -type f -name "${prefix}*.tar.gz" | wc -l)

# 判断文件数量是否超过设定的最大文件数
if [ $files_count -gt $max_files ]; then
  # 获取目标文件夹中所有符合条件的文件,并按修改时间排序
  files_to_delete=$(find $target_dir -maxdepth 1 -type f -name "${prefix}*.tar.gz" | sort)

  # 删除旧文件(保留最新的max_files个文件)
  delete_count=$(expr $files_count - $max_files)
  echo "❌发现 $files_count 个文件,需要删除 $delete_count 个旧文件"
  echo "$files_to_delete" | head -n $delete_count | xargs rm -v
fi

# Rclone 同步文件
echo "🔄开始同步至 Google Drive"
rclone sync $target_dir $remote_dir --config $config_path --drive-chunk-size 64M  --delete-after -v
echo "🔄同步结束"

# 打印结束信息
echo -e "------ END ${suffix} ------\n"

加上运行权限 chmod +x bak.sh

可以手动跑一下这个脚本(用 sudo),验证下效果。

设置 CRON

sudo crontab -e

由于部分由 Docker 生成的文件是 root:root 的用户权限,所以最好以 root 权限跑这个脚本。

添加一行,脚本位置和日志位置改成你自己的

0 4 * * 0,2,5 /home/yunfi/baks/bak.sh >> /home/yunfi/baks/bak.log 2>&1

每周二、周五、周日的凌晨 4 点进行备份。如果服务器时区不是东八区,可以改成对应的不太繁忙的时间。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3