
ety001
# 背景
目前懒猫微服的备份是不支持选择特定的应用备份,而我当前只需要备份的应用数据只有 `vaultwarden` 的数据,这怎么搞呢?
https://appstore.lazycat.cloud/#/shop/detail/cloud.lazycat.app.vaultwarden
# 思路
由于安全原因,懒猫的应用容器是无法访问其他应用的数据的,即 `/lzcsys/run/data/appvar/` 目录没有挂载到每个应用容器下的。那么我们如果需要在懒猫微服上用应用备份,比如这篇文章提到的 `RcloneNg` 应用,容器内是无法直接通过本地路径访问到 `vaultwarden` 的数据目录。
**那么我们换一个思路来考虑,懒猫微服支持开通 `ssh`,我们可以通过 `rclone` 的 `sftp`,就能访问到其他应用的数据目录了!**
https://appstore.lazycat.cloud/#/shop/detail/ink.akawa.ety001.rcloneng
# 实施
## 开通 SSH
在懒猫客户端中,找到下面截图中的位置,开启 SSHD。

安装“懒猫开发者工具”。
https://appstore.lazycat.cloud/#/shop/detail/cloud.lazycat.developer.tools
打开“懒猫开发者工具”,确保下图的样子(我忘记这里的 `public key` 是如何增加的了)。

## 配置 RcloneNg
### 创建读取懒猫应用数据的配置
创建一个新的配置,在第一步的 “Select” 中选择 “SSH/SFTP”,

第二步中,“SSH Host” 中输入你的懒猫地址,`[你的懒猫名].heiyu.space`; “SSH Username” 中输入 `root`; “Raw PEM-encoded private key” 输入与你刚才添加的 `Public Key` 对应私钥,这里可以使用 `awk '{printf "%s\\n", $0}' 如果你的懒猫微服磁盘IO高,那么这里保存配置的时候会等的久一些。
### 创建备份目的地的配置
根据你的情况,配置即可。我这里配置的是局域网下群晖,使用 SMB。

## 测试 RcloneNg
首先登陆懒猫的终端:
```
ssh root@[你的懒猫名].heiyu.space
```
进入终端后,再进入 `RcloneNg` 容器:
```
lzc-docker exec -it inkakawaety001rcloneng-rcloneng-1 /bin/ash
```
测试 `vaultwarden` 数据是否可读:
```
rclone ls appdata:/lzcsys/run/data/appvar/cloud.lazycat.app.vaultwarden
```
测试你的目的地是否可读:
```
rclone ls synology:NetBackup/LazyCat/AppDataBackup/cloud.lazycat.app.vaultwarden
```
## 编写备份脚本
根据你的需求编写备份脚本,下面是我写的,仅作参考。
```
#!/bin/ash
# 配置参数
SRC="appdata:/lzcsys/run/data/appvar/cloud.lazycat.app.vaultwarden"
DST_BASE="synology:NetBackup/LazyCat/AppDataBackup/cloud.lazycat.app.vaultwarden"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="${DST_BASE}/backups"
# 创建备份目录(若不存在)
rclone mkdir "${BACKUP_DIR}"
# 执行备份
echo "[$(date)] 开始备份到 ${BACKUP_DIR}/${TIMESTAMP}..."
rclone sync -P "${SRC}" "${BACKUP_DIR}/${TIMESTAMP}"
# -------------- 移除错误的软链接操作 --------------
# (因 SMB 不支持 rclone link 创建软链接,故删除以下两行)
# rclone rmdirs --ignore-errors "${CURRENT_LINK}"
# rclone link "${BACKUP_DIR}/${TIMESTAMP}" "${CURRENT_LINK}"
# -------------- 版本清理逻辑(保持不变)--------------
BACKUP_VERSIONS=$(rclone lsf "${BACKUP_DIR}" --dirs-only | sort)
# 保留每天3个最新版本
for day in $(echo "${BACKUP_VERSIONS}" | cut -c1-8 | sort -u); do
daily_versions=$(echo "${BACKUP_VERSIONS}" | grep "^${day}" | sort -r)
echo "${daily_versions}" | tail -n +4 | while read -r old_version; do
echo "[$(date)] 删除当天多余版本:${BACKUP_DIR}/${old_version}"
rclone purge "${BACKUP_DIR}/${old_version}"
done
done
# 保留每周除当天外,其余6天各1个最新版本
today=$(date +%Y%m%d)
for day in $(echo "${BACKUP_VERSIONS}" | cut -c1-8 | sort -u | grep -v "^${today}"); do
daily_versions=$(echo "${BACKUP_VERSIONS}" | grep "^${day}" | sort -r)
echo "${daily_versions}" | tail -n +2 | while read -r old_version; do
echo "[$(date)] 删除非当天多余版本:${BACKUP_DIR}/${old_version}"
rclone purge "${BACKUP_DIR}/${old_version}"
done
done
echo "[$(date)] 备份及清理完成"
# 发送邮件通知
wget -qO- https://message-pusher.xxx.heiyu.space/push/ety001?title=vaultwarden已备份及清理完成&channel=email&token=xxxxxx
```
这个备份脚本 `backup_vaultwarden.sh`,用来保证每天有3个最新版本的备份,每周除当天外,每天保留一份备份,最后结束的时候,还会发一封备份成功的邮件,使用的是应用商店安装的 `MessagePusher`。
https://appstore.lazycat.cloud/#/shop/detail/dev.beiyu.message-pusher
把 `backup_vaultwarden.sh` 脚本增加执行权限后,通过懒猫网盘上传到 `RcloneNg` 的 `应用目录/crontabs/perioidc/hourly` 目录下面,这样每小时会执行一次这个备份脚本。

如果你想要自定义计划任务,也可以把脚本放到 `应用目录/scripts` 目录下,然后修改 `应用目录/crontabs/config/root` 文件,在里面增加自己的计划任务,如下图:

# 总结
至此,我们实现了指定应用的应用数据目录的备份操作。
评论
0暂无评论