Eseguire un backup orario dei DataBase del server

Tabella dei Contenuti

Nel caso degli e-commerce, è utile eseguire il backup del database con frequenza elevata, mentre il backup dei file può essere effettuato quotidianamente. Infatti, in caso di guasto catastrofico del server, si rischierebbe di perdere gli ordini e le registrazioni avvenuti nelle ultime 24 ore dall’ultimo backup completo del database. I file, invece, possono essere spesso recuperati anche da un sistema compromesso, mentre il recupero di un database, soprattutto se di grandi dimensioni, risulta molto più complesso. Per questo motivo, è necessario prestare maggiore attenzione ai backup del database.

Vediamo ora come effettuare questa operazione su un server Linux, in particolare sulla distribuzione AlmaLinux 8.1.

Preconfigurato il nostro server

Per generare il backup e inviarlo via FTP a un server diverso da quello in suo necessitiamo di alcuni pacchetti che normalmente non sono installati in AlamLinux.

Installiamo il pacchetto FTP

La prima operazione da compiere è controllare che sulla nostra distribuzione sia installato ftp, questo al fine di inviare il nostro backup verso un archivio esterno al server in uso.

Aggiorniamo l’indice dei Pacchetti

sudo dnf update

Abilitiamo il repository EPEL

sudo dnf install epel-release

Installiamo il pacchetto FTP

sudo dnf install ftp

Oppure installiamo il pacchetto lftp, per usare FTPS più sicuro

sudo dnf install lftp

Con questi comandi abbiamo installato sul nostro server:

  1. FTP (File Transfer Protocol): È un protocollo standard di rete utilizzato per trasferire file da un host all’altro su una rete TCP basata su IP, come Internet.
  2. Client FTP: Installando un client FTP, ottieni un programma che ti permette di connetterti a server FTP, navigare nelle directory, scaricare file e caricare file.

Installiamo editor Nano

Nano è un editor di testo semplice e facile da usare per la riga di comando, disponibile su molte distribuzioni Linux e UNIX. È particolarmente apprezzato per la sua facilità d’uso, specialmente per chi non ha esperienza con editor di testo più complessi come vi o emacs.

Creiamo lo script Bash che eseguirà il backup

Il primo passo è posizionarci nella cartella root del nostro server o in una cartella a piacere e creare il nostro script con nano.

nano backup_script.sh

Ecco un esempio di uno script completo per questa operazione:

#!/bin/bash

# Variabili per il server FTP
HOST='ftp.yourserver.com'
USER='yourftpusername'
PASSWD='yourftppassword'

# Creazione della directory di backup locale se non esiste
BACKUP_DIR="/root/backup_db"
mkdir -p $BACKUP_DIR

# Generazione della lista dei database
cd /root
/usr/sbin/plesk db -e "show databases" | grep -v -E "^Database|information_schema|performance_schema|phpmyadmin" > dblist.txt

# Dump dei database
mkdir -p /root/mysql_dumps_all
cat /root/dblist.txt | while read i; do
  /usr/sbin/plesk db dump "$i" > /root/mysql_dumps_all/"$i".sql
done

# Verifica se i dump sono stati creati correttamente
if [ ! "$(ls -A /root/mysql_dumps_all)" ]; then
  echo "Errore: Nessun file SQL creato."
  exit 1
fi

# Creazione dell'archivio con solo l'ora corrente (HH)
HOUR=$(date +%H)
ARCHIVE_NAME="mysql_dumps_all_${HOUR}.tar.gz"
ARCHIVE_PATH="$BACKUP_DIR/$ARCHIVE_NAME"
tar -czvf $ARCHIVE_PATH -C /root/mysql_dumps_all .

# Verifica se l'archivio è stato creato correttamente
if [ ! -f "$ARCHIVE_PATH" ]; then
  echo "Errore: L'archivio $ARCHIVE_PATH non è stato creato."
  exit 1
fi

# Invio dell'archivio via FTP
ftp -inv $HOST <<EOF
user $USER $PASSWD
mkdir /backup_db
cd /backup_db
put $ARCHIVE_PATH $ARCHIVE_NAME
bye
EOF

# Verifica dell'invio FTP
if [ $? -eq 0 ]; then
  echo "File $ARCHIVE_PATH inviato con successo a $HOST"
else
  echo "Errore durante l'invio di $ARCHIVE_PATH a $HOST"
fi

# Pulizia dei file tar.gz locali
rm -f $BACKUP_DIR/*.tar.gz

Andranno indicate i dati di connessione del nostro server ftp remoto in:

# Variabili per il server FTP
HOST='ftp.yourserver.com'
USER='yourftpusername'
PASSWD='yourftppassword'

Ricordiamoci poi che se abbiamo optato per una cartella diversa da root, dovremo modificate i relativi percorsi.

Usiamo FTPS al posto di FTP

Per una maggiore sicurezza possiamo usare il protocollo FTPS modificando il blocco di codice seguente:

# Invio dell'archivio via FTP
ftp -inv $HOST <<EOF
user $USER $PASSWD
mkdir /backup_db
cd /backup_db
put $ARCHIVE_PATH $ARCHIVE_NAME
bye
EOF

# Verifica dell'invio FTP
if [ $? -eq 0 ]; then
  echo "File $ARCHIVE_PATH inviato con successo a $HOST"
else
  echo "Errore durante l'invio di $ARCHIVE_PATH a $HOST"
fi

Con il seguente:

# Invio dell'archivio via FTPS
lftp -e "
set ssl:verify-certificate no
open $HOST
user $USER $PASSWD
mkdir -p /backup_db
cd /backup_db
put $ARCHIVE_PATH
bye
" -u $USER,$PASSWD ftps://$HOST

# Verifica dell'invio FTPS
if [ $? -eq 0 ]; then
  echo "File $ARCHIVE_PATH inviato con successo a $HOST"
else
  echo "Errore durante l'invio di $ARCHIVE_PATH a $HOST"
fi

In questo modo andiamo a rendere più sicuro l’invio dei dati dal nostro Server Web al Server FTP remoto.

Impostiamo i permessi e eseguiamo il nostro primo backup

La prima operazione è impostare i permessi per l’esecuzione del nostro script

chmod +x /path/to/your/backup_script.sh

Proviamo il nostro script

./backup_script.sh

Controlliamo l’output generato e verifichiamo che l’archivio sia stato traferito via FTP al server remoto.

Impostiamo il Crontab sul server

Ecco come può essere impostato il crontab per eseguire lo script ogni 2 ore

0 */2 * * * /root/backup_script.sh

Considerazioni sulla sicurezza

Questa è una procedura molto semplificata per il backup del database, che ha un livello di sicurezza non molto elevato dovuto all’invio dell’archivio via FTP senza crittografia. È possibile aumentare la sicurezza con alcune piccole modiche, per esempio:

  1. Proteggere con una password l’archivio prima di inviarlo via FTP
  2. Usare il protocollo SFTP (SSH File Transfer Protocol) o FTPS (FTP Secure) al posto del protocollo FTP.
  3. Aggiungere un invio di un email o comunicazione via webhook se il backup fallisce.

La più importante tra tutte è che il server FTP ricevente è importante non sia nella stessa WebFarm del Server Web dove risiede il nostro e-commerce.