From 2465046d792f75e4877821f23cb69319d367d3ec Mon Sep 17 00:00:00 2001 From: "sebastien.roy" Date: Thu, 5 Mar 2026 12:29:18 +0000 Subject: [PATCH 1/9] script backup vaultwarden --- backup-vaultwarden.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 backup-vaultwarden.sh diff --git a/backup-vaultwarden.sh b/backup-vaultwarden.sh new file mode 100755 index 0000000..668fe69 --- /dev/null +++ b/backup-vaultwarden.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +DATE=$(date +%F) +BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz" + +# dossier source à sauvegarder +DATA_DIR="/home/matt/vaultwarden/data" + +# chemin pour le fichier backup local temporaire +LOCAL_BACKUP="/home/matt/vaultwarden/$BACKUP_NAME" + +# serveur de backup +REMOTE_USER="malio-b" +REMOTE_HOST="chat.malio-dev.fr" +REMOTE_DIR="/home/malio-b/backups/bitwarden" + +# --- Compression du dossier data --- +tar -czf "$LOCAL_BACKUP" -C "$(dirname $DATA_DIR)" "$(basename $DATA_DIR)" + +# --- Envoi vers le serveur de backup --- +scp "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR" + +# --- Nettoyage du backup local --- +rm -f "$LOCAL_BACKUP" + -- 2.39.5 From ec8aeb70483b0fdaee39515a20c0ec27f65d3abc Mon Sep 17 00:00:00 2001 From: "sebastien.roy" Date: Thu, 5 Mar 2026 15:31:00 +0100 Subject: [PATCH 2/9] cron + modif script + webhook --- backup-vaultwarden.sh | 25 -------- backup_vaultwarden/.env | 8 +++ backup_vaultwarden/.env.exemple | 6 ++ backup_vaultwarden/backup-vaultwarden.sh | 82 ++++++++++++++++++++++++ backup_vaultwarden/backup.log | 5 ++ 5 files changed, 101 insertions(+), 25 deletions(-) delete mode 100755 backup-vaultwarden.sh create mode 100644 backup_vaultwarden/.env create mode 100644 backup_vaultwarden/.env.exemple create mode 100755 backup_vaultwarden/backup-vaultwarden.sh create mode 100644 backup_vaultwarden/backup.log diff --git a/backup-vaultwarden.sh b/backup-vaultwarden.sh deleted file mode 100755 index 668fe69..0000000 --- a/backup-vaultwarden.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -DATE=$(date +%F) -BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz" - -# dossier source à sauvegarder -DATA_DIR="/home/matt/vaultwarden/data" - -# chemin pour le fichier backup local temporaire -LOCAL_BACKUP="/home/matt/vaultwarden/$BACKUP_NAME" - -# serveur de backup -REMOTE_USER="malio-b" -REMOTE_HOST="chat.malio-dev.fr" -REMOTE_DIR="/home/malio-b/backups/bitwarden" - -# --- Compression du dossier data --- -tar -czf "$LOCAL_BACKUP" -C "$(dirname $DATA_DIR)" "$(basename $DATA_DIR)" - -# --- Envoi vers le serveur de backup --- -scp "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR" - -# --- Nettoyage du backup local --- -rm -f "$LOCAL_BACKUP" - diff --git a/backup_vaultwarden/.env b/backup_vaultwarden/.env new file mode 100644 index 0000000..658d115 --- /dev/null +++ b/backup_vaultwarden/.env @@ -0,0 +1,8 @@ +WEBHOOK_URL="https://discord.com/api/webhooks/1478503102888935506/YCtJM09QZiKNMiCe5u7vCQb52VcLjHAd9wwEsKNltlJVcy7sKvoMTOJkvEKOOrk-Wpkh" +REMOTE_USER="malio-b" +REMOTE_HOST="chat.malio-dev.fr" +REMOTE_DIR="/home/malio-b/backups/bitwarden" +SSH_KEY="/home/matt/.ssh/id_ed25519_bitwarden" +SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10) +DATA_DIR="/home/matt/vaultwarden/data" +LOCAL_BACKUP="/home/matt/vaultwarden/$BACKUP_NAME" diff --git a/backup_vaultwarden/.env.exemple b/backup_vaultwarden/.env.exemple new file mode 100644 index 0000000..8a1e463 --- /dev/null +++ b/backup_vaultwarden/.env.exemple @@ -0,0 +1,6 @@ +DATA_DIR= +LOCAL_BACKUP= +REMOTE_USER= +REMOTE_HOST= +REMOTE_DIR= +SSH_KEY= diff --git a/backup_vaultwarden/backup-vaultwarden.sh b/backup_vaultwarden/backup-vaultwarden.sh new file mode 100755 index 0000000..3382a22 --- /dev/null +++ b/backup_vaultwarden/backup-vaultwarden.sh @@ -0,0 +1,82 @@ +#!/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" diff --git a/backup_vaultwarden/backup.log b/backup_vaultwarden/backup.log new file mode 100644 index 0000000..f7bb504 --- /dev/null +++ b/backup_vaultwarden/backup.log @@ -0,0 +1,5 @@ +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 -- 2.39.5 From 73189f574bb4c6d3948c2ff363be7405e88d32b5 Mon Sep 17 00:00:00 2001 From: "sebastien.roy" Date: Fri, 6 Mar 2026 08:48:58 +0100 Subject: [PATCH 3/9] readme --- backup_vaultwarden/README.md | 136 +++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 backup_vaultwarden/README.md diff --git a/backup_vaultwarden/README.md b/backup_vaultwarden/README.md new file mode 100644 index 0000000..6750d0b --- /dev/null +++ b/backup_vaultwarden/README.md @@ -0,0 +1,136 @@ +FONCTIONNEMENT DU SCRIPT + +########################################################################################################################################################################>############################################################################################################### +COMPRESSION DES DONNÉES +####################################################################################################################################################################################################################################################################################### + +Le dossier data de Vaultwarden est compressé afin de créer une archive: + +Exemple: tar -czf "$LOCAL_BACKUP" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")" + +Le nom du fichier contient la date du jour : + + DATE=$(date +%F) + BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz" + +Cela permet d’avoir des sauvegardes facilement identifiables. + + +####################################################################################################################################################################################################################################################################################### +TRANSFERT VERS LE SERVEUR DE BACKUP +####################################################################################################################################################################################################################################################################################### + +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. + +Exemple: scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" + +Cette clé SSH est générée sur la machine de backup et autorisée sur la machine Vaultwarden. + + +####################################################################################################################################################################################################################################################################################### +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. + +Exemple d'envoi de message: + + curl -fsS -H "Content-Type: application/json" \ + -d "{\"content\":\"$msg\"}" \ + "$DISCORD_WEBHOOK_URL" + +Le message indique: + +-si la sauvegarde a réussi 🟢 +-si elle a échoué 🔴 +-le nom du backup +-les détails de l’erreur si nécessaire + + +####################################################################################################################################################################################################################################################################################### +PLANIFICATION AVEC CRON +####################################################################################################################################################################################################################################################################################### + +Le script est exécuté automatiquement chaque jour grâce à cron. + +Configuration: crontab -e + +Puis : 0 19 * * * /home/matt/vaultwarden/scripts/backup-vaultwarden.sh >> /home/matt/ vaultwarden/scripts/backup.log 2>&1 + +Signification: + +0 19 * * * +│ │ │ │ │ +│ │ │ │ └── tous les jours de la semaine +│ │ │ └──── tous les mois +│ │ └────── tous les jours du mois +│ └──────── 19h +└────────── minute 0 + +Tous les jours à 19h, le script est exécuté. +Les logs sont enregistrés dans : backup.log +Cela permet d’analyser les erreurs si un problème survient. + + +################################################################################################################################################################################################################################################################################################################################################################################## +SÉCURITÉ AVEC LE FICHIER .ENV +####################################################################################################################################################################################################################################################################################### + +Les informations sensibles ne sont pas stockées directement dans le script. +Elles sont placées dans un fichier .env + +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: + +-d’amé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. + + +################################################################################################################################################################################################################################################################### +RÉSUMÉ : +################################################################################################################################################################################################################################################################### + +Le script automatise complètement les sauvegardes Vaultwarden : + +-sauvegarde du dossier data +-compression et datation +-transfert sécurisé via SSH +-notification Discord +-exécution automatique avec cron +-sécurisation des paramètres via .env + +Cela permet d’avoir une sauvegarde quotidienne fiable et surveillée. + + +################################################################################################################################################################################################################################################################### + + -- 2.39.5 From 8b319de03a3dfe6818c4c52d0a9c051c326e7bc1 Mon Sep 17 00:00:00 2001 From: "sebastien.roy" Date: Fri, 6 Mar 2026 08:55:48 +0100 Subject: [PATCH 4/9] readme modif --- backup_vaultwarden/README.md | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/backup_vaultwarden/README.md b/backup_vaultwarden/README.md index 6750d0b..ee8d3f6 100644 --- a/backup_vaultwarden/README.md +++ b/backup_vaultwarden/README.md @@ -1,8 +1,8 @@ FONCTIONNEMENT DU SCRIPT -########################################################################################################################################################################>############################################################################################################### +################################################################################################## COMPRESSION DES DONNÉES -####################################################################################################################################################################################################################################################################################### +################################################################################################## Le dossier data de Vaultwarden est compressé afin de créer une archive: @@ -16,9 +16,9 @@ Le nom du fichier contient la date du jour : Cela permet d’avoir des sauvegardes facilement identifiables. -####################################################################################################################################################################################################################################################################################### +################################################################################################## TRANSFERT VERS LE SERVEUR DE BACKUP -####################################################################################################################################################################################################################################################################################### +################################################################################################## 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. @@ -28,9 +28,9 @@ Exemple: scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE Cette clé SSH est générée sur la machine de backup et autorisée sur la machine Vaultwarden. -####################################################################################################################################################################################################################################################################################### +################################################################################################## 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. @@ -48,9 +48,9 @@ Le message indique: -les détails de l’erreur si nécessaire -####################################################################################################################################################################################################################################################################################### +################################################################################################## PLANIFICATION AVEC CRON -####################################################################################################################################################################################################################################################################################### +################################################################################################## Le script est exécuté automatiquement chaque jour grâce à cron. @@ -73,9 +73,9 @@ Les logs sont enregistrés dans : backup.log Cela permet d’analyser les erreurs si un problème survient. -################################################################################################################################################################################################################################################################################################################################################################################## +################################################################################################## SÉCURITÉ AVEC LE FICHIER .ENV -####################################################################################################################################################################################################################################################################################### +################################################################################################## Les informations sensibles ne sont pas stockées directement dans le script. Elles sont placées dans un fichier .env @@ -104,9 +104,9 @@ Cela permet: -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é: @@ -115,9 +115,9 @@ Une fois la sauvegarde envoyée sur la machine distante, le fichier temporaire e Cela permet de garder le serveur propre et éviter de remplir le disque. -################################################################################################################################################################################################################################################################### +################################################################################################## RÉSUMÉ : -################################################################################################################################################################################################################################################################### +################################################################################################## Le script automatise complètement les sauvegardes Vaultwarden : @@ -131,6 +131,5 @@ Le script automatise complètement les sauvegardes Vaultwarden : Cela permet d’avoir une sauvegarde quotidienne fiable et surveillée. -################################################################################################################################################################################################################################################################### - +################################################################################################## -- 2.39.5 From 3a564cf966cc15baf726a33bf0f0ad8399d0ae84 Mon Sep 17 00:00:00 2001 From: "sebastien.roy" Date: Fri, 6 Mar 2026 09:05:38 +0100 Subject: [PATCH 5/9] modif .env --- backup_vaultwarden/.env | 8 -------- backup_vaultwarden/.gitignore | 1 + 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 backup_vaultwarden/.env create mode 100644 backup_vaultwarden/.gitignore diff --git a/backup_vaultwarden/.env b/backup_vaultwarden/.env deleted file mode 100644 index 658d115..0000000 --- a/backup_vaultwarden/.env +++ /dev/null @@ -1,8 +0,0 @@ -WEBHOOK_URL="https://discord.com/api/webhooks/1478503102888935506/YCtJM09QZiKNMiCe5u7vCQb52VcLjHAd9wwEsKNltlJVcy7sKvoMTOJkvEKOOrk-Wpkh" -REMOTE_USER="malio-b" -REMOTE_HOST="chat.malio-dev.fr" -REMOTE_DIR="/home/malio-b/backups/bitwarden" -SSH_KEY="/home/matt/.ssh/id_ed25519_bitwarden" -SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10) -DATA_DIR="/home/matt/vaultwarden/data" -LOCAL_BACKUP="/home/matt/vaultwarden/$BACKUP_NAME" diff --git a/backup_vaultwarden/.gitignore b/backup_vaultwarden/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/backup_vaultwarden/.gitignore @@ -0,0 +1 @@ + -- 2.39.5 From 24c935c2804dfd2a0772be65219f13b605df1bb0 Mon Sep 17 00:00:00 2001 From: "sebastien.roy" Date: Fri, 6 Mar 2026 09:09:08 +0100 Subject: [PATCH 6/9] gitignore et .env --- backup_vaultwarden/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backup_vaultwarden/.gitignore b/backup_vaultwarden/.gitignore index 8b13789..4c49bd7 100644 --- a/backup_vaultwarden/.gitignore +++ b/backup_vaultwarden/.gitignore @@ -1 +1 @@ - +.env -- 2.39.5 From 3de25dae4389c03097f86772fa98b2a79d99b5ba Mon Sep 17 00:00:00 2001 From: "sebastien.roy" Date: Fri, 6 Mar 2026 14:16:33 +0100 Subject: [PATCH 7/9] correction du script et readme --- backup_vaultwarden/.gitignore | 2 + backup_vaultwarden/README.md | 209 +++++++++++------------ backup_vaultwarden/backup-vaultwarden.sh | 139 ++++++++++----- backup_vaultwarden/backup.log | 5 - 4 files changed, 194 insertions(+), 161 deletions(-) delete mode 100644 backup_vaultwarden/backup.log diff --git a/backup_vaultwarden/.gitignore b/backup_vaultwarden/.gitignore index 4c49bd7..8814d50 100644 --- a/backup_vaultwarden/.gitignore +++ b/backup_vaultwarden/.gitignore @@ -1 +1,3 @@ .env + +backup.log diff --git a/backup_vaultwarden/README.md b/backup_vaultwarden/README.md index ee8d3f6..e7edffb 100644 --- a/backup_vaultwarden/README.md +++ b/backup_vaultwarden/README.md @@ -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. -################################################################################################## -COMPRESSION DES DONNÉES -################################################################################################## +## INITIALISATION DES VARIABLES DE MANIÈRE SÉCURISÉ -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 : - - DATE=$(date +%F) - BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz" - -Cela permet d’avoir des sauvegardes facilement identifiables. - - -################################################################################################## -TRANSFERT VERS LE SERVEUR DE BACKUP -################################################################################################## - -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. - -Exemple: scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" - -Cette clé SSH est générée sur la machine de backup et autorisée sur la machine Vaultwarden. - - -################################################################################################## -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. - -Exemple d'envoi de message: - - curl -fsS -H "Content-Type: application/json" \ - -d "{\"content\":\"$msg\"}" \ - "$DISCORD_WEBHOOK_URL" - -Le message indique: - --si la sauvegarde a réussi 🟢 --si elle a échoué 🔴 --le nom du backup --les détails de l’erreur si nécessaire - - -################################################################################################## -PLANIFICATION AVEC CRON -################################################################################################## - -Le script est exécuté automatiquement chaque jour grâce à cron. - -Configuration: crontab -e - -Puis : 0 19 * * * /home/matt/vaultwarden/scripts/backup-vaultwarden.sh >> /home/matt/ vaultwarden/scripts/backup.log 2>&1 - -Signification: - -0 19 * * * -│ │ │ │ │ -│ │ │ │ └── tous les jours de la semaine -│ │ │ └──── tous les mois -│ │ └────── tous les jours du mois -│ └──────── 19h -└────────── minute 0 - -Tous les jours à 19h, le script est exécuté. -Les logs sont enregistrés dans : backup.log -Cela permet d’analyser les erreurs si un problème survient. - - -################################################################################################## -SÉCURITÉ AVEC LE FICHIER .ENV -################################################################################################## - -Les informations sensibles ne sont pas stockées directement dans le script. -Elles sont placées dans un fichier .env - -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-) +2. on recupere les varibales dans le script +```bash +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" +- 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: --d’améliorer la sécurité --d’éviter de modifier le script si un paramètre change +- d’améliorer la sécurité +- d’éviter de modifier le script si un paramètre change +## RÉCUPÉRATION DES DONNÉES -################################################################################################## -NETTOYAGE -################################################################################################## +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")" +``` -Une fois la sauvegarde envoyée sur la machine distante, le fichier temporaire est supprimé: +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. - [rm -f "$LOCAL_BACKUP"] +Cette clé SSH est générée sur la machine de backup et autorisée sur la machine Vaultwarden. + +## 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. + +1. on défini le message +```bash +local msg="**@here Backup Vaultwarden $color**\n" +msg+="Backup: ${BACKUP_NAME}\n" +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: + +- si la sauvegarde a réussi 🟢 +- si elle a échoué 🔴 +- le nom du backup +- les détails de l’erreur si nécessaire + +## PLANIFICATION AVEC CRON + +Le script est exécuté automatiquement chaque jour grâce à cron. + +1. Ouvrez le crontab pour l'édition : + ```bash + 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: + +0 19 * * * +│ │ │ │ │ +│ │ │ │ └── tous les jours de la semaine +│ │ │ └──── tous les mois +│ │ └────── tous les jours du mois +│ └──────── 19h +└────────── minute 0 + +Tous les jours à 19h, le script est exécuté et les logs sont enregistrés dans backup.log ce qui permet d’analyser les erreurs si un problème survient. + +## NETTOYAGE + +Une fois la sauvegarde envoyée sur la machine distante, le fichier temporaire est supprimé : + +```bash +rm -f "$LOCAL_BACKUP" +``` 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 : --sauvegarde du dossier data --compression et datation --transfert sécurisé via SSH --notification Discord --exécution automatique avec cron --sécurisation des paramètres via .env +- sauvegarde du dossier data +- compression et datation +- transfert sécurisé via SSH +- notification Discord +- exécution automatique avec cron +- sécurisation des paramètres via .env Cela permet d’avoir une sauvegarde quotidienne fiable et surveillée. - - -################################################################################################## - diff --git a/backup_vaultwarden/backup-vaultwarden.sh b/backup_vaultwarden/backup-vaultwarden.sh index 3382a22..5f92a05 100755 --- a/backup_vaultwarden/backup-vaultwarden.sh +++ b/backup_vaultwarden/backup-vaultwarden.sh @@ -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() { - local success="$1" - local details="$2" +mkdir -p "$(dirname "$LOG_FILE")" +touch "$LOG_FILE" - [[ -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 +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 +%F) -BACKUP_NAME="vaultwarden-backup-$DATE.tar.gz" +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}" -DATA_DIR=$(grep -E '^DATA_DIR=' .env | cut -d '=' -f2-) -LOCAL_BACKUP=$(grep -E '^LOCAL_BACKUP=' .env | cut -d '=' -f2-) +SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10) -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")" +mkdir -p "$LOCAL_BACKUP_DIR" ####################################### -# 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 - </dev/null || true +import json +print(json.dumps({"content": """$msg"""})) +PY +} + +####################################### +# Fonction erreur ####################################### fail() { local detail="$1" - echo "ERROR: $detail" >&2 + log "ERROR: $detail" discord_ping "false" "$detail" 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 ####################################### -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 ####################################### -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" - echo "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR" diff --git a/backup_vaultwarden/backup.log b/backup_vaultwarden/backup.log deleted file mode 100644 index f7bb504..0000000 --- a/backup_vaultwarden/backup.log +++ /dev/null @@ -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 -- 2.39.5 From ae2fa3509a6e9657887e9d62dee3a019a4a87420 Mon Sep 17 00:00:00 2001 From: Sebastien Roy Date: Fri, 6 Mar 2026 13:45:06 +0000 Subject: [PATCH 8/9] Actualiser backup_vaultwarden/README.md --- backup_vaultwarden/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backup_vaultwarden/README.md b/backup_vaultwarden/README.md index e7edffb..f9881fe 100644 --- a/backup_vaultwarden/README.md +++ b/backup_vaultwarden/README.md @@ -29,7 +29,7 @@ Cela permet: - d’améliorer la sécurité - d’éviter de modifier le script si un paramètre change -## RÉCUPÉRATION DES DONNÉES +## RÉCUPÉRATION DES DONNÉES 1. Le dossier data de Vaultwarden est dupliqué puis compressé afin de créer une archive : ```bash @@ -44,7 +44,7 @@ La sauvegarde est envoyée vers une machine dédiée grâce à SCP. Pour éviter 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. @@ -69,7 +69,7 @@ Le message indique: - le nom du backup - les détails de l’erreur si nécessaire -## PLANIFICATION AVEC CRON +## PLANIFICATION AVEC CRON Le script est exécuté automatiquement chaque jour grâce à cron. @@ -94,7 +94,7 @@ Signification: Tous les jours à 19h, le script est exécuté et les logs sont enregistrés dans backup.log ce qui permet d’analyser les erreurs si un problème survient. -## NETTOYAGE +## NETTOYAGE Une fois la sauvegarde envoyée sur la machine distante, le fichier temporaire est supprimé : @@ -104,7 +104,7 @@ rm -f "$LOCAL_BACKUP" 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 : -- 2.39.5 From 4464ab2642970b004847523a1886a05039af0d2d Mon Sep 17 00:00:00 2001 From: Sebastien Roy Date: Fri, 6 Mar 2026 13:50:14 +0000 Subject: [PATCH 9/9] Actualiser backup_vaultwarden/README.md --- backup_vaultwarden/README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/backup_vaultwarden/README.md b/backup_vaultwarden/README.md index f9881fe..f5795e1 100644 --- a/backup_vaultwarden/README.md +++ b/backup_vaultwarden/README.md @@ -84,13 +84,11 @@ Le script est exécuté automatiquement chaque jour grâce à cron. Signification: -0 19 * * * -│ │ │ │ │ -│ │ │ │ └── tous les jours de la semaine -│ │ │ └──── tous les mois -│ │ └────── tous les jours du mois -│ └──────── 19h -└────────── minute 0 +- 0 minute 0 +- 19 19h +- * tous les jours du mois +- * tous les mois +- * tous les jours de la semaine Tous les jours à 19h, le script est exécuté et les logs sont enregistrés dans backup.log ce qui permet d’analyser les erreurs si un problème survient. -- 2.39.5