Come fare backup di WordPress da riga di comando con WP-CLI e cron
I plugin di backup funzionano bene per la maggior parte dei siti, ma hanno limiti: consumano risorse PHP, possono andare in timeout su siti grandi e dipendono dal cron di WordPress che non è sempre affidabile. Per un controllo totale sui backup, puoi usare WP-CLI combinato con cron job di sistema. In questa guida ti spiego come creare uno script di backup automatico professionale.
Perché usare WP-CLI per i backup
WP-CLI esegue i comandi WordPress direttamente dalla riga di comando, senza passare dal web server. Questo offre diversi vantaggi rispetto ai plugin:
- Nessun timeout: il processo non è limitato dal tempo massimo di esecuzione di PHP configurato nel web server.
- Meno risorse: non carica l’intero stack WordPress per ogni operazione.
- Automazione affidabile: il cron di sistema è più affidabile del wp-cron di WordPress.
- Scriptabile: puoi combinare il backup con altre operazioni come la compressione, la copia remota e la pulizia dei vecchi backup.
Backup del database con WP-CLI
Il comando base per esportare il database è:
wp db export /percorso/backup/database-$(date +%Y%m%d).sql --path=/percorso/wordpress/
Questo crea un file SQL con la data nel nome (es. database-20260824.sql). Per comprimere il file e risparmiare spazio:
wp db export - --path=/percorso/wordpress/ | gzip > /percorso/backup/database-$(date +%Y%m%d).sql.gz
Il trattino dopo export dice a WP-CLI di scrivere sullo standard output, che viene poi passato a gzip tramite la pipe. Il risultato è un file compresso che occupa il 70-90% di spazio in meno.
Backup dei file con tar
Per i file del sito, usa tar con compressione gzip:
tar czf /percorso/backup/files-$(date +%Y%m%d).tar.gz
--exclude='wp-content/cache'
--exclude='wp-content/backup*'
--exclude='wp-content/uploads/backup*'
/percorso/wordpress/
Le opzioni –exclude escludono le cartelle di cache e i backup precedenti, riducendo le dimensioni dell’archivio. Puoi aggiungere altre esclusioni per cartelle temporanee o log.
Creare uno script di backup completo
Ecco uno script bash che combina il backup del database e dei file:
#!/bin/bash
# Configurazione
WP_PATH="/var/www/html/wordpress"
BACKUP_DIR="/home/utente/backups"
DATE=$(date +%Y%m%d-%H%M)
KEEP_DAYS=30
# Crea la cartella di backup se non esiste
mkdir -p $BACKUP_DIR
# Backup database
wp db export - --path=$WP_PATH | gzip > $BACKUP_DIR/db-$DATE.sql.gz
echo "Database: OK"
# Backup file
tar czf $BACKUP_DIR/files-$DATE.tar.gz
--exclude='wp-content/cache'
--exclude='wp-content/backup*'
$WP_PATH
echo "File: OK"
# Elimina backup più vecchi di 30 giorni
find $BACKUP_DIR -name "db-*.sql.gz" -mtime +$KEEP_DAYS -delete
find $BACKUP_DIR -name "files-*.tar.gz" -mtime +$KEEP_DAYS -delete
echo "Pulizia: OK"
echo "Backup completato: $DATE"
Salva lo script come backup-wp.sh, rendilo eseguibile con chmod +x backup-wp.sh e testalo manualmente prima di automatizzarlo.
Automatizzare con cron
Per eseguire lo script automaticamente ogni giorno alle 3 di notte, aggiungi una riga al crontab:
crontab -e
Aggiungi:
0 3 * * * /home/utente/backup-wp.sh >> /home/utente/backup.log 2>&1
Il redirect >> backup.log 2>&1 salva l’output dello script in un file di log, utile per verificare che tutto funzioni. Controlla il log periodicamente per assicurarti che i backup vengano creati senza errori.
Copiare i backup su un server remoto
I backup locali non bastano: se il server ha un problema, perdi sia il sito sia i backup. Aggiungi al tuo script un passaggio per copiare i backup su un server remoto:
# Copia su server remoto con rsync rsync -avz $BACKUP_DIR/ utente@server-remoto:/backups/wordpress/ # Oppure su Amazon S3 con AWS CLI aws s3 sync $BACKUP_DIR/ s3://nome-bucket/wordpress-backups/ --delete
Per rsync, configura l’autenticazione SSH con chiave pubblica per evitare di dover inserire la password. Per S3, configura le credenziali AWS con aws configure.
Backup incrementali con rsync
Per siti molto grandi, un backup completo dei file ogni giorno può essere lento e occupare molto spazio. I backup incrementali copiano solo i file modificati dall’ultimo backup:
rsync -avz --link-dest=$BACKUP_DIR/latest
$WP_PATH/ $BACKUP_DIR/backup-$DATE/
# Aggiorna il link simbolico "latest"
ln -snf $BACKUP_DIR/backup-$DATE $BACKUP_DIR/latest
L’opzione –link-dest crea hard link ai file non modificati invece di copiarli, risparmiando spazio su disco. Ogni cartella di backup sembra completa ma occupa solo lo spazio dei file cambiati.
Verificare i backup automaticamente
Aggiungi al tuo script un controllo automatico che verifica l’integrità del backup:
# Verifica che il file di backup esista e non sia vuoto
if [ -s "$BACKUP_DIR/db-$DATE.sql.gz" ]; then
echo "Verifica database: OK"
else
echo "ERRORE: backup database vuoto o mancante"
# Invia notifica email
echo "Backup fallito" | mail -s "ALERT: Backup WordPress" admin@tuodominio.com
fi
Puoi anche verificare l’integrità dell’archivio gzip con gzip -t e dell’archivio tar con tar tzf.
Serve assistenza?
Se vuoi configurare un sistema di backup automatico professionale per il tuo sito WordPress, il team di SoccorsoWP può creare uno script personalizzato per le tue esigenze. Apri un ticket e proteggi i tuoi dati.