159 lines
5.4 KiB
Bash
159 lines
5.4 KiB
Bash
#!/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
|
||
# l’archive 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 l’existence 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 l’archive vers le serveur distant via SCP ;
|
||
# 8. supprime l’archive 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"
|