Script bash para hacer backup de WordPress

By | July 18, 2015

Existen decenas de plugins para hacer backups de WordPress sin necesidad de complicarnos demasiado la existencia. Si tenéis acceso SSH a vuestro servidor para administrarlo podéis implementar vuestra propia solución de backup igualmente satisfactoria con sencillos scripts.

He creado un script en bash que realiza:

  • Copia de respaldo de los ficheros de DocumentRoot de nuestro servidor (donde se encuentra toda la instalación de WordPress con los directorios wp-content, wp-uploads…). Definiremos el directorio donde tenemos nuestro WordPress con la variable wp_documentroot.
  • Copia de respaldo de la BBDD de WordPress en MySQL.
  • Ambos backups (base de datos y ficheros) se guardan en el directorio de destino que definamos, en un empaquetado TAR comprimido con gunzip. Los backups se irán guardando sucesivamente en ese directorio destino de la siguiente manera:
    ...
    20150606.tar.gz
    20150607.tar.gz
    20150608.tar.gz
    20150609.tar.gz
    20150610.tar.gz
    ...
    
  • Se van eliminando los backups con más de 15 días de antigüedad por defecto.
  • Está pensado para ejecutarse una vez al día (podemos programarlo con un cron por ejemplo). Por ejemplo, para ejecutarlo a las 22:45 todos los días podríamos poner el crontab de nuestro usuario:
    45 22 * * * /home/myuser/wp_backup.sh
    
  • Por último, manda un email informando de que el backup ha sido correctamente realizado. NOTA: deberás tener configurado previamente el sistema para que pueda enviar correos a un mailhub externo. Una opción sencilla es configurar SSMTP tal y como explicaba aquí.

En cada caso se podrá personalizar como es obvio el nombre de la BBDD, usuario, pass, directorio DocumentRoot…

Vamos a llamar al script wp_backup.sh:

#!/bin/bash
#
# Title         :wp_backup.sh
# Author        :Julio Sanz
# Website       :www.elarraydejota.com
# Data          :20150717
# Description   :Useful script to backup a WordPress Blog. It backups both WordPress files (contents, core files...) and WordPress database
# Usage         :bash wp_backup.sh
# License       :GPLv3
#
########################################################################################################

# VARIABLES
# Date variable for everyday. It will have the format 20150507 -> year 2015, month 05, day 07
v_date=`date +%F | tr -s  "-" " " | tr -d " "`
# WordPress database user
wpdb_user="your_wordpress_database_user"
# WordPress database password
wpdb_pass="your_wordpress_database_pass"
# WordPress database name
wpdb_dbname="your_wordpress_database_name"
# Email to send a notification when a backup is done
wp_email="youremail@domain.com"
# WordPress installation location (without final slash!) e.g.:/var/www/sites/mysite.com
wp_documentroot="your_wordpress_documentroot"
# WordPress backup destination directory e.g.: /usr/local/backups/wordpress (without final slash!)
wp_backup_dir="your_wordpress_backup_destination_directory"

# MAIN SCRIPT
# Create backup directories
mkdir -p $wp_backup_dir/$v_date/files
mkdir -p $wp_backup_dir/$v_date/database

# Backup files and MySQL WordPress Database
cp -R $wp_documentroot/* $wp_backup_dir/$v_date/files/
mysqldump -u$wpdb_user -p$wpdb_pass -h localhost $wpdb_dbname > $wp_backup_dir/$v_date/database/wpdatabase.sql

# Create TAR file and compress with GZIP
cd $wp_backup_dir
tar -zcvf $v_date.tar.gz $v_date/ --remove-files

# Delete old backups created mtime days ago (15 by default)
find $wp_backup_dir -maxdepth 1 -mtime +15 -exec rm -rf "{}" ";" > /dev/null

# Send mail to confirm that everything has gone as expected
echo 'Backup for your site has been completed' | mail -s "Wordpress backup successfully completed" $wp_email

Podéis personalizarlo como mejor os venga 😉