Files
Malio-ops/BackupVaultWarden/README.md
2026-03-19 11:04:57 +01:00

388 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# README — Mise en place du script de sauvegarde Vaultwarden
Ce script permet dautomatiser la sauvegarde de Vaultwarden afin de conserver une copie du dossier `data`, de la transférer vers un serveur distant et denvoyer une notification Discord en cas de succès ou déchec.
---
# 1. Objectif du script
Le script de sauvegarde Vaultwarden permet de :
- sauvegarder les données de Vaultwarden ;
- compresser larchive avec un nom daté ;
- transférer la sauvegarde vers un serveur distant ;
- envoyer une notification Discord ;
- automatiser lexécution via `cron`.
Ce mécanisme permet de sécuriser les mots de passe, les utilisateurs et la configuration stockés dans le dossier `data` de Vaultwarden.
---
# 2. Pré-requis
Avant de mettre en place le script, vérifier que les éléments suivants sont disponibles sur la machine Vaultwarden :
- `bash`
- `tar`
- `scp`
- `ssh`
- `curl`
- `cron`
- `jq`
Installation sur Debian / Ubuntu :
```bash
sudo apt update
sudo apt install -y tar openssh-client curl cron jq
````
---
# 3. Emplacement du script
Le script est situé dans :
```bash
/home/<USER>/Malio-ops/BackupVaultWarden/
```
Structure recommandée :
```bash
/home/<USER>/Malio-ops/BackupVaultWarden/
├── backup-vaultwarden.sh
├── .env
└── README.md
```
---
# 4. Configuration sécurisée avec le fichier .env
Les informations sensibles ne doivent pas être stockées directement dans le script.
Elles doivent être placées dans un fichier `.env`.
## Exemple de fichier `.env`
```bash
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
REMOTE_USER=<USER>
REMOTE_HOST=<IP_SERVEUR>
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 |
| --------------------- | -------------------------------------------------------------------- |
| 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` |
---
# 5. Chargement des variables dans le script
<details>
<summary style="list-style: none; cursor: pointer;">
<strong>EggMaster</strong>
</summary>
<details>
<summary style="list-style: none; cursor: pointer;">Question 2</summary>
Quel format minimal faut-il donner a `printf` pour afficher une chaine brute ?
</details>
<details>
<summary style="list-style: none; cursor: pointer;">Indice commande 2</summary>
```text
'%s'
```
</details>
<details>
<summary style="list-style: none; cursor: pointer;">Fragment 2</summary>
```text
xlIHBldGl0IHN0YWdpYWlyZSBtYXR0ZW8gZHVu
```
</details>
</details>
Le script charge directement le fichier `.env` avec `source` et exporte automatiquement les variables pendant le chargement.
Mécanisme utilisé :
```bash
set -a
source "$ENV_FILE"
set +a
```
Explication :
* `set -a` exporte automatiquement les variables définies ensuite
* `source "$ENV_FILE"` lit et exécute le contenu du fichier `.env` dans le shell courant
* `set +a` désactive ensuite l'export automatique
Cela permet :
* de charger toutes les variables du fichier `.env` en une seule fois
* de conserver la configuration en dehors du script
* de rester aligné avec le comportement réel du script
---
### 6. Connexion au serveur de sauvegarde (Machine IA)
Le transfert des sauvegardes utilise une **clé SSH** afin de permettre une connexion automatique au serveur distant sans mot de passe.
#### 1. Génération de la clé
Sur la machine exécutant les scripts :
```bash
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_backup.pub <USER>@<IP_SERVEUR>
```
Cette commande ajoute la clé dans :
```
~/.ssh/authorized_keys
```
sur la machine IA.
#### 3. Vérification de la connexion
```bash
ssh -i ~/.ssh/id_ed25519_backup -o StrictHostKeyChecking=yes <USER>@<IP_SERVEUR>
```
#### 4. Vérification des fichiers de clé
```bash
ls ~/.ssh/id_ed25519_backup*
```
Fichiers attendus :
```
~/.ssh/id_ed25519_backup
~/.ssh/id_ed25519_backup.pub
```
#### 5. Permissions SSH
Machine locale :
```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_backup
chmod 644 ~/.ssh/id_ed25519_backup.pub
```
Machine distante :
```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
#### 6. Provisionnement de `known_hosts`
Le script est prévu pour fonctionner avec validation stricte des hôtes SSH.
```bash
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.
# 7. Sauvegarde des données Vaultwarden
Le script crée une archive compressée du dossier `data` :
```bash
tar -czf "$LOCAL_BACKUP_FILE" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"
```
Cela permet dobtenir une sauvegarde portable et compressée.
---
# 8. Transfert vers le serveur distant
Une fois larchive créée :
```bash
scp "${SCP_OPTS[@]}" "$LOCAL_BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
```
Le fichier est envoyé vers le serveur de sauvegarde via SCP.
---
# 9. Notification Discord
Le script envoie une notification Discord pour informer de l'etat de la sauvegarde.
Construction du message :
```bash
msg="**${ping}Backup Vaultwarden ${icon}**\n"
msg+="Backup: ${BACKUP_NAME}\n"
msg+="Data transfer: ${status_line}\n"
[[ -n "$details" ]] && msg+="Détails: ${details}"
```
Envoi du message :
```bash
payload="$(jq -n --arg content "$msg" '{content: $content}')"
curl -fsS -H "Content-Type: application/json" -d "$payload" "$DISCORD_WEBHOOK_URL"
```
Le message indique :
* si la sauvegarde a réussi
* si elle a échoué
* le nom du backup
* les détails de lerreur
---
# 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.
Ouvrir le crontab :
```bash
crontab -e
```
Ajouter :
```bash
0 19 * * * /home/<USER>/Malio-ops/BackupVaultWarden/backup-vaultwarden.sh 2>&1
```
Signification :
| Champ | Valeur |
| ------------ | ------ |
| minute | 0 |
| heure | 19 |
| jour du mois | * |
| mois | * |
| jour semaine | * |
Le script sexécute donc **tous les jours à 19h00**.
---
# 12. Nettoyage
Une fois la sauvegarde transférée :
```bash
rm -f "$LOCAL_BACKUP_FILE"
```
Cela évite de remplir le disque de la machine Vaultwarden.
---
# 13. Test manuel
Avant de mettre le script en cron, tester :
```bash
bash /home/<USER>/Malio-ops/BackupVaultWarden/backup-vaultwarden.sh
```
---
# 14. Vérification des logs
Logs :
```bash
cat /var/log/vaultwarden_backup.log
```
---
# 15. Résumé
Le script automatise :
* la sauvegarde du dossier `data`
* la compression et la datation du backup
* le transfert sécurisé via SSH
* la notification Discord
* lexécution automatique via cron
* la configuration sécurisée via `.env`
Ce système permet dobtenir **une sauvegarde fiable, centralisée et surveillée de Vaultwarden**.