如何使用 RcloneNg 备份 vaultwarden 数据目录到其他网盘

ety001

发布于209天前
远程工作,Steem开发者,Steem见证人
# 背景

目前懒猫微服的备份是不支持选择特定的应用备份,而我当前只需要备份的应用数据只有 `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。

![image.png](https://dl.playground.lazycat.cloud/guidelines/364/9a65dcfc-9eaf-4968-ae68-0cd8f31e3467.png "image.png")

安装“懒猫开发者工具”。

https://appstore.lazycat.cloud/#/shop/detail/cloud.lazycat.developer.tools

打开“懒猫开发者工具”,确保下图的样子(我忘记这里的 `public key` 是如何增加的了)。

![image.png](https://dl.playground.lazycat.cloud/guidelines/364/8d587b5d-69c2-4871-b0fd-5b32f69b5cdf.png "image.png")

## 配置 RcloneNg

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

![image.png](https://dl.playground.lazycat.cloud/guidelines/364/bef3a4e6-90b6-439c-bb1b-01ef9ca8f63d.png "image.png")

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

### 创建备份目的地的配置

根据你的情况,配置即可。我这里配置的是局域网下群晖,使用 SMB。

![image.png](https://dl.playground.lazycat.cloud/guidelines/364/2fd0b0dd-2e04-4296-9b2a-4dd8a3bc7185.png "image.png")

## 测试 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` 目录下面,这样每小时会执行一次这个备份脚本。

![image.png](https://dl.playground.lazycat.cloud/guidelines/364/f6af436b-0248-496b-8622-287bbde801d5.png "image.png")

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

![image.png](https://dl.playground.lazycat.cloud/guidelines/364/2a2c2c57-845d-418a-a6ff-1679179fb6d6.png "image.png")

# 总结

至此,我们实现了指定应用的应用数据目录的备份操作。

评论

0

暂无评论

说点什么呢~
收藏
0
0
0