fix : changelog plus readme a jour
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 d’obtenir une sauvegarde portable et compressée.
|
||||
@@ -200,7 +222,7 @@ Cela permet d’obtenir une sauvegarde portable et compressée.
|
||||
Une fois l’archive 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 s’exé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 :
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user