correction du script et readme
This commit is contained in:
2
backup_vaultwarden/.gitignore
vendored
2
backup_vaultwarden/.gitignore
vendored
@@ -1 +1,3 @@
|
|||||||
.env
|
.env
|
||||||
|
|
||||||
|
backup.log
|
||||||
|
|||||||
@@ -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 d’avoir 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:
|
||||||
|
|
||||||
##################################################################################################
|
- d’amé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 l’erreur si nécessaire
|
- 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.
|
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 d’analyser les erreurs si un problème survient.
|
||||||
Les logs sont enregistrés dans : backup.log
|
|
||||||
Cela 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é :
|
||||||
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:
|
|
||||||
|
|
||||||
-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.
|
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 d’avoir une sauvegarde quotidienne fiable et surveillée.
|
Cela permet d’avoir une sauvegarde quotidienne fiable et surveillée.
|
||||||
|
|
||||||
|
|
||||||
##################################################################################################
|
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
|
||||||
Reference in New Issue
Block a user