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) :

illustration: hosting-ovh-backup-database-lanceur

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 et htpasswd.
  • 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 et htpasswd.
  • 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.

#TODO:TEST :