OVH propose un hébergement peu coûteux, mais l’offre de base ne permet pas d’utiliser SSH, ce qui complique beaucoup les sauvegardes.
La documentation d’OVH recommande d’utiliser son navigateur web, d’ouvrir phpMyAdmin, de s’identifier et après encore quelques clics, on obtient notre précieuse sauvegarde.
Trop complexe, la manip ne sera pas faite régulièrement, surtout si on gère plusieurs sites.
Voyons comment améliorer ça.
Ce que recommande OVH…
OVH fournit également un script PHP permettant de générer un dump de la base de données sans passer par phpMyAdmin.
L’idée est de placer un fichier PHP sur le serveur, puis de l’appeler avec son navigateur web (Firefox par exemple).
Un fichier de sauvegarde de la base de données est alors créé, que l’on peut ensuite télécharger comme n’importe quel autre fichier.
… est limité
- Aucune rotation n’est envisagée: lancer une sauvegarde écrase la précédente, plutôt que de créer un nouveau fichier.
- Aucune information n’est fournie en cas d’erreur.
- De trop nombreuses manipulations sont nécessaires.
De plus, la sécurité de la solution proposée par OVH n’est pas idéale. À tel point que la doc recommande ceci:
Avant de terminer, nous vous conseillons vivement de supprimer le fichier de sauvegarde ainsi que le script du répertoire « www ».
Il faudrait donc uploader le script PHP, lancer la sauvegarde avant de tout supprimer du serveur.. pour recommencer à chaque nouvelle sauvegarde.
La solution choisie
La solution évoquée ici, bien qu’un peu complexe à mettre en place, permet ensuite de déclencher une sauvegarde en moins d’une seconde (montre en main !)
Voici une vue d’ensemble ainsi que ses principaux avantages. Nous verrons ensuite chaque composant en détail :
Un script PHP est placé sur le serveur. Lorsqu’on l’appelle, il créé une sauvegarde compressée (on économise ainsi environ 40% d’espace de stockage et de bande passante), tout en conservant les sauvegardes précédentes.
En cas d’erreur, un message est affiché.
Afin de gagner du temps, on utilise un script Bash pour aller stimuler (via curl
) notre script PHP. Après avoir ainsi déclenché la création d’une nouvelle sauvegarde, wget
est lancé pour télécharger celle-ci.
Pour finir, on met en place des notifications pour s’assurer du bon déroulé des opérations et on enveloppe le tout dans un lanceur.
Le résultat en image (à regarder en plein écran) :
Voyons maintenant chaque élément en détail :
Le script PHP
Placé sur votre serveur, par exemple à l’adresse vous.fr/sauvegardes/sauvegarde.php
Vous devez modifier ici les 4 lignes de la “Partie à personnaliser”.
<?php
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP
$db_charset = "utf8"; /* mettre utf8 ou latin1 */
// Partie à personnaliser
$db_server = "vous897.mysql.db"; // Nom du serveur MySQL. ex. mysql5-26.perso.db
$db_name = "vous897"; // Nom de la base de données. ex. mabase
$db_username = "vous897"; // Nom de l'utilisateur / utilisatrice
$db_password = "MotDePasse980"; // Mot de passe de la base de données.
// Pas besoin de modifier ci-dessous
$date = date('Y-m-d-H\hi\ms\s');
$cmd_mysql = "mysqldump";
$archive_GZIP = "archive-".$db_name."-".$date.".gz";
echo " Sauvegarde en cours de la base <b>$db_name</b> <br><br> Serveur : <b>".$db_server."</b><br>Fichier de destination : <b>$archive_GZIP</b> <br> <br> \n";
$commande = $cmd_mysql." --host=$db_server --user=$db_username --password=$db_password -C -Q -e --default-character-set=$db_charset $db_name | gzip -c > $archive_GZIP ";
$CR_exec = system($commande);
if (file_exists($archive_GZIP))
{
$Taille_Sauve = filesize($archive_GZIP);
echo "✔ Génération effectuée. Taille <b>".$Taille_Sauve." Ko</b>. \n";
}
echo "<br><br> <b>Fin</b><br><br> Pensez à conserver cette sauvegarde dans un endroit approprié. <br> Ce fichier de sauvegarde peut contenir des données sensibles (mot de passes, données personnelles, etc)";
?>
Le script Bash
À créer en local, sur votre ordinateur. Pensez à le rendre executable.
#!/bin/bash
curl https://vous.fr/db-export-scripts/sauvegarde.php | grep Taille |
while read line
do
notify-send -t 5000 "Dump de la base de Vous.fr" "$line \n Début du téléchargement"
done
wget https://vous.fr/db-export-scripts/ -e robots=off -Agz -nd -rc -l1 -nv -P database-exports/ 2>&1 | tee -a dump-and-download-database-wget-logs.log | grep ".gz" | cut -d" " -f4,6 | cut -d"/" -f1,3 | cut -d"-" -f1,4,5,6 | sed 's/\[/<b>Taille : /g' | sed 's;\/; Ko</b> ;g' |
while read line
do
notify-send "Téléchargement de la base de Vous.fr" "✔ Téléchargement effectué - $line dans $(pwd)
\n Référence : https://vous.fr/db-export-scripts/"
done
Explication du script Bash
Dans un premier temps, curl
appelle le script PHP, ce qui provoque la création d’un fichier de sauvegarde.
Une notification est affichée grâce à notify-send
, contenant la taille du fichier de sauvegarde, ce qui permet un contrôle rudimentaire.
Ensuite, on télécharge cette sauvegarde avec wget
et les options suivantes:
-e
On ignore le robots.txt-c
on ne télécharge que les nouveaux fichiers-Agz
: ne télécharge que les fichiers.gz
tee
permet de rediriger la sortie vers le fichier de Log et vers la sortie (ici, grep)- les
cut
à la chaîne ont pour but d’extraire la taille de la sauvegarde pour l’afficher. Sûrement sub-optimal, à améliorer.
Pour finir, une deuxième notification est affichée, indiquant le bon déroulement de la sauvegarde.
Le lanceur
Le paquet menulibre
permet de créer simplement des lanceurs de bureau pour Gnome.
Voici ce à quoi ressemble le lanceur que j’utilise (pensez à bien sauvegarder après chaque manip, grâce à l’icône en haut à gauche) :
Voilà, vous devriez obtenir un résultat proche de celui visible dans la vidéo en début d’article.
C’est pas fini !
Si cette solution est fonctionnelle, il vous reste néanmoins quelques points à considérer :
- l’accès au script PHP doit être protégé : non seulement il contient vos identifiants et mots de passe, mais il ne faudrait pas qu’une personne malveillante ou que chaque script qui parcourt automatiquement votre site provoquent des sauvegardes en pagaille, saturant l’espace disponible sur votre serveur → voir
htaccess
ethtpasswd
. - les fichiers de sauvegarde doivent être protégés : ils contiennent des données sensibles, comme vos mots de passe et les données de connexion de vos lecteurs et lectrices → voir
htaccess
ethtpasswd
. - une rotation doit peut-être être envisagée, afin de supprimer automatiquement certaines sauvegardes et préserver de l’espace disque
Une bonne sauvegarde est une sauvegarde qui marche !
Pensez à tester régulièrement le bon fonctionnement de ce script ainsi que des fichiers de sauvegarde générés.
Références et autres solutions
La partie PHP est très directement inspiré du travail de Michel Fouillade. Si cette solution vous convient, n’hésitez pas à faire un détour pour le remercier.
- Ce Gist - renvoi une erreur, mais génère le même fichier que le script utilisé ici.
- Le script Mysqli, pour avoir plus d’infos (indique une erreur de permissions mais le Dump marche)
- Une excellente solution par Fritz
- De bonnes pistes sur le site Ubuntu-fr
- Quelques exemples de scripts - Archive
- Une discussion sur le sujet sur le forum OVH
- Astuce: pour localiser
mysqldump
:<? system('whereis mysqldump'); ?>
#TODO:TEST :
- Un script Bash qui upload sur un serveur FTP : https://github.com/Pe46dro/Bash-MySQL-Database-SFTP-FTP-Backup/blob/master/script.sh
- Transferts de FTP à FTP : https://github.com/mar10/pyftpsync
- Script PHP pour pousser sur du FTP : https://opensourcelibs.com/lib/ftp-deployment
- Download régulières depuis un FTP : https://crazymax.dev/ftpgrab/