Copia de seguridad de WordPress y restaurar el sitio en un servidor Linux sin usar plugin

En un tutorial anterior, te mostré cómo instalar WordPress en un servidor Linux. En este artículo, te mostraré cómo hacer una copia de seguridad de tu sitio de WordPress y restaurarlo sin un plugin. Asumo que tienes acceso a tu VPS (servidor virtual privado) o servidor dedicado Linux a través de SSH y conoces algunos comandos básicos de Linux. Si tienes un plan de alojamiento compartido, entonces siento que este artículo no sea para ti.

Copia de seguridad de WordPress

Hacer una copia de seguridad de WordPress sin un plugin

Probablemente sabes que no debes instalar demasiados plugins en tu sitio de WordPress porque eso ralentizará tu sitio. Buenas noticias para aquellos que alojan WordPress en un servidor privado virtual o en un servidor dedicado. Puedes utilizar Linux y el comando MySQL para automatizar su proceso de copia de seguridad de WordPress para que pueda eliminar su plugin de copia de seguridad de WordPress. Lo mejor de todo es que este método de copia de seguridad es gratuito y se puede automatizar.

Para hacer una copia de seguridad de un sitio de WordPress, tenemos que hacer una copia de seguridad de la base de datos y de todos los archivos bajo su directorio webroot. Primero voy a explicar cómo hacer una copia de seguridad de la base de datos.

Copia de seguridad de la base de datos de WordPress

El siguiente comando se aplica tanto a la base de datos MySQL como a la base de datos MariaDB. Para aquellos que no lo saben, MariaDB es un reemplazo de MySQL. Eso significa que el 99% de los comandos de MariaDB son los mismos que los de MySQL. Y le recomiendo encarecidamente que migre a MariaDB si está utilizando MySQL como su servidor de base de datos.

Puedes comprobar si estás usando MariaDB o MySQL ejecutando el siguiente comando en el prompt del shell:

mysql --version

Ejemplo de resultado:

mysql Ver 15.1 Distrib 10.3.22-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Como puedes ver, estoy usando MariaDB. Otro método para detectar si tienes MySQL o MariaDB es iniciar sesión en tu servidor de bases de datos utilizando el cliente MySQL.

sudo mysql -u root

Después de iniciar la sesión, verás un mensaje de bienvenida:

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 102
Server version: 10.3.22-MariaDB-0ubuntu0.19.10.1-log Ubuntu 19.10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Puedes ver que estoy usando la versión 10.3.22 del servidor MariaDB. Si utiliza la base de datos MySQL entonces la versión del servidor será algo así como:

8.0.7-MySQL Community Server (GPL)

Ahora que sabes qué servidor de base de datos estás utilizando, vamos a hacer la copia de seguridad.

Después de entrar en el servidor de bases de datos usando el comando sudo mysql -u root -p, ejecuta el siguiente comando para mostrar todas las bases de datos que tienes en tu servidor. No omita el punto y coma.

show databases;

Ejemplos de resultados:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| wordpress          |
+--------------------+

Normalmente tiene cuatro bases de datos. Cada servidor MySQL/MariaDB incluye las bases de datos infomation_schema, mysql, performance_schema. La última es la base de datos para su Sitio WordPress, que es la única base de datos que necesita respaldar. Introduzca el comando exit para salir de su servidor de bases de datos.

exit;

Ahora usamos la utilidad mysqldump para hacer una copia de seguridad de la base de datos de wordpress.

sudo mysqldump -u root wordpress > wordpress.sql

El comando anterior hará una copia de seguridad de la base de datos de wordpress en un archivo llamado wordpress.sql en el directorio de trabajo actual. Puede cambiar el nombre del archivo de copia de seguridad a su gusto, como miweb.sql. Si encuentras el siguiente error:

mysqldump: Error: Binlogging on server not active

A continuación, debes habilitar el registro binario editando tu archivo de configuración /etc/mysql/my.cnf o /etc/my.cnf dependiendo de tu distribución de Linux.

sudo nano /etc/mysql/my.cnf

o

sudo nano /etc/my.cnf

Coloca el siguiente texto en la sección [mysqld].

log-bin=mysql-bin

Así:

[mysqld]
 user = mysql
 pid-file = /var/run/mysqld/mysqld.pid
 socket = /var/run/mysqld/mysqld.sock
 port = 3306
 basedir = /usr
 datadir = /var/lib/mysql
 tmpdir = /tmp
 lc-messages-dir = /usr/share/mysql
 skip-external-locking
 log-bin=mysql-bin
 #

Guarda y cierra el archivo. A continuación, reinicia tu servidor de bases de datos

sudo systemctl restart mysql

o

sudo systemctl restart mariadb

Ahora utiliza el comando mysqldump anterior para hacer una copia de seguridad de toda tu base de datos de WordPress en un archivo .sql.

También puedes comprimir el archivo de copia de seguridad para que no ocupe demasiado espacio.

sudo mysqldump -u root wordpress | gzip > wordpress.sql.gz

Copia de seguridad de WordPress en Webroot

Tus archivos de programa de WordPress, archivos de tema, archivos de plugins e imágenes subidas están todos en el directorio webroot (directorio web raiz). Su directorio webroot podría ser /var/www/html/ o /usr/share/nginx/html/ o algo así dependiendo de la configuración de tu servidor web.

Para hacer una copia de seguridad de estos archivos de WordPress utilizaremos una utilidad de línea de comandos llamada tar, abreviatura de tap archive. Introduce el siguiente comando en el prompt de tu shell.

sudo tar -cpvzf filename.tar.gz /var/www/html/

El comando anterior tiene 5 opciones, donde:

  • -c significa crear un fichero.
  • -p significa preservar los permisos de los archivos que se archivan.
  • -v: mostrar información detallada.
  • -z significa comprimir el archivo con gzip.
  • -f significa archivo.

filename.tar.gz es el nombre del archivo y /var/www/html/ significa que todos los archivos y directorios bajo el directorio webroot serán archivados y comprimidos. Tu directorio webroot puede ser diferente, así que comprueba la configuración de tu servidor web.

Restaurar la base de datos y los archivos de WordPress en el mismo servidor

Ahora ya sabes cómo hacer una copia de seguridad de tu base de datos y archivos de WordPress, pero no sirve de nada si no sabes cómo restaurarlos.

Restaurar la base de datos de WordPress

Digamos que tu sitio de WordPress ha sido hackeado a través de una vulnerabilidad en un plugin. Si tiene una copia de seguridad de la base de datos, puede restaurar fácilmente el estado original. Introduzca el siguiente comando para importar la base de datos previamente respaldada al servidor de bases de datos MySQL/MariaDB.

sudo mysql -u root wordpress < wordpress.sql

Después de eso, puedes entrar en tu servidor de bases de datos y ver si todas tus bases de datos están importadas.

Restauración de archivos de WordPress

Primero, extrae el tarball

tar -xzvf filename.tar.gz

A continuación, copia los archivos de WordPress en el directorio webroot. Asumo que tu directorio raíz web es /var/www/html/.

sudo cp var/www/html/* /var/www/html/ -R

Envíe por correo electrónico los archivos de copia de seguridad de WordPress

Si quieres enviar por correo electrónico tu archivo de copia de seguridad de la base de datos y el archivo de copia de seguridad de WordPress a tu bandeja de entrada, sigue los siguientes pasos.

Primero, instala heirloom mailx. Heirloom mailx es un fantástico agente de correo (cliente de correo electrónico). Soporta archivos adjuntos y puede enviar correos electrónicos utilizando servidores SMTP externos como Gmail. Vamos a enviar nuestro archivo de copia de seguridad de la base de datos y los archivos de copia de seguridad de WordPress como archivos adjuntos utilizando Gmail como el servidor SMTP.

Instalación de Heirloom Mailx

En un servidor CentOS/RHEL, ejecuta el siguiente comando:

sudo yum install -y mailx

En un servidor Fedora:

sudo dnf install -y mailx

En un servidor Debian/Ubuntu:

sudo apt-get install -y heirloom-mailx

¡Eso es!

Configuración de Gmail como servidor SMTP externo para retransmitir correos electrónicos

Editar el archivo mailrc. En el servidor CentOS/RHEL/Fedora:

sudo vi /etc/mail.rc

en un servidor Debian/Ubuntu

vi ~/.mail.rc

Coloca el siguiente texto en el archivo.

set smtp-use-starttls
set ssl-verify=ignore
set smtp=smtp://smtp.gmail.com:587
set smtp-auth=login
set smtp-auth-user=user-account@gmail.com
set smtp-auth-password=user-password
set from="user-account@gmail.com(Your_Name)"

Sustituye los textos verdes por las credenciales de tu cuenta de Gmail. Guarda y cierra el archivo. Ahora podemos enviar correos electrónicos utilizando el comando de correo como este:

El texto que sigue a echo es el contenido del correo que será canalizado en el comando mail.

echo "website backed up" | mail -v -a backup.sql -a filename.tar.gz -s "wordpress backed up" buzon@dominio.com
  • -v significa verbose, mostrará su estado de conexión con Gmail.
  • -a significa adjunto. puede utilizar varias opciones -a para añadir múltiples adjuntos a su correo electrónico.
  • -s significa asunto.
  • El último argumento es la dirección de correo electrónico del destinatario, como johndoe@gmail.com. Por cierto, puedes enviarte un correo electrónico a ti mismo. Esto significa que la dirección del remitente y la del destinatario pueden ser la misma. También puedes añadir varias direcciones de correo electrónico de destinatarios.

El servidor CentOS/RHEL/Fedora necesita añadir una línea extra al archivo mail.rc. En primer lugar, descarga estos tres archivos en tu servidor, ponlos en el directorio .certs de tu casa. Si estás usando firefox en Linux de escritorio, entonces también puedes encontrar estos archivos en el directorio ~/.mozilla/firefox/.default.

A continuación, añada la siguiente línea al archivo /etc/mail.rc.

set nss-config-dir=/home/<username>/.certs/

Guarda y cierra el archivo. Ahora puedes enviar correos electrónicos usando Gmail como Relay.

Cómo evitar la limitación del tamaño de los archivos adjuntos de Gmail

Gmail limita el tamaño total del archivo adjunto del remitente a 25M, aunque una cuenta de Gmail puede recibir un archivo adjunto de 34M. Sin embargo, los archivos de WordPress tienden a aumentar de tamaño muy rápidamente.  Si tu archivo es mayor de 25M, es posible que quieras dividir tu archivo en varias partes y enviarlas por correo electrónico una por una.

Dividir el archivo

Para ello, vamos a utilizar el comando split. Su sintaxis es la siguiente:

split -b 5M -d tecnolitas.tar.gz <prefix>

El comando anterior significa dividir filename.tar.gz en 5 Megabytes de tamaño del archivo. Puede cambiar 5M por algo menor que sea inferior a 25M. es el nombre que se añadirá a los archivos divididos.

Por ejemplo, si se ejecutas el siguiente comando:

split -b 5M -d tecnolitas.tar.gz wordpress

Obtendrás los siguientes archivos.

-rw-rw-r-- 1 user user 15M Nov 21 01:57 tecnolitas.tar.gz
-rw-rw-r-- 1 user user 5.0M Nov 21 13:46 wordpress00
-rw-rw-r-- 1 user user 5.0M Nov 21 13:46 wordpress01
-rw-rw-r-- 1 user user 4.5M Nov 21 13:46 wordpress02

El archivo tecnolitas.tar.gz está dividido en tres archivos.  Digamos que tu archivo tiene un tamaño de 40 Megabytes. Puede utilizar el siguiente comando:

split -b 25M -d filename.tar.gz wordpress

para obtener un archivo de 25M y otro de 15M. Ahora puedes enviar esos dos archivos a tu cuenta de Gmail. Pero tienes que usar el comando de correo dos veces para enviar cada uno de los archivos, no puedes enviar los dos como archivo adjunto a la vez.

Cómo unirlos

Cuando se restaura el sitio web hay que unir esos archivos divididos. Para ello podemos utilizar el comando cat.

cat wordpress00 wordpress01 > wordpress.tar.gz

Automatización del proceso

Sí, puede automatizar los procesos anteriores. ¿Quién no adora la automatización? Instalaremos cron y lo utilizaremos para programar la tarea de copia de seguridad. Instálalo con los siguientes comandos:

Para el servidor Debian/Ubuntu:

sudo apt-get install cron

Para CentOS/RHEL:

sudo yum install crontabs

Para el servidor Fedora:

sudo dnf install crontabs

Si utiliza systemd, entonces necesita iniciarlo después de la instalación.

sudo systemd start crond

Habilitar el inicio en el arranque del sistema:

sudo systemd enable crond

Programación de la tarea de copia de seguridad de WordPress

Introduzce el siguiente comando en el terminal:

crontab -e

Esto abrirá la tabla cron en la que añadiremos las tareas. Por ejemplo, si queremos hacer una copia de seguridad de la base de datos a las 4 de la mañana todos los días, entonces pon el siguiente texto en ella.

0 4 * * * mysqldump -u root -pyourpassword --all-databases --master-data | gzip > backup.sql.gz

0 4 * * * significa todos los días a las 4:00. Sustituye el texto azul por la contraseña de la base de datos.

A continuación haremos una copia de seguridad de los archivos de WordPress en webroot. Añade el siguiente texto en la siguiente línea.

5 4 * * * tar -cpzf filename.tar.gz /var/www/html/

Si la raíz de tu web no es /var/www/html/ sino otra cosa como /usr/share/nginx/html, entonces cámbiala. Así que hacemos una copia de seguridad de wordpress a las 4:05 todos los días. Luego tenemos que enviarlos como archivos adjuntos a nuestra dirección de correo electrónico.

10 4 * * *  echo "website backed up" | mail -a backup.sql.gz -a filename.tar.gz -s "wordpress backed up" buzon@dominio.com

El comando anterior enviará nuestra copia de seguridad de la base de datos y de los archivos a las 4:10 cada día. Yo separo las tres tareas en intervalos de 5 minutos. Si quieres que ocurran justo después de la anterior, entonces puedes hacer lo siguiente.

0 4 * * * mysqldump -u root -pyourpassword --all-databases --master-data | gzip > backup.sql.gz && tar -cpzf filename.tar.gz /var/www/html/ && echo "website backed up" | mail -a backup.sql.gz -a filename.tar.gz -s "wordpress backed up" recipient@domain.com

El doble ampersand (&&) significa que se ejecuta el siguiente comando cuando el anterior se ha completado con éxito. Así que no tienes que esperar 5 minutos. Pero este formato hará que su archivo crontab sea un poco desordenado.

Si quieres eliminar la copia de seguridad de la base de datos y de los archivos después de haberla enviado por correo electrónico para ahorrar espacio en tu servidor, puedes añadir

15 4 * * * rm backup.sql.gz filename.tar.gz

o simplemente añadir el comando rm usando &&.

Si quieres que tu trabajo cron se ejecute cada hora, puedes hacerlo:

0 * * * *

o una vez cada dos horas

0 */2 * * *

Mueva su sitio de WordPress a un nuevo servidor

Si el proceso de restauración es en su servidor original, entonces ha terminado. Su sitio de WordPress está ahora funcionando correctamente como antes. Pero si transfieres tu sitio desde tu servidor original a otro servidor, sigue las siguientes instrucciones.

  • En primer lugar, debe instalar la pila LAMP o la pila LEMP en el nuevo servidor.
  • A continuación, debes copiar tu archivo de host virtual Apache o Nginx y el archivo del certificado SSL al nuevo servidor. Asegúrese de probar el archivo de host virtual y recargue su servidor web.
  • A continuación, copie los archivos de WordPress al nuevo servidor en el directorio webroot.
  • Después de eso, es necesario crear una base de datos vacía en MySQL/MariaDB en el nuevo servidor, que se describe a continuación.

Abra el archivo de configuración por defecto de WordPress en el directorio webroot.

sudo nano /var/www/html/wp-config.php

Esto abrirá tu archivo wp-config.php y en ese archivo, puedes encontrar el usuario de la base de datos que creaste cuando instalaste WordPress por primera vez y la contraseña del usuario como la siguiente:

/** The name of the database for WordPress */
 define('DB_NAME', 'database-name');
/** MySQL database username */
 define('DB_USER', 'database-username');
/** MySQL database password */
 define('DB_PASSWORD', 'user-password');

Ahora inicia sesión en el servidor de la base de datos utilizando el siguiente comando:

sudo mysql -u root

Crear la base de datos.

create database database-name;

Concede todos los privilegios de la base de datos de WordPress al usuario. Cambia el texto en azul por tus propios datos.

grant all privileges on database-name.* to database-username@localhost identified by 'user-password';

Limpiar los privilegios de la base de datos.

flush privileges;

Salir del servidor de la base de datos.

exit;

Ahora copia el archivo SQL respaldado al nuevo servidor y restaura la base de datos.

sudo mysql -u root wordpress < wordpress.sql

Has transferido con éxito tu sitio de WordPress al nuevo servidor. Cambie su registro DNS y debería ver su sitio de WordPress funcionando correctamente.

Cosas que hay que tener en cuenta antes de eliminar un VPS

Normalmente hago las siguientes cosas antes de borrar un VPS que ya no necesito. Me ayudan a evitar el borrado de software o datos importantes sin migración.

  • Listar los certificados TLS de Let’s Encrypt en el VPS con sudo certbot certificates.
  • Listar los servicios en ejecución en el VPS con sudo netstat -lnptu.
  • Comprueba el uso del disco con sudo ncdu /. Sí, necesitas instalar la utilidad ncdu: sudo apt install ncdu.
  • Comprueba si hay algún trabajo Cron en el VPS con sudo crontab -l.
  • Comprobar el directorio de inicio para ver si tengo algunos archivos allí.

Ya tienes todo el conocimiento para automatizar las copias de seguridad de WordPress, este mismo proceso sirve también para migrar sitios web de un servidor a otro.

¡Que tengas un Ingenioso día!

¡que tengas un ingenioso día!

Contrata tu plan Ingenios@ de Sistemas por 5€ al mes y responderé a todas tus preguntas sobre tecnología en el menor tiempo posible. Pasa a formar parte de la comunidad Ingenios@s de Sistemas y disfruta de contenido exclusivo y aprende sobre sistemas Open Source, Blockchain, SmarContract, Web3, Inteligencia Artificial y Reaidad Virtual, súbete al tren de la Revolución 4.0

Si quieres estar al día y no perderte nada Suscribete al Podcast Ingenios@s de Sistemas, un episodio diario que te mantendrá informado y formado en esta vertiginosa carrera.

Deja un comentario

Share to...