侧边栏壁纸
博主头像
问道小站 博主等级

行动起来,活在当下

  • 累计撰写 5 篇文章
  • 累计创建 3 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Vaultwarden 自动备份方案(本地 + 异地)

亦然
2025-12-07 / 1 评论 / 0 点赞 / 45 阅读 / 0 字

非常好 👍 现在你整个 Vaultwarden 自动备份体系(脚本 + systemd 定时器 + 异地同步)已经完全正常运行。以下是完整的文档化总结,便于你归档到知识库中。


🧩 Vaultwarden 自动备份方案(本地 + 异地)

一、备份目标

实现 Vaultwarden 数据的自动化定时备份,具备以下特性:

  • 每天两次(02:00 与 12:00)自动执行

  • 本地保留 7 份 历史备份

  • 异地保留 60 份 历史备份(NAS 挂载目录)

  • 支持手动运行、自动检测挂载状态

  • 所有操作均记录日志 /var/log/vaultwarden-backup.log


二、目录结构

/opt/docker/
├── vaultwarden/                     # 运行目录
├── backup-vaultwarden.sh            # 备份脚本
└── backup/
    └── vaultwarden/                 # 本地备份存放目录
/opt/mnt/synowebdav/nfs/backup/vaultwarden/   # 群晖 NAS 挂载目录(异地备份)

三、备份脚本

文件路径:
/opt/docker/backup-vaultwarden.sh

#!/bin/bash
# vaultwarden 自动备份脚本
# 每天执行两次,保留本地7份、异地60份

# ==== 配置部分 ====
DATE=$(date +%F-%H%M)
SRC_DIR="/opt/docker/vaultwarden"
LOCAL_DIR="/opt/docker/backup/vaultwarden"
REMOTE_DIR="/opt/mnt/synowebdav/nfs/backup/vaultwarden"
BACKUP_NAME="vaultwarden-${DATE}.tar.gz"
LOG_FILE="/var/log/vaultwarden-backup.log"

# ==== 准备目录 ====
mkdir -p "$LOCAL_DIR"
echo "[$(date '+%F %T')] 开始 Vaultwarden 备份..." | tee -a "$LOG_FILE"

# ==== 创建本地压缩包 ====
tar -zcvf "${LOCAL_DIR}/${BACKUP_NAME}" -C "/opt/docker" vaultwarden >>"$LOG_FILE" 2>&1

if [ $? -ne 0 ]; then
  echo "[$(date '+%F %T')] ❌ 打包失败,终止。" | tee -a "$LOG_FILE"
  exit 1
fi

# ==== 本地保留策略(仅保留最近7份)====
find "$LOCAL_DIR" -maxdepth 1 -type f -name "vaultwarden-*.tar.gz" -printf "%T@ %p\n" \
  | sort -n | head -n -7 | cut -d' ' -f2- | xargs -r rm -f

# ==== 复制到异地备份目录 ====
if [ -d "$REMOTE_DIR" ]; then
  cp -a "${LOCAL_DIR}/${BACKUP_NAME}" "$REMOTE_DIR"/
  if [ $? -eq 0 ]; then
    echo "[$(date '+%F %T')] ✅ 已复制到异地备份目录。" | tee -a "$LOG_FILE"
  else
    echo "[$(date '+%F %T')] ⚠ 异地复制失败!" | tee -a "$LOG_FILE"
  fi
else
  echo "[$(date '+%F %T')] ⚠ 异地目录未挂载或不存在:$REMOTE_DIR" | tee -a "$LOG_FILE"
fi

# ==== 异地保留策略(仅保留最近60份)====
find "$REMOTE_DIR" -maxdepth 1 -type f -name "vaultwarden-*.tar.gz" -printf "%T@ %p\n" \
  | sort -n | head -n -60 | cut -d' ' -f2- | xargs -r rm -f

echo "[$(date '+%F %T')] 🎯 备份完成:$BACKUP_NAME" | tee -a "$LOG_FILE"
echo "------------------------------------------------------" >>"$LOG_FILE"

赋权:

chmod +x /opt/docker/backup-vaultwarden.sh

四、systemd 定时执行配置

服务单元

/etc/systemd/system/vaultwarden-backup.service

[Unit]
Description=Vaultwarden 自动备份
After=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/docker/backup-vaultwarden.sh

定时器单元

/etc/systemd/system/vaultwarden-backup.timer

[Unit]
Description=Vaultwarden 备份定时器

[Timer]
OnCalendar=*-*-* 02:00:00
OnCalendar=*-*-* 12:00:00
Persistent=true

[Install]
WantedBy=timers.target

启用与检查:

systemctl daemon-reload
systemctl enable --now vaultwarden-backup.timer
systemctl list-timers | grep vaultwarden

五、验证结果

手动测试:

/opt/docker/backup-vaultwarden.sh

示例输出:

[2025-11-06 12:14:05] 开始 Vaultwarden 备份...
[2025-11-06 12:14:07] ✅ 已复制到异地备份目录。
[2025-11-06 12:14:07] 🎯 备份完成:vaultwarden-2025-11-06-1214.tar.gz

备份文件验证:

ls -lh /opt/docker/backup/vaultwarden/
ls -lh /opt/mnt/synowebdav/nfs/backup/vaultwarden/

六、日志与监控

日志路径:

/var/log/vaultwarden-backup.log

查看最近 20 行:

tail -n 20 /var/log/vaultwarden-backup.log

七、恢复步骤(简要)

  1. 解压备份包:

    tar -zxvf vaultwarden-2025-11-06-1214.tar.gz -C /opt/docker/
    
  2. 恢复完成后:

    systemctl restart vaultwarden
    

是否希望我帮你再补充一个“备份完整性验证”段(自动检测 tar.gz 是否损坏并记录结果),以便让这份文档更完善?

0

评论区