Sauvegarde hebergement mutualisé
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
question

Sauvegarde hebergement mutualisé

Par
JeanlucD
Créé le 2018-11-26 14:07:08 (edited on 2024-09-04 12:05:20) dans Hébergements Web

Bonjour,

Je souhaite acquérir une solution pour heberger mon site web.
J'ai vu qu'il existait des sauvegardes possibles à J-1...
Est il possible de mettre en place une sauvegarde ( developpement + données) mensuelle ou à la demande dans un espace donné ? facilement restorable ?


4 réponses ( Latest reply on 2021-06-01 08:48:51 Par
VanessaB5
)

Bonjour Monsieur,

Nos sauvegardes sont d'une part non contractuelle et d'autre part non configurable dans le temps.
Voici le guide des sauvegardes Ovh coté Ftp:
https://docs.ovh.com/fr/hosting/restauration-ftp-filezilla-espace-client/

Il faut que vous mettiez en place des plugins de gestion de sauvegarde ou des scripts pour faire ces exports de manière personnalisé .

Cordialement AntoineB1

```text


mettre en place une sauvegarde


Il faut une machine Linux (au minimum un Raspberry Pi à la maison) installer un cron

1) sur l'hébergement mettre un script PHP qui exporte la database dans un fichier

2) dans un cron faire un appel à ce script PHP, on a un export dans un fichier texte sur l'hébergement

3) dans un cron récupérer le fichier texte. on a ainsi une sauvegarde de la base de données.

4) dans un cron récupérer tous les fichiers avec ftp.

Voici:
backup-db.php

/**
* This file contains the Backup_Database class wich performs
* a partial or complete backup of any given MySQL database
* @author Daniel L▒pez Aza▒a <http://www.daniloaz.com-->
* @version 1.0
*/

// Report all errors
error_reporting(E_ALL);

/**
* Define database parameters here
*/
define("DB_USER", 'user');
define("DB_PASSWORD", 'pass');
define("DB_NAME", 'nom_database');
define("DB_HOST", 'serveur.db');
define("OUTPUT_DIR", 'backupdb');
define("TABLES", '*');

/**
* Instantiate Backup_Database and perform backup
*/
$backupDatabase = new Backup_Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$status = $backupDatabase->backupTables(TABLES, OUTPUT_DIR) ? 'OK' : 'KO';
echo "


Backup result: ".$status;

/**
* The Backup_Database class
*/
class Backup_Database {
/**
* Host where database is located
*/
var $host = '';

/**
* Username used to connect to database
*/
var $username = '';

/**
* Password used to connect to database
*/
var $passwd = '';

/**
* Database to backup
*/
var $dbName = '';

/**
* Database charset
*/
var $charset = '';

/**
* Constructor initializes database
*/
function Backup_Database($host, $username, $passwd, $dbName, $charset = 'utf8')
{
$this->host = $host;
$this->username = $username;
$this->passwd = $passwd;
$this->dbName = $dbName;
$this->charset = $charset;

$this->initializeDatabase();
}

protected function initializeDatabase()
{
$conn = mysql_connect($this->host, $this->username, $this->passwd);
mysql_select_db($this->dbName, $conn);
if (! mysql_set_charset ($this->charset, $conn))
{
mysql_query('SET NAMES '.$this->charset);
}
}

/**
* Backup the whole database or just some tables
* Use '*' for whole database or 'table1 table2 table3...'
* @param string $tables
*/
public function backupTables($tables = '*', $outputDir = '.')
{
try
{
/**
* Tables to export
*/
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}

$sql = 'CREATE DATABASE IF NOT EXISTS '.$this->dbName.";\n\n";
$sql .= 'USE '.$this->dbName.";\n\n";

/**
* Iterate tables
*/
foreach($tables as $table)
{
echo "Backing up ".$table." table...";

$result = mysql_query('SELECT * FROM '.$table);
$numFields = mysql_num_fields($result);

$sql .= 'DROP TABLE IF EXISTS '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$sql.= "\n\n".$row2[1].";\n\n";

for ($i = 0; $i < $numFields; $i++)
{
while($row = mysql_fetch_row($result))
{
$sql .= 'INSERT INTO '.$table.' VALUES(';
for($j=0; $j<$numFields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j]))
{
$sql .= '"'.$row[$j].'"' ;
}
else
{
$sql.= '""';
}

if ($j < ($numFields-1))
{
$sql .= ',';
}
}

$sql.= ");\n";
}
}

$sql.="\n\n\n";

echo " OK" . "
";
}
}
catch (Exception $e)
{
var_dump($e->getMessage());
return false;
}

return $this->saveFile($sql, $outputDir);
}

/**
* Save SQL to file
* @param string $sql
*/
protected function saveFile(&$sql, $outputDir = '.')
{
if (!$sql) return false;

try
{
/* $handle = fopen($outputDir.'/db-backup-'.$this->dbName.'-'.date("Ymd-His", time()).'.sql','w+'); */
$handle = fopen($outputDir.'/db-backup-'.$this->dbName .'.sql','w+');
fwrite($handle, $sql);
fclose($handle);
}
catch (Exception $e)
{
var_dump($e->getMessage());
return false;
}

return true;
}
}
?>

Premier script à lancer dans un cron

#!/bin/bash
mkdir -p /home/backup
cd /home/backup
# declencher l'export
wget http://nom.du.site/backup-db.php -O /dev/null
# recuperer l'export
wget http://nom.du.site/backupdb/db-backup-.sql -O db-backup-.sql


Deuxième script à lancer avec un cron

#!/bin/bash
cd /home/backup/site
ncftpget -R -V -d ncftpget.log -u user -p password ftp.cluster0xx.ovh.net . /


Maintenant c'est à vous de gérer la durée de rétention de ce backup. ```

Bonjour,
je trouve ton script très intéressant mais j'aimerai avoir un complément d'information.
mon site est chez OVH et j'aimerai récupère mon backup sur mon raspberry. ton script répond a mon souhait mais sur quels serveurs les 2 crons doivent être lancés
cordialement
Joel


sur quels serveurs les 2 crons doivent être lancés


Bonjour, sur ton raspberryPi, par exemple avec le user 'pi'.

Merci beaucoup Fritz2cat
ca marche impeccable

Hello, @JoelH2 @Fritz2cat
C'est dangereux ce que vous faites, vous mettez un backup dans votre document root accessible publiquement sans le crypter et en plus avec des noms de fichiers/dossiers prévisibles.
Si vous avez des données personnelles (RGPD power) et que vous vous les faites piquer, c'est chaud pour vous !
Je déconseille fortement l'usage de ce script a un non initié que ne pourrait l'éditer pour le sécuriser.

De manière plus sécure, vous pouvez lancer en tâche cron sur votre raspberry Pi une tâche de backup directement du SQL en SSH, donc sécurisé de bout en bout.
Par exemple, vous mettez une clé SSH publique sur votre hosting (création du .ssh et du fichier authorized_keys dans votre dossier racine (pas le document root hein ;-) )
Puis depuis le Pi :
> ssh -i private_ssh_key -u USER 'mysql -hMYSQL_HOST -uMYSQL_USER -pMYSQL_PASSWORD backupfile.sql' > backup.sql

Dans ce cas, le fichier backup.gzip est créé sur le Pi

Bonjour Fusioncore
merci pour ta remarque mais je n'arrive pas a appliquer ta solution
j'ai généré une clé ssh sur mon raspberry, j'ai créé a la racine de mon site sur ovh avec filezilla un repertoire .ssh et j'y ai mis ma clé publique
mais apres ? je ne vois pas ce qu'il faut lancer : l'option -u n'existe pas
si je met nom@adresse du serveur ftp d'Ovh il ne lit pas ma clé et me demande le mot de passe ftp et rien ne se lance
si je met l'adresse ip du serveur qui heberge mon site rien ne bouge
je suis un peu beaucoup perdu.
j'aimerai savoir si le fait de passer avec une connexion https pour le script 1 de Fritz2cat ca securise deja un peu ?

je lance sur raspberry
ssh -v -iCLE PRIVEE NOM@IP SERVEUR OVH 'mysqldump -hBASE -uUSER -pPASS backupfile.sql'>backup.sql
reponse :
OpenSSH_7.9p1 Raspbian-10+deb10u2, OpenSSL 1.1.1d 10 Sep 2019
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to port 22.
debug1: Connection established.
debug1: identity file id_rsa type 0
debug1: identity file id_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.9p1 Raspbian-10+deb10u2
ssh_exchange_identification: read: Connection timed out
ou est mon erreur ?


j'ai généré une clé ssh sur mon raspberry


Bonjour,

@Fusioncore présuppose que tu as un hébergement Pro au minimum avec la possibilité de faire un ssh vers les serveurs d'OVH.

Mon script est peu sécurisé car le fichier 'export' qui se trouve dans l'hébergement contient probablement des données sensibles, comme une liste des users ou une liste de clients et des factures, ceci est surtout vrai pour un site de e-commerce et probablement beaucoup moins pour un blog ou portfolio.

L'idéal serait d'avoir un API OVH pour obtenir un export de la DB.

bonjour Fritz2cat
j'ai une offre mutualisée perso donc pas de ssh OVH
c'est compliqué pour automatiser ses sauvegardes ...
a+

Hello,
Le https ne sécurise pas l'accès aux données, mais sécurise juste durant le transfert.
Effectivement je présuppose que le compte possède un accès SSH. Au pire un htpasswd fera déjà un peu mieux le job que rien du tout.

Dernière possibilité, que le premier wget génère le fichier hors document root (un dossier en dessous) et de le récupérer non pas en ssh mais en ftp.
Un truc du genre :
> SERVER=""
> USER=""
> PASS=""
> ftp -i -n $SERVER << END_SCRIPT
> quote USER $USER
> quote PASS $PASS
> pwd
> bin
> mget $FILENAME.sql
> quit
> END_SCRIPT

Je regarde si je peux vous fournir un script qui marche chez OVH dans la semaine.

Hello
une question ?
Chez Ovh, je dois pouvoir lancer un cron donc si je fait ma sauvegarde via le cron d'Ovh et a partir de mon raspberry lancer avec un cron a une heure differente un sftp pour rapatrier la sauvegarde de ma base
est-ce une solution plus secure?


le premier wget génère le fichier hors document root


Bonjour,

En fait le 2è script ncftpget récupère l'export qui vient d'être créé dans le FTP.
Le wget est inutile dans le 1er script !!

Merci de m'avoir aidé à revisiter mes backups :-)

Si ton dump est hors de ce qui est accessible via http(s)://ton-site.truc/backup/dump.sql, oui totalement

// message supprimé, j'utilise finalement une autre solution //

Voici la solution en question, largement inspirée de la présente page:

https://roneo.org/ovh-sans-ssh-sauvegarde-database-sql-script-bash/