shell脚本 - Linux定时备份并通过WebDAV上传至坚果云

为了保证数据的安全与完整, 对Linux上的重要数据和配置进行备份是很必要的, 备份文件最好在本地存一份, 上传到云服务一份. 我的服务器上的数据比较少, 打包压缩完大概是100M左右, 思来想去打算用WebDAV的方式传到坚果云. 坚果云存储空间不限量但是普通用户每月的上传流量限制是1G, 对我来说是绰绰有余了.

准备

  1. 坚果云账号, 在网页端右上角 账户信息 -> 安全选项 里添加一个应用, 记住生成的WebDAV密码, 账户, WebDAV服务器地址
  2. 根据 这篇文章(https://www.cnblogs.com/misterh/p/9830905.html) 安装cadaver, 并配置非交互式登录

代码

保存以下sh代码, 根据你的情况修改directories, db_user, db_password, db_names, backup_file等变量

#!/bin/bash

# 定义要备份的目录
directories=("/etc/nginx" "/opt" "/var/www")

# 定义数据库账户密码
db_user="user"
db_password="passwd"
# 定义要备份的数据库名称列表
db_names=("mydb")
DATE=$(date +%Y%m%d)
# 定义生成的备份文件名,以日期命名
backup_file="backup_${DATE}.tar.gz"

# 输出当前时间和开始信息
start_time=$(date +%s)
echo "======================Backup started at $(date)========================="

# 创建一个临时目录来存放SQL文件
temp_dir="temp_backup"
mkdir ${temp_dir}

# 导出每个数据库到SQL文件
for db_name in "${db_names[@]}"; do
    sql_file="${temp_dir}/${db_name}.sql"
    mysqldump -u ${db_user} -p${db_password} ${db_name} >${sql_file}
done

# 将目录和SQL文件添加到备份中
tar -czf ${backup_file} --transform 's,^,backup/,' "${directories[@]}" -C ${temp_dir} .

# 删除临时目录及其中的SQL文件
rm -rf ${temp_dir}

# 计算并输出耗时
end_time=$(date +%s)
elapsed_time=$((end_time - start_time))

# 获取备份文件的大小
backup_file_size=$(stat --format "%s" ${backup_file})

# 输出完成信息、备份文件大小和耗时
echo "Backup completed. File: ${backup_file}, Size:$(numfmt --to=iec-i --suffix=B ${backup_file_size})"

# WebDav上传, 路径中的serverBackup要求是坚果云上已创建好的文件夹, 也可以不填最后这个路径, 则是上传到根目录
echo "Uploading..."
cadaver https://dav.jianguoyun.com/dav/serverBackup << EOF
put ${backup_file}
quit
EOF
echo "Upload Done! "

echo "Elapsed time: ${elapsed_time} seconds"
echo "===================== Backup Done at $(date)================================="
通过bash backup.sh 测试一下, 如果没问题就可以进行下一步了

设定crontab定时任务

让脚本每周一凌晨3点定时运行并输出日志到指定文件

0 3 * * 1 /root/backup.sh >> /opt/log/backup.log
关于crontab更多写法请自行查找吧

扩展

如果你的备份文件比较大, 坚果云的免费流量无法满足你的要求, 可以考虑使用各云服务商的对象存储, 看了七牛, 阿里, 腾讯的都不是很贵, 也提供了shell上传的示例代码. 如果你的服务器在国外, 那么像Amazon, Cloudflare等国外云服务商的对象存储貌似更加便宜.