fix : changelog plus readme a jour

This commit is contained in:
2026-03-18 21:24:30 +01:00
parent fac2a5b47f
commit 7b91691ef8
23 changed files with 653 additions and 278 deletions

View File

@@ -33,4 +33,23 @@ REMOTE_DIR=
#############################################
# Chemin vers la clé privée SSH utilisée pour la connexion
SSH_KEY=
SSH_KEY=
# Port SSH du serveur distant
BACKUP_REMOTE_SSH_PORT=22
# Timeout SSH en secondes
SSH_CONNECT_TIMEOUT=10
# Validation stricte des clés hôtes SSH (yes/no)
BACKUP_KNOWN_HOSTS_STRICT=yes
# Fichier known_hosts utilisé par ssh/scp
BACKUP_KNOWN_HOSTS_FILE=/root/.ssh/known_hosts
#############################################
# ROTATION DES BACKUPS
#############################################
# Nombre de jours de conservation des sauvegardes
# BACKUP_RETENTION_DAYS=10

View File

@@ -28,12 +28,13 @@ Avant de mettre en place le script, vérifier que les éléments suivants sont d
- `ssh`
- `curl`
- `cron`
- `jq`
Installation sur Debian / Ubuntu :
```bash
sudo apt update
sudo apt install -y tar openssh-client curl cron
sudo apt install -y tar openssh-client curl cron jq
````
---
@@ -43,13 +44,13 @@ sudo apt install -y tar openssh-client curl cron
Le script est situé dans :
```bash
/home/matt/vaultwarden/Malio-ops/BackupVaultWarden/
/home/<USER>/Malio-ops/BackupVaultWarden/
```
Structure recommandée :
```bash
/home/matt/vaultwarden/Malio-ops/BackupVaultWarden/
/home/<USER>/Malio-ops/BackupVaultWarden/
├── backup-vaultwarden.sh
├── .env
└── README.md
@@ -65,24 +66,36 @@ Elles doivent être placées dans un fichier `.env`.
## Exemple de fichier `.env`
```bash
WEBHOOK_URL=https://discord.com/api/webhooks/...
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
REMOTE_USER=<USER>
REMOTE_HOST=<IP_SERVEUR>
SSH_KEY=/home/matt/.ssh/id_ed25519_vaultwarden_backup
SSH_KEY=/home/<USER>/.ssh/id_ed25519_backup
DATA_DIR=/opt/vaultwarden/data
LOCAL_BACKUP=/var/backups/vaultwarden
REMOTE_DIR=/home/backup/backups/vaultwarden
# BACKUP_REMOTE_SSH_PORT=22
# SSH_CONNECT_TIMEOUT=10
# BACKUP_KNOWN_HOSTS_STRICT=yes
# BACKUP_KNOWN_HOSTS_FILE=/root/.ssh/known_hosts
# BACKUP_RETENTION_DAYS=10
```
## Description des variables
| Variable | Description |
| ----------- | ------------------------------------------------------ |
| WEBHOOK_URL | Webhook Discord pour les notifications |
| REMOTE_USER | Utilisateur du serveur distant |
| REMOTE_HOST | Adresse IP ou DNS du serveur de sauvegarde |
| SSH_KEY | Chemin vers la clé SSH utilisée pour le transfert |
| DATA_DIR | Dossier `data` de Vaultwarden |
| REMOTE_DIR | Dossier de stockage des backups sur le serveur distant |
| Variable | Description |
| --------------------- | -------------------------------------------------------------------- |
| DISCORD_WEBHOOK_URL | Webhook Discord pour les notifications |
| REMOTE_USER | Utilisateur du serveur distant |
| REMOTE_HOST | Adresse IP ou DNS du serveur de sauvegarde |
| SSH_KEY | Chemin vers la clé SSH utilisée pour le transfert |
| DATA_DIR | Dossier `data` de Vaultwarden |
| LOCAL_BACKUP | Dossier local où stocker temporairement l'archive |
| REMOTE_DIR | Dossier de stockage des backups sur le serveur distant |
| BACKUP_REMOTE_SSH_PORT | Port SSH du serveur distant, optionnel, défaut `22` |
| SSH_CONNECT_TIMEOUT | Timeout SSH en secondes, optionnel, défaut `10` |
| BACKUP_KNOWN_HOSTS_STRICT | Validation stricte des hôtes SSH (`yes`/`no`) |
| BACKUP_KNOWN_HOSTS_FILE | Fichier `known_hosts` utilisé par `ssh`/`scp` |
| BACKUP_RETENTION_DAYS | Nombre de jours de conservation distante, optionnel, défaut `10` |
---
@@ -121,13 +134,13 @@ Le transfert des sauvegardes utilise une **clé SSH** afin de permettre une conn
Sur la machine exécutant les scripts :
```bash
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_bitwarden
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_backup
```
#### 2. Copie de la clé vers le serveur distant
```bash
ssh-copy-id -i ~/.ssh/id_ed25519_bitwarden.pub <USER>@<IP_SERVEUR>
ssh-copy-id -i ~/.ssh/id_ed25519_backup.pub <USER>@<IP_SERVEUR>
```
Cette commande ajoute la clé dans :
@@ -141,20 +154,20 @@ sur la machine IA.
#### 3. Vérification de la connexion
```bash
ssh -i ~/.ssh/id_ed25519_bitwarden backup@192.168.0.179
ssh -i ~/.ssh/id_ed25519_backup -o StrictHostKeyChecking=yes <USER>@<IP_SERVEUR>
```
#### 4. Vérification des fichiers de clé
```bash
ls ~/.ssh/id_ed25519_bitwarden*
ls ~/.ssh/id_ed25519_backup*
```
Fichiers attendus :
```
~/.ssh/id_ed25519_bitwarden
~/.ssh/id_ed25519_bitwarden.pub
~/.ssh/id_ed25519_backup
~/.ssh/id_ed25519_backup.pub
```
#### 5. Permissions SSH
@@ -163,8 +176,8 @@ Machine locale :
```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_bitwarden
chmod 644 ~/.ssh/id_ed25519_bitwarden.pub
chmod 600 ~/.ssh/id_ed25519_backup
chmod 644 ~/.ssh/id_ed25519_backup.pub
```
Machine distante :
@@ -174,10 +187,19 @@ chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
#### 6. Déclaration dans `.env`
#### 6. Provisionnement de `known_hosts`
Le script est prévu pour fonctionner avec validation stricte des hôtes SSH.
```bash
SSH_KEY=/home/matt/.ssh/id_ed25519_bitwarden
ssh-keyscan -H <IP_SERVEUR> >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/known_hosts
```
#### 7. Déclaration dans `.env`
```bash
SSH_KEY=/home/<USER>/.ssh/id_ed25519_backup
```
Cette clé sera utilisée automatiquement par les scripts (`scp` / `ssh`) pour transférer les sauvegardes.
@@ -188,7 +210,7 @@ Cette clé sera utilisée automatiquement par les scripts (`scp` / `ssh`) pour t
Le script crée une archive compressée du dossier `data` :
```bash
tar -czf "$LOCAL_BACKUP" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"
tar -czf "$LOCAL_BACKUP_FILE" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"
```
Cela permet dobtenir une sauvegarde portable et compressée.
@@ -200,7 +222,7 @@ Cela permet dobtenir une sauvegarde portable et compressée.
Une fois larchive créée :
```bash
scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
scp "${SCP_OPTS[@]}" "$LOCAL_BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
```
Le fichier est envoyé vers le serveur de sauvegarde via SCP.
@@ -209,23 +231,22 @@ Le fichier est envoyé vers le serveur de sauvegarde via SCP.
# 9. Notification Discord
Le script envoie une notification Discord pour informer de l’état de la sauvegarde.
Le script envoie une notification Discord pour informer de l'etat de la sauvegarde.
Construction du message :
```bash
local msg="**@here Backup Vaultwarden $color**\n"
msg="**${ping}Backup Vaultwarden ${icon}**\n"
msg+="Backup: ${BACKUP_NAME}\n"
msg+="Data transfer: $dumps_display\n"
[[ -n "$details" ]] && msg+="Details: $details"
msg+="Data transfer: ${status_line}\n"
[[ -n "$details" ]] && msg+="Détails: ${details}"
```
Envoi du message :
```bash
curl -fsS -H "Content-Type: application/json" \
-d "{\"content\":\"$msg\"}" \
"$WEBHOOK_URL"
payload="$(jq -n --arg content "$msg" '{content: $content}')"
curl -fsS -H "Content-Type: application/json" -d "$payload" "$DISCORD_WEBHOOK_URL"
```
Le message indique :
@@ -237,7 +258,27 @@ Le message indique :
---
# 10. Planification avec cron
# 10. Rotation distante des sauvegardes
Le script supprime les archives distantes plus anciennes que la durée de retention configurée.
Configuration dans `.env` :
```bash
# BACKUP_RETENTION_DAYS=10
```
Commande utilisée :
```bash
find "$REMOTE_DIR" -type f -name 'vaultwarden-backup-*.tar.gz' -mtime +$RETENTION_DAYS -delete
```
Si la variable n'est pas définie, le script utilise `10` jours par défaut.
---
# 11. Planification avec cron
Le script est exécuté automatiquement tous les jours à 19h.
@@ -250,7 +291,7 @@ crontab -e
Ajouter :
```bash
0 19 * * * /home/matt/vaultwarden/Malio-ops/BackupVaultWarden/backup-vaultwarden.sh >> /var/log/vaultwarden_backup.log 2>&1
0 19 * * * /home/<USER>/Malio-ops/BackupVaultWarden/backup-vaultwarden.sh >> /var/log/vaultwarden_backup.log 2>&1
```
Signification :
@@ -267,29 +308,29 @@ Le script sexécute donc **tous les jours à 19h00**.
---
# 11. Nettoyage
# 12. Nettoyage
Une fois la sauvegarde transférée :
```bash
rm -f "$LOCAL_BACKUP"
rm -f "$LOCAL_BACKUP_FILE"
```
Cela évite de remplir le disque de la machine Vaultwarden.
---
# 12. Test manuel
# 13. Test manuel
Avant de mettre le script en cron, tester :
```bash
bash /home/matt/vaultwarden/Malio-ops/BackupVaultWarden/backup-vaultwarden.sh
bash /home/<USER>/Malio-ops/BackupVaultWarden/backup-vaultwarden.sh
```
---
# 13. Vérification des logs
# 14. Vérification des logs
Logs :
@@ -299,7 +340,7 @@ cat /var/log/vaultwarden_backup.log
---
# 14. Résumé
# 15. Résumé
Le script automatise :

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash
set -euo pipefail
umask 077
#######################################
# Chemins fixes du script
@@ -27,6 +28,7 @@ log() {
# Chargement du .env
#######################################
set -a
# shellcheck disable=SC1090
source "$ENV_FILE"
set +a
@@ -40,6 +42,10 @@ set +a
: "${REMOTE_HOST:?Variable REMOTE_HOST manquante dans .env}"
: "${REMOTE_DIR:?Variable REMOTE_DIR manquante dans .env}"
: "${SSH_KEY:?Variable SSH_KEY manquante dans .env}"
: "${BACKUP_REMOTE_SSH_PORT:=22}"
: "${SSH_CONNECT_TIMEOUT:=10}"
: "${BACKUP_KNOWN_HOSTS_STRICT:=yes}"
: "${BACKUP_KNOWN_HOSTS_FILE:=${HOME}/.ssh/known_hosts}"
#######################################
# Variables backup
@@ -50,7 +56,53 @@ BACKUP_NAME="${BACKUP_PREFIX}-${DATE}.tar.gz"
LOCAL_BACKUP_FILE="${LOCAL_BACKUP}/${BACKUP_NAME}"
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-10}"
SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10)
[[ "$BACKUP_REMOTE_SSH_PORT" =~ ^[0-9]+$ ]] || {
echo "ERROR: Variable BACKUP_REMOTE_SSH_PORT invalide dans .env" >&2
exit 1
}
[[ "$SSH_CONNECT_TIMEOUT" =~ ^[0-9]+$ ]] || {
echo "ERROR: Variable SSH_CONNECT_TIMEOUT invalide dans .env" >&2
exit 1
}
[[ "$RETENTION_DAYS" =~ ^[0-9]+$ ]] || {
echo "ERROR: Variable BACKUP_RETENTION_DAYS invalide dans .env" >&2
exit 1
}
case "${BACKUP_KNOWN_HOSTS_STRICT,,}" in
yes|y|oui|o|true|1) BACKUP_KNOWN_HOSTS_STRICT="yes" ;;
no|n|non|false|0) BACKUP_KNOWN_HOSTS_STRICT="no" ;;
*)
echo "ERROR: Variable BACKUP_KNOWN_HOSTS_STRICT invalide dans .env" >&2
exit 1
;;
esac
mkdir -p "$(dirname "$BACKUP_KNOWN_HOSTS_FILE")"
chmod 700 "$(dirname "$BACKUP_KNOWN_HOSTS_FILE")" || true
touch "$BACKUP_KNOWN_HOSTS_FILE"
chmod 600 "$BACKUP_KNOWN_HOSTS_FILE" || true
SSH_OPTS=(
-i "$SSH_KEY"
-p "$BACKUP_REMOTE_SSH_PORT"
-o IdentitiesOnly=yes
-o BatchMode=yes
-o ConnectTimeout="$SSH_CONNECT_TIMEOUT"
-o StrictHostKeyChecking="$BACKUP_KNOWN_HOSTS_STRICT"
-o UserKnownHostsFile="$BACKUP_KNOWN_HOSTS_FILE"
)
SCP_OPTS=(
-i "$SSH_KEY"
-P "$BACKUP_REMOTE_SSH_PORT"
-o IdentitiesOnly=yes
-o BatchMode=yes
-o ConnectTimeout="$SSH_CONNECT_TIMEOUT"
-o StrictHostKeyChecking="$BACKUP_KNOWN_HOSTS_STRICT"
-o UserKnownHostsFile="$BACKUP_KNOWN_HOSTS_FILE"
)
mkdir -p "$LOCAL_BACKUP"
@@ -95,11 +147,22 @@ fail() {
exit 1
}
require_cmd() {
command -v "$1" >/dev/null 2>&1 || fail "commande requise absente : $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"
[[ -r "$SSH_KEY" ]] || fail "La clé SSH est non lisible : $SSH_KEY"
[[ ! -L "$SSH_KEY" ]] || fail "La clé SSH ne doit pas être un lien symbolique : $SSH_KEY"
chmod 600 "$SSH_KEY" || true
for cmd in tar ssh scp jq curl find; do
require_cmd "$cmd"
done
log "Début du backup Vaultwarden"
log "Source : $DATA_DIR"
@@ -123,7 +186,7 @@ ssh "${SSH_OPTS[@]}" "$REMOTE_USER@$REMOTE_HOST" "mkdir -p '$REMOTE_DIR'" \
#######################################
# Envoi du backup
#######################################
scp "${SSH_OPTS[@]}" "$LOCAL_BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" \
scp "${SCP_OPTS[@]}" "$LOCAL_BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" \
|| fail "Erreur lors de l'envoi du backup vers $REMOTE_HOST"
log "Backup envoyé sur $REMOTE_HOST:$REMOTE_DIR"
@@ -147,4 +210,4 @@ rm -f "$LOCAL_BACKUP_FILE" || fail "Impossible de supprimer le backup local $LOC
#######################################
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"
echo "Backup $BACKUP_NAME terminé et envoyé sur $REMOTE_HOST:$REMOTE_DIR"