WordPress es un popular CMS que usan muchísimos sitios en internet, ya sea para sitios de noticias, blogs, tiendas, etcétera.
Este CMS se compone de archivos para funcionar, además de los archivos que el usuario sube, plugins, temas y finalmente una base de datos en donde están los artículos, páginas y configuraciones del sitio.
En este post voy a mostrarte cómo respaldar toda la instalación de WordPress junto con su base de datos en un archivo que será subido a Google Drive.
Como extra, te mostraré cómo hacer que estos respaldos sean automáticos usando cron.
Requisitos y recomendaciones
Para este post necesitamos las credenciales de acceso de MySQL de WordPress; pues vamos a exportar la base de datos.
También se necesita haber accedido a la cuenta de Google Drive desde Linux, por favor, sigue este sencillo tutorial.
Este post está basado en otros posts:
- Respaldar carpeta de Linux
- Hacer backup base de datos de MySQL en Linux
- Crear respaldo periódico de carpeta de Linux en Google Drive
Recomiendo leerlos, pues lo explicado ahí (en detalle) no será explicado aquí, aunque si no los lees no pasa nada.
Proceso de respaldo de WordPress
Vamos a crear un archivo .tar.gz con toda la instalación de WordPress. A ese archivo le vamos a agregar un export de la base de datos de MySQL.
Después vamos a subir ese respaldo a nuestra cuenta de Google Drive y una vez subido haremos que se elimine de nuestro sistema.
Finalmente vamos a hacer que el script se ejecute cada cierto tiempo con cron.
Hablar es de mal gusto, muéstrame el código
Veamos el script y abajo explico su funcionamiento. Es muy fácil de usar y modificar:
#!/bin/bash
# Script para respaldar instalación y base
# de datos de WordPress
# en Google Drive desde Linux
# By: parzibyte
# Visita: https://parzibyte.me/blog
# Variables de archivos
FECHA_Y_HORA=$(date "+%d-%m-%y_%H-%M-%S")
RUTA_HOME="/home/parzibyte"
# BD. No olvides que este archivo debe existir en la ruta especificada
# más info en: https://parzibyte.me/blog/2019/02/06/script-respaldar-base-de-datos-mysql-mariadb-linux-mysqldump/
ARCHIVO_CNF_MYSQL="$RUTA_HOME/my.cnf"
if [ ! -f "$ARCHIVO_CNF_MYSQL" ]; then
echo "No existe el archivo my.cnf en $ARCHIVO_CNF_MYSQL"
exit 1
fi
# Solo necesitamos el nombre de la base de datos de WordPress
BD_MYSQL="base_de_datos_wordpress"
# El ejecutable de gdrive. Más información
# en: https://parzibyte.me/blog/2019/07/01/administrar-google-drive-linux-gdrive-comandos/
EJECUTABLE_DRIVE="$RUTA_HOME/software/gdrive"
# El archivo de salida
NOMBRE_ARCHIVO="respaldo_wordpress_$FECHA_Y_HORA.tar.gz"
# El archivo de la base de datos
NOMBRE_DUMP_BD="$BD_MYSQL.$FECHA_Y_HORA.sql"
# Carpeta en donde serán guardados
CARPETA_DESTINO="$RUTA_HOME/respaldos"
# Simples concatenaciones
RUTA_ABSOLUTA_ARCHIVO="$CARPETA_DESTINO/$NOMBRE_ARCHIVO"
RUTA_ABSOLUTA_RESPALDO_BD="$CARPETA_DESTINO/$NOMBRE_DUMP_BD"
# Ubicación de la instalación de WordPress
CARPETA_RESPALDAR="/var/www/html/"
# Comandos
echo "Respaldando $BD_MYSQL en $RUTA_ABSOLUTA_RESPALDO_BD usando archivo $ARCHIVO_CNF_MYSQL..."
# Exportar base de datos con MySQLDump
mysqldump --defaults-file=$ARCHIVO_CNF_MYSQL $BD_MYSQL >$RUTA_ABSOLUTA_RESPALDO_BD
if [ ! -f "$RUTA_ABSOLUTA_RESPALDO_BD" ]; then
echo "No existe el respaldo"
exit 1
fi
# Creamos el directorio para los respaldos por si no existe
mkdir -p "$CARPETA_DESTINO"
echo "Creando archivo de respaldo..."
# Crear archivo tar.gz de instalación de WP
tar --ignore-failed-read --create --gzip --file="$RUTA_ABSOLUTA_ARCHIVO" "$CARPETA_RESPALDAR" "$RUTA_ABSOLUTA_RESPALDO_BD"
if [ -f "$RUTA_ABSOLUTA_ARCHIVO" ]; then
echo "Subiendo archivo usando binario de $EJECUTABLE_DRIVE"
# Subir archivo
$EJECUTABLE_DRIVE upload $RUTA_ABSOLUTA_ARCHIVO
echo "Eliminando archivos después de ser subidos"
# Eliminar tar.gz y respaldo de base de datos
rm $RUTA_ABSOLUTA_ARCHIVO
rm $RUTA_ABSOLUTA_RESPALDO_BD
# Mensaje para sentirnos como juanquers
echo "¡OK!"
fi
Comenzando con MySQL, debemos tener un archivo llamado my.cnf en la ruta que se indica. El mío luce así:
[mysqldump]
host=localhost
user=parzibyte
password="hunter2"
Antes de ejecutar el script recomiendo que pruebes iniciar sesión con las credenciales de MySQL que pusiste; o bueno, si tu instalación de WordPress funciona con esas credenciales puedes omitir este paso.
Recuerda poner correcta la ruta del ejecutable de la herramienta de Google Drive y haber puesto tus credenciales anteriormente.
También cambia el nombre de la base de datos de WordPress (pues el usuario, la contraseña y el host estarán en my.cnf)
Finalmente cambia la ruta absoluta de la instalación de WordPress, es decir, la dirección en donde está la carpeta de wp-content, el archivo wp-config.php, etcétera.
Cuando hayas configurado todo, dale permisos de ejecución al script:
chmod +x script.sh
Y después ejecútalo:
./script.sh
Es importante notar que dependiendo de tu servidor y cantidad de archivos, así como la conexión a internet, el proceso tardará un poco más o un poco menos.
Ejecutando el script
Aquí puedes ver una ejecución del script en mi computadora:
Como te lo dije, puedes modificar el archivo a tu gusto.
Agregar archivo a cron
Para que los respaldos sean automáticos hay que editar el crontab con nuestro editor favorito:
crontab -e
Después, agregar algo como lo siguiente:
0 7 * * 1,3,5 bash -c /home/parzibyte/scripts/respaldar_blog.sh
En este caso los respaldos se harán los lunes, miércoles y viernes a las 7 de la mañana; puedes modificar los períodos a tu gusto.
Cuando me pierdo, utilizo esta web para saber los tiempos de cron.
Bonus: enviar correo electrónico cuando se haga un respaldo
Si tenemos sendmail configurado en nuestro entorno, podemos enviar un correo electrónico con los mensajes.
Para ello hay que direccionar la salida y pasarla a través de una tubería hacia sendmail:
0 7 * * 1,3,5 bash -c /home/parzibyte/scripts/respaldar_blog.sh | grep /usr/sbin/sendmail tu_correo@dominio.com
En mi caso mi cron queda así:
Y al probarlo:
Así, cada vez que se haga un respaldo, un correo será enviado.