https://linux.do/t/topic/1104736/9 @magisk317
之前一直都是定时手动导出备份,懒着弄备份到云盘(不熟 ![]()
看到这位老友的备份到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撸的,简单说明下作用
- 执行
/vaultwarden backup备份 - 把备份文件重命名为backup.sqlite3
- 判断是否有更新
- 有的话提交到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
