Menu

Back-up Automat MySQL si Upload in cloud

Inveti o modalitate foarte buna de a-ti face back-up la baza de date MySQL si a o uploadata pe Google Drive , totul in mod automat. Cu putina atentie vei invata si sa lucrezi cu API-ul Google iar urmarind celelalte tutoriale cum sa te folosesti de serviciile gigantilor pentru a-ti imbunatatii site-ul.

Azi ma gandeam la probabiltatea de a avea siteul compromis si incercam sa previn eventualele pericole si in cazul in care nu reusesc sa am un plan de rezerva. Desigur, in cazul in care as pierde baza de date singura optiune ar fi back-upul zilnic care il fac in general. Dar cat inseamna cu adevarat o zi? Aceasta a fost prima intrebare care mi-am pus-o. Si raspunsul nu s-a lasat asteptat, am constat cu stupoare ca o zi poate insemna chiar si peste 5 articole sau 20 de ore de munca, deci daca analizam putin observam ca nu este tocmai ok back-upul zilnic cand vine vorba de pierderea datelor, sa nu mai spun de comentariile ce se pot pierde. Asa ca am decis ca timpul maxim care trebuie sa treaca de la un back-up la altul este de 3 ore. Dat fiind un punct de plecare, putem spune ca un cron job + o functie de back-up a bazei de date este solutia perfecta. Dar intervine o mica problema, o data ce am spus ca ne referim la cazul cand pierdem datele, de exemplu cand va este exploatata o vurnerabilitate si va sterge scriptul un idiot, asta inseamna ca un simplu back-up automat prin cron job nu ajuta, deoarece fisierele sunt tot unde este si scriptul. Aici intervine stocarea in cloud, unde putem beneficia de spatiul imens(in comparatie cu cat platim pentru spatiul din webhost) oferit de siteuri ca Mega, Google Drive si altele. Eu am ales pentru back-upul in cloud Google Drive, nu am o scuza pentru ca nu am folosit mega, doar ca imi place foarte mult Google, iubesc acest brand.

Mai jos aveti codul php pentru back-up urmat de detalii despre instalarea lui:

<?php  
ob_start();

### Inceput - Setari inainte de utilizare ### 
$secret_key             = 'parola-ta-extra-secreta'; // Metoda de siguranta, parola fara de care nu se poate face back-up
$allowed_ips            = array('127.0.0.1'); // Metoda de siguranta, IP-urile de pe care se poate face back-up
$mysql_host             = 'localhost';
$mysql_user             = 'user';
$mysql_pass             = 'parola';
$mysql_db               = 'bazamea';
$google_client_id       = 'id-ul tau pentru api'; 
$google_client_secret   = 'google-client-secret';
$google_redirect_uri    = 'http://localhost/mysql-backup.php?key='.$secret_key;
### Sfarsit - Setari inainte de utilizare ###


### Inceput - Masuri de securitate ###
if(array_search($_SERVER['REMOTE_ADDR'], $allowed_ips) === false){
    exit('IP-ul dumneavoastra nu este pe lista de IP-uri ale administratorilor.');
}
if($_GET['key'] != $secret_key){
    exit('Pentru a accesa acest fisier aveti nevoie de key-ul secret.');
}
### Sfarsit - Masuri de securitate ###


mysql_connect($mysql_host, $mysql_user, $mysql_pass); 
mysql_query('SET NAMES utf8');   

function mysql_dump($database){
    $query = '';
    $tables = @mysql_list_tables($database);
    while ($row = @mysql_fetch_row($tables)) { $table_list[] = $row[0]; }
    for ($i = 0; $i < @count($table_list); $i++) { 
        $results = mysql_query('DESCRIBE ' . $table_list[$i]);
        $query .= 'DROP TABLE IF EXISTS `'. $table_list[$i] . '`;' . "&#92;n";
        $query .= "&#92;n" . 'CREATE TABLE `' . $table_list[$i] . '` (' . "&#92;n";
        $tmp = '';
        while ($row = @mysql_fetch_assoc($results)) {
            $query .= '`' . $row['Field'] . '` ' . $row['Type'];
            if ($row['Null'] != 'YES') { $query .= ' NOT NULL'; }
            if ($row['Default'] != '') { $query .= ' DEFAULT '' . $row['Default'] . '''; }
            if ($row['Extra']) { $query .= ' ' . strtoupper($row['Extra']); }
            if ($row['Key'] == 'PRI') { $tmp = 'primary key(' . $row['Field'] . ')'; }
            $query .= ','. "&#92;n";
        }  
        
        $query .= $tmp;
        if(strlen($tmp) < 3) $query  = substr_replace($query ,"",-2);
        $query .=  "&#92;n" . ');' . str_repeat("&#92;n", 2);
        $results = mysql_query('SELECT * FROM ' . $database . '.' . $table_list[$i]);
        while ($row = @mysql_fetch_assoc($results)) {
            $query .= 'INSERT INTO `'. $table_list[$i] .'` (';
            $data = Array();
            while (list($key, $value) = @each($row)){ 
                $data['keys'][] = '`'.$key.'`'; 
                $data['values'][] = addslashes($value); 
            }
            $query .= join($data['keys'], ', ') . ')' . "&#92;n" . 'VALUES ('' . join($data['values'], '', '') . '');' . "&#92;n";
        }   
        $query .= str_repeat("&#92;n", 2);
    }
    return $query;
}

$fisier         = 'mysqldump/'.date('d-m-Y H:i:s').'.sql'; // fisierul unde se salveaza baza de date
$token_fisier   = $secret_key.'.json'; // fisierul unde se salveaza tokenul si detalii despre el in format JSON
$cale_fisiere_api = '../src/google/'; // calea unde aveti fisierele pentru lucrul cu API-ul Google(aveti instructiuni la noi pe site despre cum le puteti downloada)

require_once $cale_fisiere_api.'Google_Client.php';          
require_once $cale_fisiere_api.'contrib/Google_DriveService.php';

$client = new Google_Client();
$client->setClientId($google_client_id);
$client->setClientSecret($google_client_secret);
$client->setRedirectUri($google_redirect_uri);
$client->setScopes(array('https://www.googleapis.com/auth/drive'));
$service = new Google_DriveService($client);

$authUrl = $client->createAuthUrl(); // functia care creeaza URL-ul de unde putem face rost de token

### Inceput - Actualizare sau Refreshare token ###
echo 'Poti reactualiza tokenul pe <a href="'.$authUrl.'">aceasta pagina</a><hr/>';
if( !is_null($_GET['code']) ){
    $token_fh    = fopen($token_fisier, 'w+');
    $accessToken = $client->authenticate($_GET['code']); // functia care autentifica userul pe baza code-ului care provine de la URL-ul de autentificare returnat de $client->createAuthUrl().
    if( fwrite($token_fh, $accessToken) ){
        echo 'Tokenul a fost actualizat cu succes!<hr/>';
    } else{
        echo 'A intervenit o problema in scrierea tokenului.<hr/>';
    }
} else{

    $accessToken  = @file_get_contents($token_fisier);
    if(strlen(trim($accessToken)) < 3){
        exit('Inainte sa putem incepe este necesar sa obtii tokenul accesand <a href="'.$authUrl.'">aceasta pagina</a> ');
    }
    $token        = json_decode($accessToken);
    $client->refreshToken($token->refresh_token);
    $accessToken  = $client->getAccessToken(); // dupa ce am refresh-at tokenul trebuie sa-l salvam in fisier pe cel nou, asa ca il obtinem cu ajutorul acestei functii pe cel nou
    $token_fh     = fopen($token_fisier, 'w');
    $accessToken  = json_decode($accessToken);
    $accessToken->refresh_token = $token->refresh_token;
    $accessToken  = json_encode($accessToken);
    if( fwrite($token_fh, $accessToken) ){
        echo 'Tokenul a fost refresh-at cu succes! <hr/>';
    } else{
        echo 'A intervenit o problema in scrierea in fisier a tokenului refresh-at.<hr/>';
    }
}
fclose($token_fh);

$client->setAccessToken($accessToken); 
### Sfarsit - Actualizare sau Refreshare token ###


### Inceput - Salvam baza intr-un fisier ###
$fh = fopen($fisier, 'w+');
if(!$fh){
    echo 'Fisierul nu a putut fi deschis.';
} else{
    if(fwrite($fh, mysql_dump($mysql_db) )){
        echo 'Baza de date a fost exportata cu succes in fisierul <u><a href="'.$fisier.'">'.basename($fisier).'</a></u> din directorul <u>'.dirname($fisier).'</u> de pe acest server.<hr/>';
    } else{
        echo 'A intervenit o eroare cand s-a incercat scrierea in fisierul <u>'.basename($fisier).'</u> din directorul <u>'.dirname($fisier).'</u> de pe acest server.<hr/>';
    }
    fclose($fh);
}
### Sfarsit - Salvam baza intr-un fisier ###


### Inceput - Uploadam fisierul pe Google Drive ###
$file = new Google_DriveFile();
$file->setTitle(basename($fisier));
$file->setDescription('SQL Automate Back-up');
$file->setMimeType('text/x-sql');

$data = file_get_contents($fisier);

$parentId = '0Bz5V-rFdSWYJSkNucUJyZEU0dkE'; // ID-ul folderului unde se vor salva back-upurile. In caz ca doriti in folderul ROOT scrieti root
$parent = new Google_ParentReference();
$parent->setId($parentId);
$file->setParents(array($parent));

$createdFile = $service->files->insert($file, array(
      'data' => $data,
      'mimeType' => 'text/x-sql',
    ));

echo 'Fisierul <u><a href="'.$createdFile['webContentLink'].'">'.basename($fisier).'</a></u> a fost uploadat cu succes pe Google Drive pe contul cu numele <u>'.$createdFile['ownerNames'][0].'</u>.<hr/>';
### Sfarsit - Uploadam fisierul pe Google Drive ###


echo '<a href="'.$_SERVER['SCRIPT_NAME'].'?key='.$secret_key.'">Apasa aici daca doresti sa faci un nou back-up.</a>';

ob_end_flush();
?>
Pentru inceput trebuie sa ne setam parola si ip-ul ca scriptul sa funcioneze corect. Sa spunem ca dorim ca parola noastra sa fie "programam", vom modifica linia
$secret_key             = 'parola-ta-extra-secreta'; // Metoda de siguranta, parola fara de care nu se poate face back-up
in
$secret_key             = 'programam'; // Metoda de siguranta, parola fara de care nu se poate face back-up

Iar la IP, trebuie sa adaugam un element in array cu ip-ul nostru. Sa spunem ca ip-ul nostru e 123.4.5.6. Modificam
$allowed_ips            = array('127.0.0.1'); // Metoda de siguranta, IP-urile de pe care se poate face back-up
in
$allowed_ips            = array('127.0.0.1','123.4.5.6'); // Metoda de siguranta, IP-urile de pe care se poate face back-up

Dupa aceea trebuie sa modificati datele pentru conectare la MySQL, sper ca acolo va descurcati, nu o sa mai stau sa explic si pentru aia deoarece e mult prea simplu. Acum urmeaza sa modificam cu datele pentru API-ul Google, pentru asta vom intra pe Google Console. Intram la services, din meniul din stanga

google console

si setam Drive API pe on

google console drive api

acum intram la API Access

api access console

Apasam pe "Create another client ID"

create another client id

Completam cu datele noastre si apasam pe "Create client ID", nu uitati sa aveti selectat http si nu https in caz ca nu aveti SSL

create client id

Apasam pe linkul "edit settings" pentru a adauga adrese valide pentru redirect

Adaugam o noua linie in prima textarea de forma http://domeniu.com/pagina-unde-aveti-scriptu-pentru-backup.php?key=parolata unde parolata este parola care ati setat-o din script, in cazul nostru "parola-ta-extra-secreta" si apasam update

In poza de mai sus localhost reprezinta domeniul, mysql-backup.php reprezinta fisierul unde avem scriptul pentru back-up si parola-ta-extra-secreta reprezinta parola pusa. Acum vom modifica scriptul cu datele noastre pentru API.

In cazul din imaginea de mai sus vom modifica

$google_client_id       = 'id-ul tau pentru api'; 

cu

 $google_client_id       = '313577255360-qupn8qgc79vh7he0tofs3ir84brjur98.apps.googleusercontent.com'; 

, vom mai modifica

$google_client_secret   = 'google-client-secret';

cu

$google_client_secret   = 'TBZXxEzoI82HGk3nbtyXrJ2i';

si vom mai modifica

$google_redirect_uri    = 'http://localhost/mysql-backup.php?key='.$secret_key;

cu

$google_redirect_uri    = 'http://localhost/mysql-backup.php?key='.$secret_key;
Acum urmeaza sa accessati http://localhost/mysql-backup.php?key=parola-ta-extra-secreta

Si sa dati click pe "aceasta pagina"

Acum trebuie sa apasati pe "Sunt de acord" Iar acum totul este gata, back-upul a fost facut si uploadat pe google drive. Cum se poate vedea si mai jos: backup facut cu succes De acum token-ul nostru a fost salvat si nu va mai fi nevoie sa intram de fiecare data pe pagina de confirmare a google, putem seta un cron job care din 3 in 3 ore sa ne faca back-up la baza de date incat vom sti ca nimic nu ni se mai poate intampla, si daca se intampla avem back-up oricand in contul de Google Drive.

Ti-a placut articolul? Asigura-te ca-ti dam de veste cand publicam altele noi.


Tags: Programare Web, Php Si Mysql, Tutoriale Mysql, Php, Resurse, Tutoriale

Comments Nota 0 din 0