收起左侧

分享一个文件备份方案

9
回复
727
查看
[ 复制链接 ]

1

主题

15

回帖

0

牛值

江湖小虾

2025-3-27 18:18:14 显示全部楼层 阅读模式

[i=s] 本帖最后由 朝闻道🇨? 于 2025-4-2 23:37 编辑 [/i]<br /> <br />

<p>我的需求</p> <p>1、docker的config和data等待一系列的文件(已将正在运行的docke已全部转为compose文件,万一系统崩溃了,可以继续无损使用)</p> <p>2、照片</p> <p>3、其他</p> <p>之前直接使用备份软件上传到网盘,虽说整体文件不大,但是文件小,还特别多,尤其是docker的内容,都是10几万个文件数量,上传一天都传不完,还容易引起网盘的风控,而且还有安全泄漏隐患。</p> <p>这两天突发其想,直接使用脚本打包,然后把压缩包上传到云盘不就完事了。</p> <p>一、压缩包在本地使用7z加密打包,所以先在环境变量中定义一个密码,避免直接在脚本中使用明文,直接使用明文可以跳过。</p> <p>1、编辑环境变量</p> <pre><code>#编辑环境变量 nano ~/.bashrc

添加一行zip密码,密码内容自行输入,注意密码中不要出现&字符。

export ZIP_PASSWORD="密码"

</code></pre> <p>ctrl+s保存,ctrl+x退出</p> <p>2、使环境变量生效</p> <pre><code>source ~/.bashrc </code></pre> <p>二、编写脚本</p> <p>1、安装p7zip</p> <pre><code>sudo apt-get install p7zip-full </code></pre> <p>解压加密的zip文件</p> <pre><code>7z x -p"你的密码" /path/to/加密文件.zip </code></pre> <p>如果源文件包含中文/特殊字符,解压时可能乱码,需指定编码(仅限命令行):</p> <pre><code>7z x -p密码 -mcp=936 加密文件.zip # Windows GBK 编码 7z x -p密码 -mcp=UTF-8 加密文件.zip # Linux/macOS </code></pre> <p>2、脚本内容</p> <p>路径的文件名自行修改</p> <pre><code>nano /vol1/1000/脚本/定时ZIP任务/zip.sh </code></pre> <pre><code># 定义源文件夹和备份目录 SOURCE_DIR="路径" #需要备份的文件夹 BACKUP_DIR="路径" #保存备份的文件夹

设置 ZIP 加密密码(明文存储,谨慎使用!)

ZIP_PASSWORD="${ZIP_PASSWORD}" #如果不使用环境变量,可以把${ZIP_PASSWORD}直接改为明文密码

创建带时间戳的 ZIP 文件名

TIMESTAMP=$(date +"%Y%m%d_%H%M%S") ZIPNAME="脚本${TIMESTAMP}.zip" #保存的文件名,可以修改“脚本_”以区分其他的备份

压缩文件夹并设置密码(AES-256 加密)

7z a -tzip -p"${ZIP_PASSWORD}" -mem=AES256 "${BACKUP_DIR}/${ZIP_NAME}" "${SOURCE_DIR}"

删除旧备份,仅保留最近 3 个。

cd "${BACKUP_DIR}" || exit ls -t .zip | tail -n +4 | xargs rm -f </code></pre> <pre><code>chmod +x zip.sh #授权 </code></pre> <p>脚本就已经写好了,下面我们需要定时运行脚本。压缩包会保留最近三个,多的会删除。</p> <pre><code>crontab -e </code></pre> <p>这是我自己的内容,请自行更改为自己的时间和路径。可以把时间隔开,错位运行。</p> <pre><code>#定时表达式:分钟 小时 日期 月份 星期几( 0 3 * 1 每周一凌晨 3 点执行)

docker每周一凌晨4点同步,所以3点30分压缩

30 3 1 /vol1/1000/other/脚本/定时ZIP任务/docker.sh

strm流媒体每周一凌晨5点同步,所以4点30分压缩

30 4 1 /vol1/1000/other/脚本/定时ZIP任务/strm.sh

照片每周一凌晨2点同步,所以1点30分压缩

30 1 1 /vol1/1000/other/脚本/定时ZIP任务/camera.sh 30 1 1 /vol1/1000/other/脚本/定时ZIP任务/脚本备份.sh </code></pre> <p>三、使用自带的备份软件</p> <p>新建一个任务,制定好规则就可以了。</p> <p>备份规则那里,把来源地删除文件时,保留目的地对应的文件。这个勾取消掉,当然如果你需要所有的备份文件也可以勾上。</p> <p>这样不仅传输速度快,而且占用空间小。我的DOCKER配置文件有5个G,压缩完才1.7个G。</p> <p>网盘使用的ALIST+RCLONE挂载到本地。</p> <p>天翼云老用户以前注册的有10T,不限速,实测可以跑满带宽。</p>

收藏
送赞 1
分享

4

主题

19

回帖

0

牛值

江湖小虾

2025-3-28 15:36:21 显示全部楼层
多谢,刚需

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-3 16:09:20 楼主 显示全部楼层

[i=s] 本帖最后由 朝闻道🇨? 于 2025-4-3 19:27 编辑 [/i]<br /> <br />

<pre><code>#!/bin/bash

定义源文件夹和备份目录

SOURCE_DIR="路径" BACKUP_DIR="路径"

设置 ZIP 加密密码(明文存储,谨慎使用!)

ZIP_PASSWORD="${ZIP_PASSWORD}" # 请在此处直接写入密码,现在使用的是系统变量定义

分卷大小设置(2000m = 2GB)

VOLUME_SIZE="2000m"

创建带时间戳的文件夹名称(格式:要替换的名称_YYYYMMDD_HHMMSS)

TIMESTAMP=$(date +"%Y%m%d_%H%M%S") FOLDERNAME="要替换的名称${TIMESTAMP}" ZIP_NAME="要替换的名称.zip" # 固定压缩包名称

创建本次备份专用目录

mkdir -p "${BACKUP_DIR}/${FOLDER_NAME}" || exit 1

压缩文件夹并设置分卷及密码(AES-256 加密)

7z a -tzip -p"${ZIP_PASSWORD}" -mem=AES256 -v${VOLUME_SIZE} \ "${BACKUP_DIR}/${FOLDER_NAME}/${ZIP_NAME}" "${SOURCE_DIR}"

删除旧备份,保留最近 3 个备份目录(按文件名时间戳排序)

cd "${BACKUP_DIR}" || exit

获取所有符合命名规范的目录并按时间戳降序排列

backupdirs=$(ls -d 要替换的名称* 2>/dev/null | sort -r)

计数器初始化

count=0

遍历处理备份目录

while IFS= read -r dir; do ((count++)) if [ $count -gt 3 ]; then rm -rf "${dir}" fi done <<< "${要替换的名称_dirs}" </code></pre>

怎么发出来成这样了。自己复制一下吧,注意那些加粗的全是注释。  详情 回复
2025-4-3 16:15

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-3 16:15:08 楼主 显示全部楼层
本帖最后由 朝闻道🇨? 于 2025-4-3 19:28 编辑

朝闻道🇨? 发表于 2025-4-3 16:09
[md]更新了一下,因为遇到压缩包文件太大的问题。
现在把压缩文件拆分为2G一个。
请仔细阅读注释,因为要更 ...

更新了一下,因为遇到压缩包文件太大的问题。
现在把压缩文件拆分为2G一个。
请仔细阅读注释,因为要更改几处名字。

1

主题

10

回帖

0

牛值

江湖小虾

2025-4-3 16:28:39 显示全部楼层
压缩上传,就无法实现增量备份了吧
有增量的方案 先做一个全量备份,后续的文件根据时间戳做快照,只保存更改后的文件,但是后续恢复起来很麻烦。 群晖的SYNC和飞牛的同步都用过,文件太多24小时都在上传,就直接放弃了。 另外还害怕引起网盘风控,现  详情 回复
2025-4-3 18:27

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-3 18:27:23 楼主 显示全部楼层
本帖最后由 朝闻道🇨? 于 2025-4-3 18:30 编辑
suny9527 发表于 2025-4-3 16:28
压缩上传,就无法实现增量备份了吧

有增量的方案
先做一个全量备份,后续的文件根据时间戳做快照,只保存更改后的文件,但是后续恢复起来很麻烦。
群晖的SYNC和飞牛的同步都用过,文件太多24小时都在上传,就直接放弃了。
另外还害怕引起网盘风控,现在风控规则太严了。
现在这个方案在我使用的情况来看,能解决目前的需求就行了。
其实可以试着把备份文件夹直接改成挂载的网盘路径,节省本地空间,但是我没试过。本地空间紧张的可以试试。

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-3 19:17:31 楼主 显示全部楼层

[i=s] 本帖最后由 朝闻道🇨? 于 2025-4-3 19:20 编辑 [/i]<br /> <br />

<pre><code>#!/bin/bash

基础配置

SOURCE_DIR=“路径” #需要备份的文件夹 BACKUP_DIR=“路径” #备份至的文件夹 ZIP_PASSWORD="${ZIP_PASSWORD}" VOLUME_SIZE="2000m"

钉钉机器人配置

DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send" ACCESS_TOKEN=“token” SECRET=“密钥” # 机器人加签密钥

生成时间戳和签名

timestamp=$(date +%s%3N) sign=$(echo -ne "${timestamp}\n${SECRET}" | openssl dgst -hmac "${SECRET}" -sha256 -binary | base64) sign=$(echo "${sign}" | tr -d '\n')

生成通知URL

webhook_url="${DINGTALK_WEBHOOK}?access_token=${ACCESS_TOKEN}&timestamp=${timestamp}&sign=${sign}"

生成时间戳信息

TIMESTAMP=$(date +"%Y%m%d_%H%M%S") FOLDERNAME="要替换的名称${TIMESTAMP}" ZIP_NAME="要替换的名称.zip"

创建备份目录

mkdir -p "${BACKUP_DIR}/${FOLDER_NAME}" || exit 1

记录开始时间

START_TIME=$(date +"%Y-%m-%d %H:%M:%S")

执行压缩

7z a -tzip -p"${ZIP_PASSWORD}" -mem=AES256 -v${VOLUME_SIZE} \ "${BACKUP_DIR}/${FOLDER_NAME}/${ZIP_NAME}" "${SOURCE_DIR}"

计算压缩包大小

TOTAL_SIZE=$(du -sh "${BACKUP_DIR}/${FOLDER_NAME}" | awk '{print $1}')

获取待删除的旧备份目录

cd "${BACKUP_DIR}" || exit OLDBACKUPS=$(ls -d 要替换的名称* 2>/dev/null | sort -r | tail -n +4)

删除旧备份

DELETED_LIST="" for dir in ${OLD_BACKUPS}; do DELETED_LIST+="- ${dir}\n" rm -rf "${dir}" done

如果没有要删除的备份

[ -z "${OLD_BACKUPS}" ] && DELETED_LIST="无"

发送钉钉通知(使用新的webhook_url)

curl -s "${webhook_url}" \ -H 'Content-Type: application/json' \ -d "{ \"msgtype\": \"markdown\", \"markdown\": { \"title\": \"备份任务完成通知\", \"text\": \"任务名称:要替换的名称备份\n 备份时间:${START_TIME}\n 压缩包大小:${TOTAL_SIZE}\n 删除旧备份:\n ${DELETED_LIST}\n 存储路径:\n `${BACKUP_DIR}/${FOLDER_NAME}`\" } }" </code></pre>

仅在上一个版本增加钉钉推送服务 填基础配置和钉钉机器人配置; 把“要替换的名称”直接查找替换为自己的文件名即可。 没有钉钉推送需求的使用上个版本的就行。 没有把这些和代码一同发出,终于正常显示了  详情 回复
2025-4-3 19:21

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-3 19:21:37 楼主 显示全部楼层
朝闻道🇨? 发表于 2025-4-3 19:17
[md]#!/bin/bash

# 基础配置

仅在上一个版本增加钉钉推送服务
填基础配置和钉钉机器人配置;
把“要替换的名称”直接查找替换为自己的文件名即可。

没有钉钉推送需求的使用上个版本的就行。

没有把这些和代码一同发出,终于正常显示了

5

主题

48

回帖

0

牛值

初出茅庐

2025-4-21 09:41:22 显示全部楼层
感谢分享,后面再研究一下怎么弄

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-28 11:43:16 楼主 显示全部楼层

收到反馈,因为权限问题导致密码未成功传递,导致压缩的时候使用了空密码,但是解压的时候提示输入密码,请在终端中使用

7z x 文件名.zip -p""
即可解压

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则