39 lines
1.3 KiB
Bash
39 lines
1.3 KiB
Bash
#!/usr/bin/env bash
|
|
# = /usr/local/bin/vw-backup.sh (права 700). Запуск по systemd-таймеру vw-backup.timer (03:30 MSK).
|
|
set -euo pipefail
|
|
|
|
VOL="/var/lib/docker/volumes/core_vaultwarden_data/_data"
|
|
DEST="/opt/backups/vaultwarden"
|
|
KEEP=14
|
|
TS="$(date +%Y%m%d-%H%M%S)"
|
|
WORK="$(mktemp -d)"
|
|
trap 'rm -rf "$WORK"' EXIT
|
|
|
|
mkdir -p "$DEST"
|
|
|
|
sqlite3 "$VOL/db.sqlite3" ".timeout 10000" ".backup '$WORK/db.sqlite3'"
|
|
|
|
cp -a "$VOL"/rsa_key* "$WORK"/ 2>/dev/null || true
|
|
cp -a "$VOL"/config.json "$WORK"/ 2>/dev/null || true
|
|
cp -a "$VOL"/attachments "$WORK"/ 2>/dev/null || true
|
|
cp -a "$VOL"/sends "$WORK"/ 2>/dev/null || true
|
|
|
|
ARCHIVE="$DEST/vaultwarden-$TS.tar.gz"
|
|
tar -czf "$ARCHIVE" -C "$WORK" .
|
|
|
|
ls -1t "$DEST"/vaultwarden-*.tar.gz | tail -n +$((KEEP+1)) | xargs -r rm -f
|
|
|
|
# офсайт 1: Google Drive (обязательный)
|
|
rclone copy "$ARCHIVE" gdrive:vaultwarden-backups/
|
|
rclone delete --min-age 90d gdrive:vaultwarden-backups/ 2>/dev/null || true
|
|
|
|
# офсайт 2: домашний SMB через WG (best-effort)
|
|
if rclone copy "$ARCHIVE" "homesmb:TOSHIBA EXT/vaultwarden-backups/" 2>/dev/null; then
|
|
rclone delete --min-age 90d "homesmb:TOSHIBA EXT/vaultwarden-backups/" 2>/dev/null || true
|
|
SMB="ok"
|
|
else
|
|
SMB="недоступен"
|
|
fi
|
|
|
|
echo "OK: $ARCHIVE ($(du -h "$ARCHIVE" | cut -f1)) -> локально + gdrive + smb:$SMB"
|