前言
前段时间迁移了自己的服务器到新的云服务厂商-林枫云,服务器的价格很香,但是没有云备份功能,要是数据丢失就完蛋了,想到自己有台绿联云NAS,何不用来备份呢。
开始
首先,梳理一下实现思路:
1、我的服务器是由1Panel进行管理的,并且1Panel是支持备份与恢复的,加上1Panel的计划任务,我可以定时备份服务器数据(备份数据其实就是个压缩包)
2、想要备份服务器上的这个压缩包,我只需要做到远程下载就行,一样的,做个定时任务,从服务器下载这个压缩包就行
总结之后,其实写一个从服务器下载文件的Shell脚本,然后定时执行这个脚本就能完成。
之前在绿联NAS安装1Panel,强化你的NAS!已经安装了1Panel,所以定时执行的功能,直接交给1Panel的计划任务就行了,现在我们要做的就是写这个Shell脚本。
配置公钥
由于我们的脚本需要登录远程服务器,我们不希望每次执行脚本的时候都输入密码,要做到无密码登录,可以配置下公钥。
使用以下任意方式进入1Panel容器终端
- 到绿联NAS桌面,打开
Docker
,进入容器
->1panel
->终端
。 - 在1Panel网页端,
容器
->容器
->1panel
->终端
,命令使用/bin/bash
。
生成新的 SSH 密钥对,文件名可以自定义,这里使用id_rsa_ugnas
1
| ssh-keygen -t rsa -b 4096 -C "你的邮箱@example.com" -f ~/.ssh/id_rsa_ugnas
|
出现提示直接回车就行
使用 ssh-copy-id 自动部署公钥
1
| ssh-copy-id -i ~/.ssh/id_rsa_ugnas.pub -p 22 root@你的服务器IP
|
输入内容:
- 会提示是否连接,输入
yes
- 提示输入密码,输入
root用户密码
提示Now try logging into the machine XXXXXXXXX
表示公钥部署成功了!
测试公钥:
1
| ssh -i ~/.ssh/id_rsa_ugnas -p 22 root@你的服务器IP
|
无需输入密码,成功进入服务器终端说明非常成功!键入exit
退出服务器终端,回到1Panel容器终端。
安装Rsync
rsync
是一个常用的文件同步工具,需要在1Panel容器中安装一下。
在1Panel网页端,容器
->容器
->1panel
->终端
,命令使用/bin/bash
,依次输入以下命令:
1 2 3 4 5 6
| sudo apt update
sudo apt install rsync -y
rsync --version
|
成功打印版本号表示安装成功!
服务端备份
我们需要在服务端生成备份文件,由于我的服务器是由1Panel管理的,1Panel有自带的本地备份,能将由1Panel创建的应用进行备份,压缩到一个tar.gz
包中。
到1Panel面板,进入计划任务
->创建计划任务
,录入以下内容:
- 任务类型:系统快照
- 任务名称:任意
- 执行周期:看需求,我定义的是每周5凌晨3:30
- 备份账号:服务器磁盘
- 默认下载地址:服务器磁盘
- 保留份数:1(建议就一份了,因为后面每次备份都会被下载到绿联NAS中,还能节省服务器磁盘空间)
每次执行任务后,默认会在/opt/1panel/backup/system_snapshot
目录下生成镜像文件tar.gz
。
Shell脚本
对DeepSeek狠狠的鞭策之后,得到了以下的Shell脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #!/bin/bash
# 配置部分 REMOTE_USER="root" # 远程系统用户名 REMOTE_HOST="192.168.1.1" # 远程系统IP或主机名 SSH_PORT="22" # 自定义SSH端口,修改为你的实际端口 LOCAL_BASE_DIR="/opt/backup/main-server" # 本地基础目录 SSH_KEY="/root/.ssh/id_rsa_ugnas" # SSH私钥路径,默认使用~/.ssh/id_rsa_ugnas
# 定义要下载的远程目录数组(可添加多个) REMOTE_PATHS=( # "/root" "/opt/1panel/backup/system_snapshot" )
# 检查rsync是否安装 if ! command -v rsync &> /dev/null; then echo "错误:rsync未安装,请先安装rsync" echo "Debian/Ubuntu: sudo apt install rsync" echo "CentOS/RHEL: sudo yum install rsync" exit 1 fi
# 检查SSH密钥是否存在 if [ ! -f "$SSH_KEY" ]; then echo "错误:SSH密钥 $SSH_KEY 不存在" echo "请先生成SSH密钥对:ssh-keygen -t rsa" echo "然后将公钥上传到远程服务器:ssh-copy-id -i $SSH_KEY.pub -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST" exit 1 fi
# 创建本地基础目录(如果不存在) mkdir -p "$LOCAL_BASE_DIR"
# 生成统一的时间戳(在循环外部) TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="$LOCAL_BASE_DIR/$TIMESTAMP"
# 日志文件 LOG_FILE="$BACKUP_DIR/download_$TIMESTAMP.log"
# 开始下载 echo "开始下载任务: $(date)" | tee -a "$LOG_FILE" echo "使用SSH端口: $SSH_PORT" | tee -a "$LOG_FILE" echo "使用SSH密钥: $SSH_KEY" | tee -a "$LOG_FILE" echo "备份目录: $BACKUP_DIR" | tee -a "$LOG_FILE"
# 创建备份目录 mkdir -p "$BACKUP_DIR"
for REMOTE_PATH in "${REMOTE_PATHS[@]}"; do # 从远程路径提取最后一级目录名 DIR_NAME=$(basename "$REMOTE_PATH") LOCAL_DIR="$BACKUP_DIR/$DIR_NAME" echo "正在下载: $REMOTE_PATH 到 $LOCAL_DIR" | tee -a "$LOG_FILE" # 创建目标目录 mkdir -p "$LOCAL_DIR" # 使用rsync下载,指定SSH端口和密钥 rsync -avz --progress --stats --human-readable \ -e "ssh -p $SSH_PORT -i $SSH_KEY -o StrictHostKeyChecking=no" \ "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/" \ "$LOCAL_DIR" 2>&1 | tee -a "$LOG_FILE" # 检查退出状态 if [ $? -eq 0 ]; then echo "[成功] 下载完成: $REMOTE_PATH" | tee -a "$LOG_FILE" else echo "[失败] 下载出错: $REMOTE_PATH" | tee -a "$LOG_FILE" fi echo "----------------------------------------" | tee -a "$LOG_FILE" done
echo "所有下载任务完成: $(date)" | tee -a "$LOG_FILE" echo "备份保存在: $BACKUP_DIR" | tee -a "$LOG_FILE"
|
**功能说明:**从远程服务器下载多个文件或者文件夹的内容到本地,每次下载都会用一个时间命名的文件夹包裹,文件夹内为下载的内容以及下载日志
参数说明:
- LOCAL_BASE_DIR:本地基础目录,就是NAS的目录,由于之间1Panel容器映射了
/opt
目录,所以,这里下载到/opt
了。 - REMOTE_PATHS:定义要下载的远程目录数组(可添加多个),多个直接换行编写就行了,支持文件/文件夹,1Panel的系统快照目录默认在
/opt/1panel/backup/system_snapshot
,当然如果还有没有被1Panel管理的内容,也可以在服务器新加一个计划任务,将需要备份的内容打包,然后使用这个脚本将打包内容一同下载下来。
**执行日志:**1Panel的计划任务是能保存日志的,默认保存7次,我的日志内容如下,成功将服务器系统快照保存到NAS中了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| :00:01 12.66G 99 2025/10/13 17:02:45 2025/10/13 17:02:45 Number of files: 2 (reg: 1, dir: 1) 2025/10/13 17:02:45 Number of created files: 1 (reg: 1) 2025/10/13 17:02:45 Number of deleted files: 0 2025/10/13 17:02:45 Number of regular files transferred: 1 2025/10/13 17:02:45 Total file size: 12.68G bytes 2025/10/13 17:02:45 Total transferred file size: 12.68G bytes 2025/10/13 17:02:45 Literal data: 12.68G bytes 2025/10/13 17:02:45 Matched data: 0 bytes 2025/10/13 17:02:45 File list size: 128 2025/10/13 17:02:45 File list generation time: 0.001 seconds 2025/10/13 17:02:45 File list transfer time: 0.000 seconds 2025/10/13 17:02:45 Total bytes sent: 46 2025/10/13 17:02:45 Total bytes received: 12.68G 2025/10/13 17:02:45 2025/10/13 17:02:45 sent 46 bytes received 12.68G bytes 23.63M bytes/sec 2025/10/13 17:02:45 total size is 12.68G speedup is 1.00 2025/10/13 17:02:45 [成功] 下载完成: /opt/1panel/backup/system_snapshot 2025/10/13 17:02:45 ---------------------------------------- 2025/10/13 17:02:45 所有下载任务完成: Mon Oct 13 17:02:45 CST 2025 2025/10/13 17:02:45 备份保存在: /opt/backup/main-server/20251013_165349 2025/10/13 17:02:45 执行脚本 备份主力服务器数据 成功 2025/10/13 17:02:45 [TASK-END]
|