因为数据在自己手上,所以数据备份还是得自己来做,这里讲一下使用 rclone 备份到阿里云 OSS 上。
(1) 创建一个 OSS bucket
参照网上教程创建一个 bucket(新建 buncket,填名称选地域其他默认即可),并创建一个子用户给 rclone 使用,记录 AccessKey ID 和 AccessKey Secret,待会要用。
其中要给 OSS 访问桶的权限:
(2) 安装并配置 rclone
你可以使用官网的一键安装脚本在 Linux 系统下安装 rclone
sudo -v ; curl https://rclone.org/install.sh | sudo bash
安装成功后:
- 在命令行键入
rclone config
开始配置 - 键入
n
表示新建一个配置 - 键入一个配置名称(这里示例用
example_name
) - 在弹出来的选项中找到并键入 Amazon S3 对应的序号(我这里为
5
) - 在弹出来的选项中找到并键入 Alibaba OSS 对应的序号(我这里为
2
) - 再键入
1
- 键入上一步创建的子用户的 AccessKey ID:
XXXXX
- 键入上一步创建的子用户的 AccessKey Secret:
XXXXXXXXXXXXXXXX
- 在 bucket 的概览页找到并键入 Endpoint(地域节点)(我这里是
oss-cn-chengdu.aliyuncs.com
) - 根据相应的权限情况选择,我这里选
1
,私有 - 选择存储类型,我这里选
2
,标准存储 - 键入
n
,不进行高级配置 - 检查配置,没问题键入
y
- 再键入
q
退出配置。
(3) 创建 Bash 脚本
对于 bash 脚本,你可以理解成命令行将逐行执行 bash 脚本。
下面是我使用的 Bash 备份脚本,你可以修改相应的路径和配置直接拿来使用。
#!/bin/bash
# cron: 每天凌晨六点执行一次
# 0 6 * * * /bin/bash /home/ecs-user/bash/memos_backup.bash
# 设置日志文件路径
LOG_FILE="/home/ecs-user/log/memos_backup.log"
# 停止 Docker 容器
echo "$(date +%Y-%m-%d\ %H:%M:%S):开始停止 memos 容器……" >> "$LOG_FILE"
cd /home/ecs-user/docker/memos
sudo docker compose down
# 设置备份路径和备份文件名
BACKUP_DIR="/home/ecs-user/docker/memos"
BACKUP_FILE_NAME="memos_backup_$(date +%Y%m%d%H%M%S).tar.gz"
BACKUP_FILE="/home/ecs-user/backup/memos/$BACKUP_FILE_NAME"
# 设置 rclone 的配置名称和 OSS 的 bucket 名称
RCLONE_CONFIG_NAME="xxxxxx"
OSS_BUCKET_NAME="xxxxxx"
BACKUP_DEST_FILE="$RCLONE_CONFIG_NAME:$OSS_BUCKET_NAME/$(date +%Y/%m)"
# 获取备份前目录大小
before_size=$(du -sh "$BACKUP_DIR" | cut -f1)
# 记录目录列表到日志文件(一行显示)
echo -n "当前 memos 下文件列表:" >> "$LOG_FILE"
ls -m "$BACKUP_DIR" >> "$LOG_FILE"
# 打包 Docker 数据
tar -zcvf "$BACKUP_FILE" "$BACKUP_DIR"
# 获取备份后压缩文件大小
after_size=$(du -sh "$BACKUP_FILE" | cut -f1)
# 使用 rclone 上传备份文件到阿里云 OSS
rclone copy "$BACKUP_FILE" "$BACKUP_DEST_FILE"
# 删除本地多余的备份文件,只保留最新的三份
cd /home/ecs-user/backup/memos
ls -t memos_backup_* | tail -n +4 | xargs rm -f
# 记录备份时间和路径到日志文件
echo "$(date +%Y-%m-%d\ %H:%M:%S):成功备份 memos 文件夹" >> "$LOG_FILE"
echo "备份文件:“$BACKUP_DEST_FILE/$BACKUP_FILE_NAME”,备份前目录大小:$before_size,备份后压缩文件大小:$after_size" >> "$LOG_FILE"
# 重新启动 Docker 容器
cd /home/ecs-user/docker/memos
sudo docker compose up -d
echo "$(date +%Y-%m-%d\ %H:%M:%S):重新启动 memos 容器" >> "$LOG_FILE"
echo "====================" >> "$LOG_FILE"
我的文件架构是这样的:
~
├── backup
│ └── memos
│ ├── memos_backup_20240123060002.tar.gz
│ ├── memos_backup_20240124060002.tar.gz
│ └── memos_backup_20240125060002.tar.gz
├── bash
│ └── memos_backup.bash
├── docker
│ └── memos
│ ├── docker-compose.yaml
│ ├── memos_prod.db
│ ├── memos_prod.db-shm
│ └── memos_prod.db-wal
└── log
└── memos_backup.log
(4) 使用 crontab 创建定期任务
光是创建了 bash 脚本是需要我们手动执行的,这时你可以测试一下:
chmod +x ~/bash/memos_backup.bash
~/bash/memos_backup.bash
我们可以使用 cron 创建一个定时任务来让云服务器定期运行备份脚本:
crontab -e
在弹出来的编辑器添加一行:
0 6 * * * /bin/bash /home/ecs-user/bash/memos_backup.bash
就大功告成了,等着明早起床查看日志吧。
此外,网上常说服务器数据备份要遵循 321 原则,仁者见仁智者见智吧,我自己也只是弄了两套备份,一套从服务器备份到 OSS,一套从 OSS 备份到电脑本地。
Windows 可以通过“计划任务程序”配合 .bat
批处理文件实现定时任务。