correction du script et readme

This commit is contained in:
2026-03-06 14:16:33 +01:00
parent 24c935c280
commit 3de25dae43
4 changed files with 194 additions and 161 deletions

View File

@@ -1 +1,3 @@
.env .env
backup.log

View File

@@ -1,135 +1,118 @@
FONCTIONNEMENT DU SCRIPT # FONCTIONNEMENT DU SCRIPT VAULTWARDEN
Le script de backup de vaultwarden permet une sauvegard périodique des mots de passe et utilisateurs de celui-ci.
################################################################################################## ## INITIALISATION DES VARIABLES DE MANIÈRE SÉCURISÉ
COMPRESSION DES DONNÉES
##################################################################################################
Le dossier data de Vaultwarden est compressé afin de créer une archive: 1. Les informations sensibles ne sont pas stockées directement dans le script. Elles sont placées dans un fichier .env
Exemple: tar -czf "$LOCAL_BACKUP" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")" ```bash
WEBHOOK_URL=...
REMOTE_USER=...
REMOTE_HOST=...
SSH_KEY=...
DATA_DIR=...
```
Le nom du fichier contient la date du jour : 2. on recupere les varibales dans le script
```bash
REMOTE_USER=$(grep -E '^REMOTE_USER=' .env | cut -d '=' -f2-)
```
DATE=$(date +%F) Explication:
BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz"
Cela permet davoir des sauvegardes facilement identifiables. - grep recherche la variable dans le fichier .env
- cut récupère uniquement la valeur après =
- REMOTE_USER="user" Le script récupère >> "user"
Cela permet:
################################################################################################## - daméliorer la sécurité
TRANSFERT VERS LE SERVEUR DE BACKUP - déviter de modifier le script si un paramètre change
##################################################################################################
La sauvegarde est envoyée vers une machine dédiée grâce à SCP. ## RÉCUPÉRATION DES DONNÉES
Pour éviter de saisir un mot de passe à chaque fois, une clé SSH est utilisée.
Exemple: scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" 1. Le dossier data de Vaultwarden est dupliqué puis compressé afin de créer une archive :
```bash
tar -czf "$LOCAL_BACKUP" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"
```
2. Transfer vers le serveur de backup
```bash
scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
```
La sauvegarde est envoyée vers une machine dédiée grâce à SCP. Pour éviter de saisir un mot de passe à chaque fois, une clé SSH est utilisée.
Cette clé SSH est générée sur la machine de backup et autorisée sur la machine Vaultwarden. Cette clé SSH est générée sur la machine de backup et autorisée sur la machine Vaultwarden.
## NOTIFICATION DISCORD
##################################################################################################
NOTIFICATION DISCORD
##################################################################################################
Le script envoie une notification sur un salon Discord pour informer de létat de la sauvegarde. Cela se fait grâce à un webhook Discord. Le script envoie une notification sur un salon Discord pour informer de létat de la sauvegarde. Cela se fait grâce à un webhook Discord.
Exemple d'envoi de message: 1. on défini le message
```bash
curl -fsS -H "Content-Type: application/json" \ local msg="**@here Backup Vaultwarden $color**\n"
-d "{\"content\":\"$msg\"}" \ msg+="Backup: ${BACKUP_NAME}\n"
"$DISCORD_WEBHOOK_URL" msg+="Data transfer: $dumps_display\n"
[[ -n "$details" ]] && msg+="Details: $details"
```
2. on envoie le message sur discord avec le message et le webhook
```bash
curl -fsS -H "Content-Type: application/json" \
-d "{\"content\":\"$msg\"}" \
"$DISCORD_WEBHOOK_URL"
```
Le message indique: Le message indique:
-si la sauvegarde a réussi 🟢 - si la sauvegarde a réussi 🟢
-si elle a échoué 🔴 - si elle a échoué 🔴
-le nom du backup - le nom du backup
-les détails de lerreur si nécessaire - les détails de lerreur si nécessaire
## PLANIFICATION AVEC CRON
##################################################################################################
PLANIFICATION AVEC CRON
##################################################################################################
Le script est exécuté automatiquement chaque jour grâce à cron. Le script est exécuté automatiquement chaque jour grâce à cron.
Configuration: crontab -e 1. Ouvrez le crontab pour l'édition :
```bash
Puis : 0 19 * * * /home/matt/vaultwarden/scripts/backup-vaultwarden.sh >> /home/matt/ vaultwarden/scripts/backup.log 2>&1 crontab -e
```
2. Ajoutez la ligne suivante pour exécuter le script tous les jours à 19h :
```bash
0 19 * * * /chemin/vers/le/script/check_storage.sh
```
Signification: Signification:
0 19 * * * 0 19 * * *
│ │ │ │ │ │ │ │
│ │ │ │ └── tous les jours de la semaine │ │ │ │ └── tous les jours de la semaine
│ │ │ └──── tous les mois │ │ │ └──── tous les mois
│ │ └────── tous les jours du mois │ │ └────── tous les jours du mois
│ └──────── 19h │ └──────── 19h
└────────── minute 0 └────────── minute 0
Tous les jours à 19h, le script est exécuté. Tous les jours à 19h, le script est exécuté et les logs sont enregistrés dans backup.log ce qui permet danalyser les erreurs si un problème survient.
Les logs sont enregistrés dans : backup.log
Cela permet danalyser les erreurs si un problème survient.
## NETTOYAGE
################################################################################################## Une fois la sauvegarde envoyée sur la machine distante, le fichier temporaire est supprimé :
SÉCURITÉ AVEC LE FICHIER .ENV
##################################################################################################
Les informations sensibles ne sont pas stockées directement dans le script. ```bash
Elles sont placées dans un fichier .env rm -f "$LOCAL_BACKUP"
```
Exemple:
WEBHOOK_URL=...
REMOTE_USER=...
REMOTE_HOST=...
SSH_KEY=...
DATA_DIR=...
Le script les valeurs : REMOTE_USER=$(grep -E '^REMOTE_USER=' .env | cut -d '=' -f2-)
Explication:
-grep recherche la variable dans le fichier .env
-cut récupère uniquement la valeur après =
Exemple : REMOTE_USER="user"
Le script récupère uniquement : "user"
Cela permet:
-daméliorer la sécurité
-déviter de modifier le script si un paramètre change
##################################################################################################
NETTOYAGE
##################################################################################################
Une fois la sauvegarde envoyée sur la machine distante, le fichier temporaire est supprimé:
[rm -f "$LOCAL_BACKUP"]
Cela permet de garder le serveur propre et éviter de remplir le disque. Cela permet de garder le serveur propre et éviter de remplir le disque.
## RÉSUMÉ
##################################################################################################
RÉSUMÉ :
##################################################################################################
Le script automatise complètement les sauvegardes Vaultwarden : Le script automatise complètement les sauvegardes Vaultwarden :
-sauvegarde du dossier data - sauvegarde du dossier data
-compression et datation - compression et datation
-transfert sécurisé via SSH - transfert sécurisé via SSH
-notification Discord - notification Discord
-exécution automatique avec cron - exécution automatique avec cron
-sécurisation des paramètres via .env - sécurisation des paramètres via .env
Cela permet davoir une sauvegarde quotidienne fiable et surveillée. Cela permet davoir une sauvegarde quotidienne fiable et surveillée.
##################################################################################################

View File

@@ -1,82 +1,135 @@
#!/bin/bash #!/usr/bin/env bash
set -euo pipefail
####################################### #######################################
# Config Discord Webhook # Chemins fixes du script
####################################### #######################################
DISCORD_WEBHOOK_URL=$(grep -E '^WEBHOOK_URL=' .env | cut -d '=' -f2-) 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"
discord_ping() { mkdir -p "$(dirname "$LOG_FILE")"
local success="$1" touch "$LOG_FILE"
local details="$2"
[[ -z "$DISCORD_WEBHOOK_URL" ]] && return 0 log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
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
} }
#######################################
# 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 # Variables backup
####################################### #######################################
DATE=$(date +%F) DATE="$(date +'%Y-%m-%d_%H-%M-%S')"
BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz" BACKUP_NAME="vaultwarden-backup-${DATE}.tar.gz"
LOCAL_BACKUP_DIR="$LOCAL_BACKUP"
LOCAL_BACKUP_FILE="${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"
DATA_DIR=$(grep -E '^DATA_DIR=' .env | cut -d '=' -f2-) SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10)
LOCAL_BACKUP=$(grep -E '^LOCAL_BACKUP=' .env | cut -d '=' -f2-)
REMOTE_USER=$(grep -E '^REMOTE_USER=' .env | cut -d '=' -f2-) mkdir -p "$LOCAL_BACKUP_DIR"
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 # 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() { fail() {
local detail="$1" local detail="$1"
echo "ERROR: $detail" >&2 log "ERROR: $detail"
discord_ping "false" "$detail" discord_ping "false" "$detail"
exit 1 exit 1
} }
####################################### #######################################
# Création du backup # Vérifications préalables
####################################### #######################################
tar -czf "$LOCAL_BACKUP" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")" || fail "Erreur lors de la compression du dossier $DATA_DIR" [[ -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 dossier distant si nécessaire # Création du backup
####################################### #######################################
ssh "${SSH_OPTS[@]}" "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_DIR" || fail "Impossible de créer le dossier distant $REMOTE_DIR" 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 # 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" 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 # Nettoyage local
####################################### #######################################
rm -f "$LOCAL_BACKUP" rm -f "$LOCAL_BACKUP_FILE" || fail "Impossible de supprimer le backup local $LOCAL_BACKUP_FILE"
####################################### #######################################
# Notification Discord # Fin
####################################### #######################################
log "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR"
discord_ping "true" "Backup envoyé avec succès vers $REMOTE_HOST" discord_ping "true" "Backup envoyé avec succès vers $REMOTE_HOST"
echo "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR" echo "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR"

View File

@@ -1,5 +0,0 @@
Permission denied, please try again.
Permission denied, please try again.
malio-b@chat.malio-dev.fr: Permission denied (publickey,password).
scp: Connection closed
Backup vaultwarden-backup-2026-03-05.tar.gz envoyé sur chat.malio-dev.fr:/home/malio-b/backups/bitwarden