Files
Malio-ops/BackupVaultWarden/backup-vaultwarden.sh
2026-03-09 10:49:29 +01:00

159 lines
5.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
###############################################################################
# backup-vaultwarden.sh
#
# Ce script réalise une sauvegarde complète des données Vaultwarden
# en compressant le répertoire contenant les données, puis transfère
# larchive vers un serveur distant de stockage via SSH.
#
# Fonctionnement global :
# 1. charge la configuration depuis le fichier .env ;
# 2. initialise les chemins du script et le fichier de log ;
# 3. vérifie la présence des variables obligatoires dans le .env ;
# 4. vérifie lexistence du dossier de données Vaultwarden ;
# 5. crée une archive compressée (.tar.gz) du dossier DATA_DIR ;
# 6. crée le dossier de destination sur le serveur distant ;
# 7. transfère larchive vers le serveur distant via SCP ;
# 8. supprime larchive locale après transfert ;
# 9. enregistre les opérations dans un fichier log ;
# 10. envoie une notification Discord indiquant le succès ou léchec.
#
# Le script est conçu pour être exécuté automatiquement via cron
# et permet de conserver une copie distante des données Vaultwarden
# afin de garantir leur récupération en cas de perte locale.
###############################################################################
#######################################
# Chemins fixes du script
#######################################
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="/home/matt/vaultwarden/scripts/Scripts-Serveur/backup_vaultwarden/.env"
LOG_FILE="/var/log/vaultwarden_backup.log"
mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
#######################################
# Vérification fichier .env
#######################################
[[ -f "$ENV_FILE" ]] || {
echo "ERROR: Fichier .env introuvable : $ENV_FILE" >&2
exit 1
}
#######################################
# Chargement du .env
#######################################
set -a
source "$ENV_FILE"
set +a
#######################################
# Variables obligatoires
#######################################
: "${WEBHOOK_URL:=}"
: "${DATA_DIR:?Variable DATA_DIR manquante dans .env}"
: "${LOCAL_BACKUP:?Variable LOCAL_BACKUP manquante dans .env}"
: "${REMOTE_USER:?Variable REMOTE_USER manquante dans .env}"
: "${REMOTE_HOST:?Variable REMOTE_HOST manquante dans .env}"
: "${REMOTE_DIR:?Variable REMOTE_DIR manquante dans .env}"
: "${SSH_KEY:?Variable SSH_KEY manquante dans .env}"
#######################################
# Variables backup
#######################################
DATE="$(date +'%Y-%m-%d_%H-%M-%S')"
BACKUP_NAME="vaultwarden-backup-${DATE}.tar.gz"
LOCAL_BACKUP_DIR="$LOCAL_BACKUP"
LOCAL_BACKUP_FILE="${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"
SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10)
mkdir -p "$LOCAL_BACKUP_DIR"
#######################################
# Notification Discord
#######################################
discord_ping() {
local success="$1"
local details="${2:-}"
[[ -z "$WEBHOOK_URL" ]] && return 0
local icon status_line
if [[ "$success" == "true" ]]; then
icon="🟢"
status_line="✅"
else
icon="🔴"
status_line="❌"
fi
local msg
msg="**@here ${icon} Backup Vaultwarden**\n"
msg+="Backup: ${BACKUP_NAME}\n"
msg+="Data transfer: ${status_line}\n"
[[ -n "$details" ]] && msg+="Détails: ${details}"
python3 - <<PY | curl -fsS -H "Content-Type: application/json" -d @- "$WEBHOOK_URL" >/dev/null || true
import json
print(json.dumps({"content": """$msg"""}))
PY
}
#######################################
# Fonction erreur
#######################################
fail() {
local detail="$1"
log "ERROR: $detail"
discord_ping "false" "$detail"
exit 1
}
#######################################
# Vérifications préalables
#######################################
[[ -d "$DATA_DIR" ]] || fail "Le dossier source n'existe pas : $DATA_DIR"
[[ -f "$SSH_KEY" ]] || fail "La clé SSH est introuvable : $SSH_KEY"
log "Début du backup Vaultwarden"
log "Source : $DATA_DIR"
log "Archive locale : $LOCAL_BACKUP_FILE"
log "Destination distante : ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}"
#######################################
# Création du backup
#######################################
tar -czf "$LOCAL_BACKUP_FILE" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")" \
|| fail "Erreur lors de la compression du dossier $DATA_DIR"
#######################################
# Création dossier distant
#######################################
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_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" \
|| fail "Erreur lors de l'envoi du backup vers $REMOTE_HOST"
#######################################
# Nettoyage local
#######################################
rm -f "$LOCAL_BACKUP_FILE" || fail "Impossible de supprimer le backup local $LOCAL_BACKUP_FILE"
#######################################
# Fin
#######################################
log "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR"
discord_ping "true" "Backup envoyé avec succès vers $REMOTE_HOST"
echo "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR"