Copia de seguridad y restauración en Linux con Duplicity
Duplicity hace copias de seguridad de directorios generando volúmenes cifrados en formato tar y subiéndolos a un servidor de archivos remoto o local. Como duplicity utiliza librsync, los archivos incrementales son eficientes en espacio y solo registran las partes de los archivos que han cambiado desde la última copia de seguridad. Como duplicity utiliza GnuPG para cifrar y/o firmar estos archivos, estarán a salvo del espionaje y/o de la modificación por parte del servidor.
Instalación
Sección titulada «Instalación»Duplicity puede instalarse en Debian / Ubuntu de forma muy sencilla:
$ sudo apt-get install duplicity ncftp python-boto python-paramikoPero no está en los repositorios por defecto de CentOS / RedHat, por lo que debe instalarlo desde otra fuente. Este script le ayudará en el proceso de instalación:
#!/bin/bash
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/duplicity-0.6.18-1.el6.x86_64.rpmwget http://dl.fedoraproject.org/pub/epel/6/x86_64/ncftp-3.2.4-1.el6.x86_64.rpmwget http://dl.fedoraproject.org/pub/epel/6/x86_64/librsync-0.9.7-15.el6.x86_64.rpmwget http://dl.fedoraproject.org/pub/epel/6/x86_64/python-GnuPGInterface-0.3.2-6.el6.noarch.rpmwget http://dl.fedoraproject.org/pub/epel/6/x86_64/python-boto-2.5.2-1.el6.noarch.rpm
rpm -Uvh duplicity-0.6.18-1.el6.x86_64.rpm ncftp-3.2.4-1.el6.x86_64.rpm librsync-0.9.7-15.el6.x86_64.rpm python-GnuPGInterface-0.3.2-6.el6.noarch.rpm python-boto-2.5.2-1.el6.noarch.rpmConceptos básicos de la línea de comandos
Sección titulada «Conceptos básicos de la línea de comandos»Para hacer una copia de seguridad puede ejecutar:
$ duplicity --no-encryption /home/openkm file:///path/to/backupPara verificarla:
$ duplicity --no-encryption verify file:///path/to/backup /home/openkmPara listar los archivos de la copia de seguridad:
$ duplicity --no-encryption list-current-files file:///path/to/backupPara restaurar un solo archivo:
$ duplicity --no-encryption --file-to-restore tomcat-7.0.61/OpenKM.cfg file:///path/to/backup RestoredBackupPreliminares
Sección titulada «Preliminares»En estos scripts se asumen estos valores por defecto:
- El valor de $TOMCAT_HOME es “/home/openkm/tomcat-7.0.61”
- La base de datos de OpenKM se llama “okmdb”.
- El valor de la contraseña de la base de datos de OpenKM es “*secret*”.
- La ubicación del script de servicio de inicio y parada de OpenKM es “/etc/init.d/tomcat”
Script de ejemplo
Sección titulada «Script de ejemplo»El punto de montaje del disco USB puede definirse en /etc/fstab así:
/dev/sdb1 /mnt/backup ext4 defaults 0 0Estas son las secciones globales del script:
- Configuración de las variables globales en la sección ## BEGIN CONFIG ##.
- Comprobación del usuario root en la sección # Check root user.
- Eliminación de la copia de seguridad anterior de la base de datos en la sección # Delete older local database backup.
- Montaje del disco (sección opcional) en la sección # Mount disk.
- Detención de la aplicación (sección opcional) en la sección # Stop tomcat.
- Limpieza de registros (sección opcional) en la sección # Clean logs.
- Copia de seguridad de la base de datos en el sistema de archivos en la sección #Backup database.
- Copia de seguridad del repositorio y del volcado de la base de datos en el destino de la copia, en la sección #Backup and purge old backups.
- Inicio de la aplicación (sección opcional) en la sección # Start tomcat.
- Mostrar estadísticas (sección opcional) en la sección # Status.
- Desmontaje del disco (sección opcional) en la sección # Umount disk.
Explicación de los parámetros de configuración:
| Parámetro | Descripción |
|---|---|
| HOST | El nombre de host del servidor. |
| DATABASE_PASS | La contraseña de la base de datos. El usuario de la base de datos para hacer la copia de seguridad es siempre el usuario root. |
| OPENKM_DB | El nombre de la base de datos de la aplicación. Normalmente se llamará “okmdb”. |
| OPENKM_HOME | La carpeta home de openkm. |
| TOMCAT_HOME | La carpeta home de tomcat. Normalmente dentro de la carpeta OPENKM_HOME. |
| DATABASE_EXP | La carpeta del volcado de la base de datos. Normalmente en el mismo servidor. |
| BACKUP_DIR | Destino de la copia de seguridad. |
Cree un script de copia de seguridad /root/backup.sh
$ sudo su$ vim /root/backup.sh#!/bin/bash### BEGIN CONFIG ##HOST=$(uname -n)DATABASE_PASS="*secret*"OPENKM_DB="okmdb"OPENKM_HOME="/home/openkm"TOMCAT_HOME="$OPENKM_HOME/tomcat-7.0.61"DATABASE_EXP="$OPENKM_HOME/db"BACKUP_DIR="file:///mnt/backup"## END CONFIG ##
# Check root userif [ $(id -u) != 0 ]; then echo "You should run this script as root"; exit; fi
# Delete older local database backupecho -e "### BEGIN: $(date +"%x %X") ###\n"rm -rf $DATABASE_EXPmkdir -p $DATABASE_EXP
# Mount diskif mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR already mounted";else mount "$BACKUP_DIR"; if mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR mounted"; else echo "$BACKUP_DIR error mounting"; exit -1; fifi
# Stop Tomcat/etc/init.d/tomcat stop
# Clean logs#echo "Clean Tomcat temporal files."#rm -rf $TOMCAT_HOME/logs/*#rm -rf $TOMCAT_HOME/temp/*#rm -rf $TOMCAT_HOME/work/Catalina/localhost
# Backup databaseif [ -n "$DATABASE_PASS" ]; then echo "* Backuping MySQL data from $OPENKM_DB..." mysqldump -h localhost -u root -p$DATABASE_PASS $OPENKM_DB > $DATABASE_EXP/mysql_$OPENKM_DB.sql echo "-------------------------------------";fi
# Backup and purge old backupsduplicity remove-older-than 1M --force $BACKUP_DIR/$HOST
if [ $(date +%u) -eq 7 ]; then echo "*** Full Backup ***" duplicity full --no-encryption $OPENKM_HOME $BACKUP_DIR/$HOST RETVAL=$?else echo "*** Incremental Backup ***" duplicity --no-encryption $OPENKM_HOME $BACKUP_DIR/$HOST RETVAL=$?fi
[ $RETVAL -eq 0 ] && echo "*** SUCCESS ***"[ $RETVAL -ne 0 ] && echo "*** FAILURE ***"
# Start Tomcat/etc/init.d/tomcat startecho -e "\n### END: $(date +"%x %X") ###"
# Statusecho "=================================";duplicity collection-status $BACKUP_DIR/$HOSTecho "*********************************";df -h | grep "$BACKUP_DIR"echo "=================================";
# Umount disksyncumount "$BACKUP_DIR"Ampliar el periodo de copia de seguridad
Sección titulada «Ampliar el periodo de copia de seguridad»Modifique la sección # Backup and purge old backups aumentando el valor del parámetro:
--remove-older-than 3MRealizar la copia de seguridad remota
Sección titulada «Realizar la copia de seguridad remota»Modifique la sección ## Config section.
BACKUP_DIR="ftp://user@ftp.domain.es/backup"export FTP_PASSWORD="WhateverPasswordYouSetUp"Modifique la sección # Backup and purge old backups.
# Backup and purge old backupsduplicity remove-older-than 1M --force $BACKUP_DIR/$HOST
if [ $(date +%u) -eq 7 ]; then echo "*** Full Backup ***" duplicity full --no-encryption $OPENKM_HOME $BACKUP_DIR/$HOST RETVAL=$?else echo "*** Incremental Backup ***" duplicity --no-encryption $OPENKM_HOME $BACKUP_DIR/$HOST RETVAL=$?fi
[ $RETVAL -eq 0 ] && echo "*** SUCCESS ***"[ $RETVAL -ne 0 ] && echo "*** FAILURE ***"Modifique la sección # Status.
duplicity collection-status $BACKUP_DIR/$HOSTunset FTP_PASSWORDRealizar la copia de seguridad remota en SMB o CIFS
Sección titulada «Realizar la copia de seguridad remota en SMB o CIFS»Modifique la sección # Mount disk.
# Mount diskif mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR already mounted";else echo "Mounting $BACKUP_DIR ..."; mount -t cifs //REMOTE_SERVER/REMOTE_DIR $BACKUP_DIR -o username=REMOTE_USER,password=REMOTE_PASSWORD,iocharset=utf8,file_mode=0777,dir_mode=0777 if mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR mounted"; else echo "Error mounting $BACKUP_DIR."; exit -1; fifiRealizar la copia de seguridad de PostgreSQL
Sección titulada «Realizar la copia de seguridad de PostgreSQL»Modifique la sección # Backup database
# Backup de PostgreSQLecho "* Backuping PostgreSQL data from $OPENKM_DB..."su postgres -c "pg_dump $OPENKM_DB" > $DATABASE_EXP/pg_$OPENKM_DB.sql
# Databases optimizationssu postgres -c "vacuumdb -a -z" > /dev/nullsu postgres -c "reindexdb -a -q" 2> /dev/nullRealizar la copia de seguridad remota en Amazon S3
Sección titulada «Realizar la copia de seguridad remota en Amazon S3»Modifique la sección ## Config section.
BACKUP_DIR="s3+http://somebucket/somedirectory"export AWS_ACCESS_KEY_ID=""export AWS_SECRET_ACCESS_KEY=""export PASSPHRASE=""Modifique la sección # Backup and purge old backups.
# Backup and purge old backupsif [ $(date +%u) -eq 7 ]; then echo "*** Full Backup ***" duplicity full --no-encryption --s3-use-new-style $OPENKM_HOME $BACKUP_DIR/$HOST RETVAL=$?else echo "*** Incremental Backup ***" duplicity --no-encryption --s3-use-new-style $OPENKM_HOME $BACKUP_DIR/$HOST RETVAL=$?fi
[ $RETVAL -eq 0 ] && echo "*** SUCCESS ***"Modifique la sección # Status.
# Statusduplicity collection-status --s3-use-new-style $BACKUP_DIR/$HOSTunset AWS_ACCESS_KEY_IDunset AWS_SECRET_ACCESS_KEYunset PASSPHRASEConfigurar crontab
Sección titulada «Configurar crontab»Para instalar la tarea cron, ejecute:
$ sudo mkdir /root/logs$ sudo crontab -eAñada estas líneas según su configuración personal:
MAILTO=nomail@openkm.com@daily /root/backup.sh | tee /root/logs/backup.$(date +\%Y.\%m.\%d_\%H.\%M.\%S).logResolución de problemas al eliminar copias de seguridad antiguas
Sección titulada «Resolución de problemas al eliminar copias de seguridad antiguas»Ha configurado Duplicity para hacer una copia de seguridad completa cada 7 días y eliminar las copias de más de 14 días para ahorrar espacio. ¿Qué ocurre si ve un mensaje como este?
Tue May 1 00:00:00 2012Wed May 2 00:00:00 2012Which can't be deleted because newer sets depend on themDuplicity utiliza rsync, que contiene cambios incrementales. Esos archivos no se eliminarán porque, aunque la copia de seguridad pueda tener más de 7 días, existen copias incrementales de menos de 7 días.
Así, pasadas 2 semanas, esos archivos se eliminarán, ya que la copia completa y las copias incrementales tendrán ya 14 días y existirá una copia completa más reciente que la completa y las incrementales.
Restaurar la copia de seguridad
Sección titulada «Restaurar la copia de seguridad»Puede listar las copias de seguridad disponibles:
$ duplicity collection-status /path/to/backupSun Sep 11 05:00:19 2012 4.25 GB 4.25 GB (current mirror)Sun Sep 4 00:00:18 2012 13.3 MB 4.26 GBSun Aug 28 00:00:13 2012 674 MB 4.92 GBSun Aug 21 00:00:14 2012 5.50 MB 4.93 GBSun Aug 14 00:00:16 2012 1.75 MB 4.93 GBSun Aug 7 00:00:12 2012 288 KB 4.93 GBSun Jul 31 00:00:13 2012 43.0 KB 4.93 GBFri Jul 29 10:36:39 2012 5.56 KB 4.93 GBDespués decida restaurar alguna de las copias de seguridad, por ejemplo la realizada el domingo 28 de agosto de 2012 a las 00:00:13:
$ duplicity restore --restore-time 2012-08-28 /path/to/backup /path/to/destinationInformación adicional
Sección titulada «Información adicional»- Using Duplicity to Backup Your Data
- Ubuntu/Debian - Encrypted Incremental Backups With Duplicity on Amazon S3
- Duplicity Backup Howto
- Duplicity URL Format
- Installation and configuration of duplicity for encrypted SFTP remote backup
- Playing with Duplicity backup and restore tool and Amazon S3
- Bash wrapper script for automated backups with duplicity