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.
[Nota: si tu Redmine está instalado en un servidor Windows, entonces la entrada que te interesa es ésta.]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:
- Hace la copia de la base de datos
- La comprime en un fichero de tipo .gz
- Guarda el fichero en el directorio /backups/database
- Hace una copia del directorio /files de redmine
- La comprime en un fichero de tipo .zip
- 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
¡Espero que te haya servido este consejo! Por favor, comparte el post a través de tus redes sociales si te ha gustado 🙂
Hola, Luís, disculpa lo retrasado de la fecha pero es ahora cuando incursiono en el mundo de Redmine. Por favor, ¿¿hay alguna forma de hacer el respaldo de ficheros y bases de datos en Windows server, tan igual como en linux/unix??
Hola, Víctor. Sí, se podrá hacer. A ver si tengo tiempo y escribo un post sobre eso.
Víctor, he creado una nueva entrada explicando el proceso de realizar una copia de seguridad de Redmine en un servidor Windows: https://luisblasco.com/copia-seguridad-redmine-windows/ Espero que te sirva de guía.