Les sauvegardes, un sujet important. Il suffit d'avoir vécu une perte de données pour ne plus jamais les négliger.
Aujourd'hui je libère les sources du script que j'ai écrit pour sauvegarder Blogmotion. Voici comment sauvegarder votre blog.
Télécharger le script
Le script est disponible sur ce dépôt GitHub :
▶️ https://github.com/blogmotion/bm-backup-ssh
Vous y trouverez également quelques informations sur ce script.
Compatibilité
J'utilise ce script chez l'hébergeur Web4all (devenu YulPa) qui propose un accès SSH sur mon hébergement mutualisé. Renseignez-vous auprès de votre hébergeur, il est parfois nécessaire que des commandes (binaires) soit ajoutées.
Si vous avez un dédié alors ce script fonctionnera nativement.
Rôle du script
Le script génère :
- une sauvegarde des données (data)
- une sauvegarde MySQL (ou mariaDB)
Exemple avec un backup LIVE :
- 2015-05-10_backup-bm_data.tar.gz
- 2015-05-15_backup-bm_mysql.gz
Avec un backup MENSUEL :
- 2015-05-10_backup-bm_data__MENSUEL.tar.gz
- 2015-05-15_backup-bm_mysql__MENSUEL.gz
Attention : le script supprime les sauvegardes précédentes avant d'en créer une nouvelle, pour des questions d'espace disque. En effet j'utilise ce script directement sur le serveur W4A, puis mon NAS Synology vient chercher ces sauvegardes et les suppriment du serveur Web4all (je ferai un autre billet pour ça).
Voici un exemple d'exécution en terminal :
Le script affiche les deux sauvegardes produites ainsi que leur taille respective (oui la sauvegarde de BM pèse 258 mo grâce à la compression). Dans mon cas l'exécution dure environ 6 minutes, cela peut paraître long mais face aux 8 ans de contenu du blog, pas tant que ça.
Exécution
Au moment de l'exécution du script il faut choisir le type de sauvegarde : LIVE, HEBDO, MENSUEL. Ce type n'a aucune influence sur le contenu de la sauvegarde, elle sera identique dans les 3 modes. J'ai simplement ajouté ceci pour que les noms des fichiers soient plus parlants et utilisable avec CRON.
Exemple d'utilisation avec CRON, on lance un backup mensuel chaque premier jour du mois à 2h10 :
10 2 1 * * /home/xhark/backup-bm-ssh.sh MENSUEL
Variables
Vous devez modifier quelques variables dans le script.
Le nom de votre site qui apparaîtra dans les fichiers générés (sans espace!):
SITENAME="bm"
Les informations de connexion à la base de données :
usersql="mon_utilisateur" mdpsql="xxxxxxxxx" hostsql="localhost" basesql="ma_base"
Le chemin du site (SRC_BACKUP) et le répertoire de destination des sauvegardes (DST_BACKUP) :
SRC_BACKUP="/var/www/monsite" DST_BACKUP="/var/backup"
Attention à ne pas définir la destination dans un sous-répertoire de la source, sinon ça va boucler car le script va sauvegarder le contenu des sauvegardes qu'il est en train de produire.
Exclusion de répertoire (cache WordPress par exemple) :
--exclude '${DST_BACKUP}' \ --exclude '/var/www/html/wp-content/backup' \ --exclude '/var/www/html/wp-content/cache' \ --exclude '/var/www/html/un_repertoire_a_exclure'
Attention à la destination
Je vous conseille chaudement de définir un chemin de destination qui ne soit pas accessible via votre site, c'est à dire un cran au dessus du répertoire racine (www, htdocs ou html). Ce serait dommage que Google vienne indexer ça, ou que quelqu'un puisse téléchargement votre backup.
FAQ
- Est-ce normal d'avoir le message "rm: cannot remove" ? Oui, je ne l'ai volontairement pas masqué de façon à savoir si un ancien backup trainait ou non.
- Est-ce normal d'avoir le message "tar: Removing leading `/' from member names" ? Oui.
- C'est rose chez moi ! C'est volontaire, afin de distinguer l'exécution du script du reste du terminal, on peut ainsi voir de loin sur un écran que le script a fini.
- Comment interrompre le script ? ctrl+C ou ctrl+Z dans votre terminal
- J'ai interrompu le script, puis-je le relancer ? Oui, sans problème.
- Cela ralentit l'accès à mon site, que faire ? Vous pouvez exécuter le script avec la commande nice en +19
- L'exécution du script prend beaucoup de temps. Pensez à exclure des répertoires s'ils sont trop volumineux.
- Comment récupérer un seul fichier ? Ouvrez l'archivez avec 7zip
- Puis-je modifier le script ? Oui, tant que vous respectez la licence Creative Commons BY-ND
Mise à jour 03/2022 : si vous obtenez cette erreur :
tar: The following options were used after non-optional arguments in archive create or update mode. These options are positional and affect only arguments that follow them. Please, rearrange them properly. tar: --exclude '/chemin/dossier' has no effect tar: Exiting with failure status due to previous errors
C'est parce que TAR a modifié l'ordre des arguments à partir de la v1.30. Pour connaîtra la version de TAR :
tar --versiontar (GNU tar) 1.26
➡ J'ai corrigé ce bug pour que ça fonctionne avec toutes les versions de TAR, assurez-vous de bien télécharger la dernière version de mon script.
Voilà, profitez-en bien et n'hésitez pas à l'améliorer avec des push ou en le forkant sur GitHub.
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
6 commentaires
Hello !
super le script !
je n'ai pas trouvé l'article concernant le download du fichier via un synology, est-ce que vous l'avez publié ?
Merci !
@fredtroub: par manque de temps je ne l'ai pas encore publié, mais c'est toujours prévu 🙂
Bonjour, merci beaucoup pour ce tutoriel !
Je découvre tout juste ssh et sa puissance, je suis très intéressé par votre script de sauvegardes automatisées, cependant, votre tutoriel pour des personnes novices comme moi maquent un peu d'informations, j'ai téléchargé votre script, modifié les infos mentionnées (variables à modifier), je place le script dans le répertoire " /scripts/bm-backup-ssh.sh " et après je ne sais pas ce qu'il faut faire pouvez-vous s'il vous plait m'apporter un complément d'informations afin que je puisse saisir le processus et ainsi pouvoir utiliser votre script.
dernière chose, j'ai mon dossier /backup qui stockera les sauvegardes, j'ai donc ajouté à la ligne numéro 90 " --exclude '/kunden/homepages/privacy/xxxprivacyxxx/htdocs/backup' " afin que la sauvegarde ne sauvegarde pas le dossier de sauvegarde ... en espérant que cela soit correct ?
Merci d'avance pour votre aide et pour le partage de ce super outil qui permettra de me simplifier la vie en ce qui concerne les sauvegardes de mon site 🙂
@lookya:
finalement j'ai réussi (j'avais pas réglé le CHMOD sur 755 sur le fichier) le dernier soucis auquel je suis confronté, c'est sur la partie d'exclusion de certain dossiers, je me retrouve avec une erreur en console :
" tar: The following options were used after any non-optional arguments in archive create or update mode. These options are positional and affect only arguments that follow them. Please, rearrange them properly. "
j'ai également essayé avec le chemin tel que :
tar zcvf ${DST_BACKUP}/${MON_GZ} ${SRC_BACKUP}
--exclude '${DST_BACKUP}'
--exclude '/kunden/homepages/privacy/xxxprivacyxxx/htdocs/.composer'
--exclude '/kunden/homepages/privacy/xxxprivacyxxx/htdocs/.wp-cli'
--exclude '/kunden/homepages/privacy/xxxprivacyxxx/htdocs/logs'
mais cela ne fonctionne pas, pouvez-vous, svp, m'indiquer pourquoi et comment résoudre cela ?
Merci ! 🙂
ou le chemin absolu (partie masqué pour raison de sécurité) :
tar zcvf ${DST_BACKUP}/${MON_GZ} ${SRC_BACKUP} \
--exclude '${DST_BACKUP}' \
--exclude '/.composer'
--exclude '/.wp-cli'
--exclude '/logs'
Finalement j'ai réussi (j'avais pas réglé le CHMOD sur 755 sur le fichier) le dernier soucis auquel je suis confronté, c'est sur la partie d'exclusion de certain dossiers, je me retrouve avec une erreur en console :
" tar: The following options were used after any non-optional arguments in archive create or update mode. These options are positional and affect only arguments that follow them. Please, rearrange them properly. "
j'ai essayé avec le chemin tel que :
tar zcvf ${DST_BACKUP}/${MON_GZ} ${SRC_BACKUP}
--exclude '${DST_BACKUP}'
--exclude '/.composer'
--exclude '/.wp-cli'
--exclude '/logs'
ou le chemin absolu (partie masqué pour raison de sécurité) :
tar zcvf ${DST_BACKUP}/${MON_GZ} ${SRC_BACKUP}
--exclude '${DST_BACKUP}'
--exclude '/kunden/homepages/privacy/xxxprivacyxxx/htdocs/.composer'
--exclude '/kunden/homepages/privacy/xxxprivacyxxx/htdocs/.wp-cli'
--exclude '/kunden/homepages/privacy/xxxprivacyxxx/htdocs/logs'
mais cela ne fonctionne pas, pouvez-vous, svp, m'indiquer pourquoi et comment résoudre cela ?
Merci ! 🙂
@lookya: essaies en mettant le chemin source à la fin :