388 lines
8.7 KiB
Markdown
388 lines
8.7 KiB
Markdown
# README — Mise en place du script de sauvegarde Vaultwarden
|
||
|
||
Ce script permet d’automatiser la sauvegarde de Vaultwarden afin de conserver une copie du dossier `data`, de la transférer vers un serveur distant et d’envoyer 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 l’archive avec un nom daté ;
|
||
- transférer la sauvegarde vers un serveur distant ;
|
||
- envoyer une notification Discord ;
|
||
- automatiser l’exé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 d’obtenir une sauvegarde portable et compressée.
|
||
|
||
---
|
||
|
||
# 8. Transfert vers le serveur distant
|
||
|
||
Une fois l’archive 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 l’erreur
|
||
|
||
---
|
||
|
||
# 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 s’exé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
|
||
* l’exécution automatique via cron
|
||
* la configuration sécurisée via `.env`
|
||
|
||
Ce système permet d’obtenir **une sauvegarde fiable, centralisée et surveillée de Vaultwarden**.
|
||
|