#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="${SCRIPT_DIR}/.env" [[ -f "$ENV_FILE" ]] && { set -a; source "$ENV_FILE"; set +a; } DATA_DIR="/home/matt/vaultwarden/data" BACKUP_DIR="/home/matt/vaultwarden/backup" RETENTION=2 WEBHOOK_URL="${DISCORD_WEBHOOK_URL:-}" LOG_FILE="/home/matt/vaultwarden/logs/vaultwarden_backup.log" DATE="$(date +'%Y-%m-%d_%H-%M-%S')" BACKUP_NAME="vaultwarden-backup-${DATE}.zip" BACKUP_FILE="${BACKUP_DIR}/${BACKUP_NAME}" mkdir -p "$BACKUP_DIR" "$(dirname "$LOG_FILE")" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; } discord() { local color="$1" title="$2" msg="$3" [[ -z "$WEBHOOK_URL" ]] && return 0 curl -fsS -H "Content-Type: application/json" -d "{ \"embeds\": [{ \"title\": \"${title}\", \"description\": \"${msg}\", \"color\": ${color} }] }" "$WEBHOOK_URL" >/dev/null 2>&1 || true } fail() { log "ERROR: $1" discord 16711680 "Backup Vaultwarden - ECHEC" "$1" exit 1 } # Verifications [[ -d "$DATA_DIR" ]] || fail "Dossier source introuvable : $DATA_DIR" command -v zip &>/dev/null || fail "zip n'est pas installe" log "Debut backup - source: $DATA_DIR" # Zip du dossier data cd "$(dirname "$DATA_DIR")" zip -r -q "$BACKUP_FILE" "$(basename "$DATA_DIR")" || fail "Erreur lors de la compression" SIZE="$(du -h "$BACKUP_FILE" | cut -f1)" log "Backup cree : $BACKUP_FILE ($SIZE)" # Rotation - garde les 2 derniers mapfile -t old < <(ls -1t "${BACKUP_DIR}"/vaultwarden-backup-*.zip 2>/dev/null | tail -n +$((RETENTION + 1))) for f in "${old[@]}"; do rm -f "$f" log "Rotation : supprime $f" done log "Backup termine : $BACKUP_NAME" discord 65280 "Backup Vaultwarden - OK" "Backup **${BACKUP_NAME}** cree (${SIZE})"