Come creare una copia di sicurezza database compreso in ambiente LAMP\LEMP?
Ancora oggi sono molto diffuse applicazioni web che girano in ambiente LAMP (Linux, Apache, MySQL, Perl) o LEMP (Linux, Enginx, MySQL, Perl) come, ad esempio, WordPress, Joomla, Drupal, NextCloud, ecc...
Vediamo come fare un backup procedendo a mano e come procedere per un ripristino.
La tipologia di ambiente permette di ospitare le applicazioni su server privati (fisici o virtuali) o di farli girare su web hosting a cui, spesso, viene dato anche un accesso ssh.
Ambiente
Prima di procedere vediamo la configurazione del nostro server:
- directory root:: /srv/www/example.com
- directory del server:
html
data
conf
log - database:
Tipo: MariaDB
Nome del Database: exampleWebApp1
Questa configurazione è caratteristica in molti server. Utile da sapere:
- html: contiene i file PHP delle nostre webapp
- data: contiene i file caricati nelle webapp (es. i file caricati in NextCloud)
- conf: contiene eventuali configurazioni aggiuntive custom per Apache o Enginx.
Per MariaDB l'utente che usiamo per il collegamento SSH, tramite sudo, ci permette di avere i privilegi di root.
Per il nostro backup completo ci serve:
- copiare tutti i file contenuti in html, data e conf
- il database exampleWebApp1 come stringhe SQL.
MySQL, MariaDB o PostgreSQL?
Storicamente le soluzioni LAMP usano MySQL. MariaDB nasce come spin-off di MySQL. Inizialmente identico a MariaDB si sta diversificando sempre di più anche se continua a restare equivalente a MySQL. I comandi sono diversi (es.: mysql vs mariadb, mysql-dump vs mariadb-dump), ma con poca differenza si passa dall'uno all'altro.
Diverse webapp hanno scelto PostgreSQL come database. Diverse supportano nativamente MySQL, MariaDB e PostgreSQL.
PostgreSQL è molto diverso dagli altri due. Se è più semplice il backup ed il restore è anche una procedura completamente diversa.
In questa guida non lo tratteremo.
Backup
Passiamo all'azione:
- tramite un collegamento SSH apriamo un terminale sul nostro webserver
- creiamo il backup delle directory html, data e conf
tar cfz log/20260816_example.com-html.tgz htmltar cfz log/20260816_example.com-data.tgz datatar cfz log/20260816_example.com-conf.tgz conf
NB 1: "20260816" è la data del momento del backup scritta nel formato YYYYMMDD
NB 2: i backup li mettiamo temporaneamente nella directory log perché normalmente la root non è scrivibile
- creiamo il backup del database
sudo maiadb-dump -u root --databases exampleWebApp1 --result-file=./log/20260816_example.com-exampleWebApp1.sql
- creiamo un file unico di backup:
cd logtar cfz 20260816_example.com.tgz 20260816_example.com-html.tgz 20260816_example.com-data.tgz 20260816_example.com-conf.tgz 20260816_example.com-exampleWebApp1.sqlrm 20260816_example.com-html.tgz 20260816_example.com-data.tgz 20260816_example.com-conf.tgz 20260816_example.com-exampleWebApp1.sql
A questo punto abbiamo il nostro backup completato da spostare su un device locale (un disco, un NAS, il nostro PC), magari con SFTP o altro strumento e da rimuovere sul server in modo da contenere il consumo di spazio.
Restore
Il ripristino di un backup è distruttivo, ovvero:
- riporta la webapp allo stato del momento del backup
- ogni aggiornamento o cambio successivo verrà distrutto.
NB: durante il restore per la durata dell'operazione la webapp non sarà funzionante. Potrebbe essere buono creare una pagina di cortesia del tipo "Aggiornamento in corso" per gli utenti.
Passiamo all'azione:
- Copiamo il nostro file di backup "20260816_example.com.tgz" sul server dentro òa directory log
- tramite un collegamento SSH apriamo un terminale sul nostro webserver
- estraiamo il backup
cd logtar xfz 20260816_example.com.tgzrm 20260816_example.com.tgz
- svuotiamo le directory dai vecchi file
rm -R ../html/*rm -R ../data/*rm -R ../conf/*
- ripristiniamo i backup
tar xfz 20260816_example.com-html.tgz -C ../tar xfz 20260816_example.com-data.tgz -C ../tar xfz 20260816_example.com-conf.tgz -C ../
- ripristianiamo anche il backup del database
sudo mariadb < 20260816_example.com-exampleWebApp1.sql
- rimuoviamo i backup
rm 20260816_example.com-html.tgz 20260816_example.com-data.tgz 20260816_example.com-conf.tgz 20260816_example.com-exampleWebApp1.sql
Conclusione
Il metodo di backup qui presentato è stato illustrato nella sua forma base.
Con una piccola integrazione, magari inserita in uno script controllato da un cron, permette di backuppare più webapp e più siti ospitati sul nostro server. Al rovescio possiamo focalizzarlo per salvare una sola webapp ed un solo database.
Facendo un backup integrale permette un ripristino certo, veloce con l'incomodo che dobbiamo ricordarci i comandi.
Con alcune webapp è una metodologia che né permette anche la migrazione da un server ad un altro.
Infine questa procedura old style può essere la base per backup di ambienti diversi, più moderni e complessi, come soluzioni NodeJS, Rust, ecc... o per porzioni della nostra workstation Linux, BSD o anche Mac.