vaultwarden备份与恢复【GITHUB版】

https://linux.do/t/topic/1104736/9 @magisk317

之前一直都是定时手动导出备份,懒着弄备份到云盘(不熟 :rofl:

看到这位老友的备份到github的思路,开搞

前提

我的vaultwarden是使用docker部署的,数据库是sqlite3,所以下面提供的脚本也是基于这个环境

创建仓库

在vaultwarden的数据目录创建仓库,注意是私有仓库,并添加**.gitignore** ,过滤一些不需要的文件,参考 Backing up your vault · dani-garcia/vaultwarden Wiki · GitHub

db.sqlite3
db.sqlite3-shm
db.sqlite3-wal
icon_cache
sends

使用ssh,然后提交初始化仓库

脚本

用ai撸的,简单说明下作用

  1. 执行 /vaultwarden backup 备份
  2. 把备份文件重命名为backup.sqlite3
  3. 判断是否有更新
  4. 有的话提交到git、并tg通知
#!/bin/bash
# Vaultwarden + Git + Telegram backup script

# ===== 配置区 =====
VAULTWARDEN_CONTAINER="vaultwarden"   # 你的容器名
BACKUP_FILE="backup.sqlite3"
TG_BOT_TOKEN="你的TG BOT TOKEN"
TG_CHAT_ID="你的tg id"
REPO_DIR="/root/vw-data" # 修改成你的仓库路径
# ===== END =====

cd $REPO_DIR || exit 1

echo "[$(date +"%Y-%m-%d %H:%M:%S")] Running Vaultwarden backup..."
docker exec -t $VAULTWARDEN_CONTAINER /vaultwarden backup > /dev/null 2>&1

if [ ! -f db_*.sqlite3 ]; then
    echo "[$(date +"%Y-%m-%d %H:%M:%S")] Backup file not found, abort."
    exit 1
fi

# 重命名文件
mv db_*.sqlite3 "$BACKUP_FILE"

# 检查是否有更新
git add .
if git diff --cached --quiet; then
    echo "[$(date +"%Y-%m-%d %H:%M:%S")] No changes detected, skip commit and notification."
    exit 0
fi

echo "[$(date +"%Y-%m-%d %H:%M:%S")] Git commit and push..."
git commit -m "update $(date +"%Y-%m-%d %H:%M:%S")"
git push

# TG 消息(仅在有更新时发送)
TG_MSG="✅ Vaultwarden Backup Completed
📅 $(date +"%Y-%m-%d %H:%M:%S")"

curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
     -d chat_id="${TG_CHAT_ID}" \
     -d text="${TG_MSG}" > /dev/null

echo "[$(date +"%Y-%m-%d %H:%M:%S")] Done."

定时执行

1分钟执行一下,可以根据自己的实际情况调整

* * * * * /opt/backup.sh >> /opt/backup.log 2>&1

这里如果只是想保留最后一条执行记录的话,把 >> 改成 > 即可

恢复

备份出来的数据是这样的,只要把仓库clone下来,把 backup.sqlite3 改成 db.sqlite3 然后启动即可,比如我clone下来的仓库名是 vaultwarden-backup

执行的命令是

mv backup.sqlite3 db.sqlite3
docker run -d --name vaultwarden \
   -v /root/vaultwarden-backup/:/data/  \
   -p 8001:80   vaultwarden/server:latest
19 个赞

大佬威武,回头试试

很不错的思路,但是小小白还是不太懂 :sweat_smile:

感谢大佬,教程

可能需要有点git方面的知识 :joy:

你好歹艾特一下感谢下我啊,贴个链接谁会点开看(指责语气.jpg :rofl:

另外就是建议编辑下帖子,提醒大家务必建成私有仓库,虽然是常识,但是避免小白搞错吧

甚至当时我还写了时间机器的备份逻辑,24小时每小时保留一个备份,7天每天一个,一个月每周一个,一年每月一个,之后每年一个

啊,我记得引用链接,系统会通知来着,我看看

开个玩笑开个玩笑,不用看了

这个是重点,修改下提醒下大家吧

1 个赞

真的二进制文件用git吗?

感谢佬-回头试试

git本身不就是能恢复历史版本吗

git的确不建议存二进制文件,但是我的场景一般就sqlite这个二进制文件,也不大,凑合着用

用git检查变化这个思路不错,不过我用的webdav备份 :hugs:

嘿嘿,还是要艾特下的,之前我被别人引用的地址好像系统就会发一个通知,然后内容上会出现预览的。我加上提示私有仓库了,感谢佬提醒(其实还有一些细节没说,比如配置ssh啥的,默认都懂了 :grinning_face_with_smiling_eyes:

所有容器都用 docker compose 部署然后映射卷到compose文件所在目录下,git直接提交所有就行了

.
├── .git
├── adguardhome
│   ├── conf
│   ├── docker-compose.adguardhome.yml
│   └── work
├── vaultwarden
│   ├── data
│   └── docker-compose.vaultwarden.yml
├── homeassistant
│   ├── config
│   └── docker-compose.homeassistant.yml
├── portainer
│   ├── data
│   └── docker-compose.portainer.yml
├── wireguard
│   ├── config
│   └── docker-compose.wireguard.yml
├── docker-compose.watchtower.yml
└── docker-compose.yml

一次所有都备份了,也不担心服务器宕机

3 个赞

我提供一个更简单的思路吧
一句定时任务就解决
我用的坚果云的webdav,还带历史功能

17 10 * * * tar -czvf Vaultwarden.tar.gz /Configs/Vaultwarden && curl -u "username:password" -T Vaultwarden.tar.gz "https://webdav/bitwarden/"
1 个赞

太强了,大佬!

小白完全不需要备份,断网照样可以导出数据

感谢分享