Pour avoir connu le tragique incendie d’OVH en 2021, je sais ce que ça fait de perdre tout son boulot quand on n’a pas mis en place de backup vers un serveur tiers.
Bon pour le coup, les dégâts étaient limités car je n’avais pas pris ces précautions pour mon travail personnel (recherches / wiki etc.) mais en revanche je les avais bien prises pour les sites de mes clients. Aucune répercussion sérieuse sur l’activité…
N’empêche que si j’avais mis en place un backup automatisé de mes scripts & lab de test, j’aurais pu ne pas perdre toute l’infra que j’avais monté sur Proxmox :-°
Du coup je vous propose un petit script shell de backup qui compressera votre dossier et l’enverra vers votre bucket Amazon S3
#!/bin/bash
# Utilisation de set -e pour quitter en cas d'erreur
set -e
# Utilisation de set -u pour quitter si des variables non définies sont utilisées
set -u
# Définition des constantes
readonly SCRIPT_NAME=$(basename "$0")
readonly BUCKET_NAME="mon-bucket-s3"
# Fonction pour afficher l'aide
usage() {
echo "Usage: $SCRIPT_NAME [-h] [-d directory]"
echo " -h Afficher l'aide"
echo " -d directory Spécifier le répertoire à sauvegarder"
exit 1
}
# Vérification des dépendances
command -v aws >/dev/null 2>&1 || { echo "aws-cli est requis mais n'est pas installé. Abandon."; exit 1; }
# Traitement des options
while getopts "hd:" opt; do
case $opt in
h)
usage
;;
d)
directory=$OPTARG
;;
*)
echo "Option invalide: -$OPTARG" >&2
usage
;;
esac
done
# Vérification si le répertoire est spécifié
if [[ -z "${directory:-}" ]]; then
echo "Erreur : Répertoire non spécifié."
usage
fi
# Vérification si le répertoire existe
if [[ ! -d "$directory" ]]; then
echo "Erreur : Le répertoire spécifié n'existe pas."
exit 1
fi
# Création d'un nom de fichier de sauvegarde unique basé sur la date et l'heure
backup_filename=$(date +"%Y%m%d%H%M%S").tar.gz
# Fonction pour effectuer la sauvegarde
backup_directory() {
# Archivage et compression du répertoire
tar -czf "$backup_filename" "$directory"
# Transfert du fichier de sauvegarde vers Amazon S3
aws s3 cp "$backup_filename" "s3://$BUCKET_NAME/"
# Suppression du fichier de sauvegarde local
rm -f "$backup_filename"
}
# Appel de la fonction de sauvegarde
backup_directory
# Message de succès
echo "Sauvegarde de $directory effectuée avec succès dans s3://$BUCKET_NAME/"
Utilisation
Rendez le script exécutable avec la commande suivante :
chmod +x backup_script.sh
Exécutez le script avec l’option -d pour spécifier le répertoire à sauvegarder.
Exemple : sauvegarder le répertoire « test » présent dans /tmp :
./backup_script.sh -d /tmp/test
Dans cette commande, -d est l’option que le script utilise pour accepter le chemin du répertoire à sauvegarder, et /tmp/tutos est la valeur que vous donnez à cette option. Le script archive ensuite le répertoire spécifié et le télécharge dans votre bucket Amazon S3.
Notez que le script doit avoir les permissions nécessaires pour lire le contenu du répertoire /tmp/tutos et écrire dans le répertoire où il est exécuté, car il crée temporairement un fichier d’archive avant de le télécharger sur Amazon S3.
Pour automatiser l’envoi du fichier avec une tâche cron, vous devrez suivre les étapes ci-dessous :
- Ouvrez le fichier crontab : Ouvrez le fichier crontab pour éditer les tâches programmées en utilisant la commande suivante :
crontab -e
- Ajoutez une entrée pour votre script : À la fin du fichier, ajoutez une nouvelle ligne pour votre script. Par exemple, pour exécuter votre script tous les jours à 2 heures du matin, vous pouvez ajouter la ligne suivante :
0 2 * * * /chemin/vers/votre/backup_script.sh -d /tmp/tutos
Remplacez /chemin/vers/votre/backup_script.sh par le chemin complet vers votre script.
La syntaxe de cette ligne est la suivante :
- 0 2 * * * : spécifie l’horaire. Dans ce cas, il est configuré pour exécuter la tâche à 2 heures du matin tous les jours.
- /chemin/vers/votre/backup_script.sh -d /tmp/tutos : est la commande à exécuter.
- Sauvegardez et quittez l’éditeur : Sauvegardez le fichier et quittez l’éditeur (la façon de faire dépendra de l’éditeur que vous utilisez, par exemple en appuyant sur CTRL + X puis Y et enfin Enter si vous utilisez nano).
- Vérifiez votre crontab : Vous pouvez vérifier que votre nouvelle tâche est correctement enregistrée en listant toutes vos tâches cron avec la commande suivante :
crontab -l
Informations complémentaires
- Les options -h (pour afficher l’aide) et -d (pour spécifier le répertoire à sauvegarder) sont traitées à l’aide de getopts.
- Les vérifications sont effectuées pour s’assurer que le CLI AWS est installé et que le répertoire spécifié existe.
- Une fonction backup_directory est définie pour archiver et compresser le répertoire, puis pour transférer le fichier de sauvegarde vers Amazon S3.
- Le script utilise set -e et set -u pour gérer les erreurs de manière appropriée.
- Les variables et les fonctions sont nommées de manière descriptive.
- La constante BUCKET_NAME est définie en utilisant readonly pour stocker le nom du bucket S3.