Cómo hacer una copia de seguridad completa de Redmine

Redmine Full Backup

En este artículo vas a aprender cómo crear una copia de seguridad completa (backup) de toda tu aplicación Redmine, incluyendo archivos y base de datos (MySQL). Y también cómo hacer el mismo proceso de forma desatendida.

Prepara el sistema para la copia de seguridad

En primer lugar crearemos dos directorios donde se almacenarán los volcados de la base de datos y las carpetas de archivos comprimidos una vez realizada la acción de backup. Supongamos que estos dos directorios se hacen en el directorio raíz de nuestro usuarioX y que éste tiene permisos de root en el servidor:

mkdir /home/userx/backups
mkdir /home/userx/backups/database
mkdir /home/userx/backups/files

Supongamos también que la ruta de nuestra aplicación Redmine es como ésta:

/opt/webapps/redmine/htdocs

Comprueba las credenciales de la base de datos

Tendremos que copiar las credenciales de la base de datos para poder lanzar la copia. Ve al archivo /opt/webapps/redmine/htdocs/config/database.yml y anota:

  • el nombre de la base de datos (database)
  • el nombre del usuario (username)
  • la contraseña (password)

También asumimos que el servidor de la base de datos es localhost y el puerto es el estándar 3306.

Crea un script

Ahora es el momento de crear el script que lo hará todo por nosotros con un solo comando. Este es el script:

#! /bin/bash
DATE=`date +"%Y-%m-%d-%H:%M"`
SQLFILE=/home/userx/backups/database/${DATE}-redmine-databasedump.sql
DATABASE=databasename1
USER=userdbY
PASSWORD=841bd86484
# backup de la base de datos (dump)
mysqldump -u ${USER} -p${PASSWORD} ${DATABASE}|gzip>${SQLFILE}.gz
FILES_DATE=`date +"%Y-%m-%d-%H:%M"`
FILE_BACKUP=/home/userx/backups/files/${FILES_DATE}-redmine-filesdump
# backup de los ficheros
zip -r ${FILE_BACKUP}.zip /opt/webapps/redmine/htdocs/files

Nombraremos el fichero del script, por ejemplo: backup-script.sh

Explicación del script

En las primeras líneas del script estamos declarando las variables que utilizaremos en el script. Por supuesto, tendrás que sustituir el nombre de la base de datos, el usuario y la contraseña por los que hayas encontrado en tu archivo database.yml.

Esto es lo que hará el script al lanzarlo:

  1. Hace la copia de la base de datos
  2. La comprime en un fichero de tipo .gz
  3. Guarda el fichero en el directorio /backups/database
  4. Hace una copia del directorio /files de redmine
  5. La comprime en un fichero de tipo .zip
  6. Guarda el fichero zip en el directorio /backups/files

Para lanzar el script manualmente, basta con ir a la línea de comandos SSH y escribir:

sh backup-script.sh

Pulsa Enter y en un par de minutos (dependiendo de lo grande de la base de datos y el directorio de ficheros) el script debería haber creado dos ficheros como éstos:

2022-06-09-11:32-redmine-databasedump.sql.gz
2022-06-09-11:34-redmine-fiesdump.zip

Ahora ve a las carpeta de los backups y comprueba que se han creado.

Hacer la copia de seguridad de Redmine de forma programada y desatendida

Las instrucciones anteriores aplican a una copia de seguridad creada manualmente, pero por supuesto no queremos hacerlo personalmente todos los días. Podemos utilizar los cron job de Linux para realizar la misma acción de forma automática.

Cron job para la copia de seguridad de Redmine

Digamos que queremos que la copia de seguridad completa se realice diariamente a las 3 de la mañana. Bien, tendrás que abrir tu crontab e incluir el cron job que apunta al script. Estos son los pasos:

crontab -e

Ahora incluye esta línea en el crontab:

00 03 * * * sh /opt/webapps/redmine/htdocs/backup-script.sh

Cierra crontab con Ctrl + X y responde Y(es) para que el fichero se guarde.

Ahora la copia de seguridad se hará cada día a las 3 de la mañana.

Política de retención

“Vale, Luis, esto está muy bien, pero no quiero que mi servidor acabe inundado de archivos de backup indefinidamente. Deberíamos destruir los archivos viejos periódicamente y sin supervisión, de la misma manera que los creamos con el script.”

No te preocupes, podemos añadir un par de líneas al script original para que los archivos antiguos se eliminen automáticamente. En este ejemplo dejaremos sólo el último archivo de cada carpeta. Todos los demás archivos de la copia de seguridad se destruirán automáticamente. Comprueba el nuevo script:

#! /bin/bash
DATE=`date +"%Y-%m-%d-%H:%M"`
SQLFILE=/home/userx/backups/database/${DATE}-redmine-databasedump.sql
DATABASE=databasename1
USER=userdbY
PASSWORD=841bd86484
# remove the previous version of the file
find /home/userx/backups/database/* -mmin +1 -exec rm {} \;

# (3) do the mysql database backup (dump)
mysqldump -u ${USER} -p${PASSWORD} ${DATABASE}|gzip>${SQLFILE}.gz
FILES_DATE=`date +"%Y-%m-%d-%H:%M"`
FILE_BACKUP=/home/userx/backups/files/${FILES_DATE}-redmine-filesdump
# (2) in case you run this more than once a day,
# remove the previous version of the file
find /home/userx/backups/files/* -mmin +1 -exec rm {} \;

# (3) do the files backup
zip -r ${FILE_BACKUP}.zip /opt/webapps/redmine/htdocs/files

Las líneas en negrita se han añadido al script original.


Así que finalmente tenemos un script que:

  • realiza una copia de seguridad de la base de datos y de los archivos cada día, almacenando una versión comprimida de los mismos en el directorio de copias de seguridad
  • elimina los archivos de copia de seguridad antiguos para que sólo quede el último en la carpeta

En caso de que quiera dejar los últimos 3 archivos (últimos 3 días), por ejemplo, entonces el script se vería así:

#! /bin/bash
DATE=`date +"%Y-%m-%d-%H:%M"`
SQLFILE=/home/userx/backups/database/${DATE}-redmine-databasedump.sql
DATABASE=databasename1
USER=userdbY
PASSWORD=841bd86484
# remove the previous version of the file
find /home/userx/backups/database/* -mtime +3 -exec rm {} \;
# (3) do the mysql database backup (dump)
mysqldump -u ${USER} -p${PASSWORD} ${DATABASE}|gzip>${SQLFILE}.gz
FILES_DATE=`date +"%Y-%m-%d-%H:%M"`
FILE_BACKUP=/home/userx/backups/files/${FILES_DATE}-redmine-filesdump
# (2) in case you run this more than once a day,
# remove the previous version of the file
find /home/userx/backups/files/* -mtime +3 -exec rm {} \;
# (3) do the files backup
zip -r ${FILE_BACKUP}.zip /opt/webapps/redmine/htdocs/files
NOTA: Si te encuentras con problemas a la hora de hacer la copia de seguridad de la base de datos, de guardar los ficheros en los directorios de backup o de eliminar los ficheros antiguos, eso podría estar causado por el hecho de que el usuario que está lanzando los comandos no tenga permisos suficientes.

¡Espero que te haya servido este consejo! Por favor, comparte el post a través de tus redes sociales si te ha gustado 🙂

Sobre el autor

Deja un comentario

Tu dirección de correo electrónico no será publicada.