Menu
Backup e Ripristino

Come fare backup di WordPress da riga di comando con WP-CLI e cron

Gianluca Gentile · · 5 min di lettura

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.

Condividi:

Lascia un commento