前言

前段时间迁移了自己的服务器到新的云服务厂商-林枫云,服务器的价格很香,但是没有云备份功能,要是数据丢失就完蛋了,想到自己有台绿联云NAS,何不用来备份呢。

开始

首先,梳理一下实现思路:

1、我的服务器是由1Panel进行管理的,并且1Panel是支持备份与恢复的,加上1Panel的计划任务,我可以定时备份服务器数据(备份数据其实就是个压缩包)

2、想要备份服务器上的这个压缩包,我只需要做到远程下载就行,一样的,做个定时任务,从服务器下载这个压缩包就行

总结之后,其实写一个从服务器下载文件的Shell脚本,然后定时执行这个脚本就能完成。

之前在绿联NAS安装1Panel,强化你的NAS!已经安装了1Panel,所以定时执行的功能,直接交给1Panel的计划任务就行了,现在我们要做的就是写这个Shell脚本。

配置公钥

由于我们的脚本需要登录远程服务器,我们不希望每次执行脚本的时候都输入密码,要做到无密码登录,可以配置下公钥。

  1. 使用以下任意方式进入1Panel容器终端

    • 到绿联NAS桌面,打开Docker,进入容器->1panel->终端
    • 在1Panel网页端,容器->容器->1panel->终端,命令使用/bin/bash
  2. 生成新的 SSH 密钥对,文件名可以自定义,这里使用id_rsa_ugnas

    1
    ssh-keygen -t rsa -b 4096 -C "你的邮箱@example.com" -f ~/.ssh/id_rsa_ugnas

    出现提示直接回车就行

  3. 使用 ssh-copy-id 自动部署公钥

    1
    ssh-copy-id -i ~/.ssh/id_rsa_ugnas.pub -p 22 root@你的服务器IP
    • -p: 你的SSH端口,默认是22

    输入内容

    • 会提示是否连接,输入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
# 安装rsync
sudo apt install rsync -y
# 验证rsync是否安装成功
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% 22.75MB/s 0:00:00 12.68G 100% 22.61MB/s 0:08:54 (xfr#1, to-chk=0/2)
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]