#!/bin/bash ####################################### # Config Discord Webhook ####################################### DISCORD_WEBHOOK_URL=$(grep -E '^WEBHOOK_URL=' .env | cut -d '=' -f2-) discord_ping() { local success="$1" local details="$2" [[ -z "$DISCORD_WEBHOOK_URL" ]] && return 0 local color dumps_display dumps_display=$([[ "$success" == "true" ]] && echo "✅" || echo "❌") color=$([[ "$success" == "true" ]] && echo "🟢" || echo "🔴") local msg="**@here Backup Vaultwarden $color**\n" msg+="Backup: ${BACKUP_NAME}\n" msg+="Data transfer: $dumps_display\n" [[ -n "$details" ]] && msg+="Details: $details" curl -fsS -H "Content-Type: application/json" \ -d "{\"content\":\"$msg\"}" \ "$DISCORD_WEBHOOK_URL" >/dev/null || true } ####################################### # Variables backup ####################################### DATE=$(date +%F) BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz" DATA_DIR=$(grep -E '^DATA_DIR=' .env | cut -d '=' -f2-) LOCAL_BACKUP=$(grep -E '^LOCAL_BACKUP=' .env | cut -d '=' -f2-) REMOTE_USER=$(grep -E '^REMOTE_USER=' .env | cut -d '=' -f2-) REMOTE_HOST=$(grep -E '^REMOTE_HOST=' .env | cut -d '=' -f2-) REMOTE_DIR=$(grep -E '^REMOTE_DIR=' .env | cut -d '=' -f2-) SSH_KEY=$(grep -E '^SSH_KEY=' .env | cut -d '=' -f2-) SSH_OPTS=SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10) LOG_FILE="/var/log/vaultwarden_backup.log" mkdir -p "$(dirname "$LOG_FILE")" ####################################### # Fonction pour gérer les erreurs ####################################### fail() { local detail="$1" echo "ERROR: $detail" >&2 discord_ping "false" "$detail" exit 1 } ####################################### # Création du backup ####################################### tar -czf "$LOCAL_BACKUP" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")" || fail "Erreur lors de la compression du dossier $DATA_DIR" ####################################### # Création dossier distant si nécessaire ####################################### ssh "${SSH_OPTS[@]}" "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_DIR" || fail "Impossible de créer le dossier distant $REMOTE_DIR" ####################################### # Envoi du backup ####################################### scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" || fail "Erreur lors de l'envoi du backup vers $REMOTE_HOST" ####################################### # Nettoyage local ####################################### rm -f "$LOCAL_BACKUP" ####################################### # Notification Discord ####################################### discord_ping "true" "Backup envoyé avec succès vers $REMOTE_HOST" echo "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR"