Script en Bash para el backup de Nextcloud

4 minutos de lectura

En este articulo articulo expliqué como hacer una copia de seguridad de la Base de Datos y de las carpetas de Nextcloud, si se programa la ejecución del script cada cierto tiempo, mediante cron por ejemplo, surge el problema de que el script va creando backups hasta llenar el disco donde se almacena, no se controla el numero de backups a mantener.

Buscando por Duckduckgo un script que permitiese seleccionar el número de copias a mantener en el disco, encontré este script de Alvaro Reig que permite hacer un backup diferencial manteniendo en el disco un número de backups a elegir.

Yo no quería hacer backups diferenciales por lo que modifiqué su script para que simplemente hiciese un backup de las carpetas y base de datos de Nexcloud mediante el uso de rsync y mysqldump respectivamente, y finalmente comprimir ambos backups en un solo fichero mediante el uso del comando tar.

También he añadido la creación de dos ficheros de logs, uno va registrando la fecha en la que se hizo el backup y el otro log registra si ha producido algún error y el tipo error, durante la realización del backup, y por supuesto, seleccionando el número de backups a mantener en el disco.

El resultado es el siguiente Script, sin duda es mejorable, eres libre de utilizarlo y/o modificarlo, también lo puedes descargar desde GitLab

  1#!/bin/bash
  2
  3############################################################################
  4# Simple backup script. It uses complete and incremental backups, with     #
  5# hard links to simulate snapshots. $FULL_BACKUP_LIMIT controls the        #
  6# frecuency of full backups.It accepts at least one source directory and a #
  7# single destination directory as arguments. Usage:                        #
  8#                                                                          #
  9# incremental_backup.sh SOURCE_DIRECTORY_1 [SOURCE_DIRECTORY_2..N]           #
 10#       DESTINATION_DIRECTORY                                              #
 11# todo: check if the log file exists. rotate                               #
 12#                                                                          #
 13#                                                                          #
 14#  Author: Álvaro Reig González                                            #
 15#  Licence: GNU GLPv3                                                      #
 16#  www.alvaroreig.com                                                      #
 17#  https://github.com/alvaroreig                                           #
 18#                                                                          #
 19#  Modificado: Carlos M.                                                   #
 20#  https://elblogdelazaro.org/                                       #
 21#                                                                          #
 22############################################################################
 23
 24#!/bin/sh
 25
 26DATE=`date +%Y%m%d%H%M%S`
 27DEST_DIR='/media/Nas01/Backups/nextcloud'             # Carpeta destino backup
 28SOURCE_DIRS='/var/www/nextcloud'                      # Carpeta origen backup
 29NXT_BACKUP_STRING=nextcloud-dirbkp-$DATE              # Nombre backup nextcloud
 30BD_BACKUP_STRING=nextcloud-sqlbkp-$DATE               # Nombre backup BD
 31ERROR=0                                               # Control errores
 32
 33BACKUPS_TO_KEEP=7                                     # Numero de Backups a conservar
 34EXCLUSSIONS=" "                                       # ficheros a excluir del backup
 35OPTIONS="-Aax --progress"                             # -n para hacer simular rsync
 36
 37############################################################################
 38# Buscar backups anteriores                                                #
 39############################################################################
 40
 41BACKUPS=`ls -t $DEST_DIR |grep backup-`
 42BACKUP_COUNTER=0
 43BACKUPS_LIST=()
 44
 45for x in $BACKUPS
 46do
 47    BACKUPS_LIST[$BACKUP_COUNTER]="$x"
 48    echo "[" `date +%Y-%m-%d_%R` "]" "backup detectado:" ${BACKUPS_LIST[$BACKUP_COUNTER]}
 49    let BACKUP_COUNTER=BACKUP_COUNTER+1
 50
 51done
 52
 53
 54############################################################################
 55# Borrar backups antiguos, si es necesario                                 #
 56############################################################################
 57
 58if [ $BACKUPS_TO_KEEP -lt ${#BACKUPS_LIST[*]} ]; then
 59  let BACKUPS_TO_DELETE=${#BACKUPS_LIST[*]}-$BACKUPS_TO_KEEP
 60  echo "[" `date +%Y-%m-%d_%R` "]" "Necesario borrar" $BACKUPS_TO_DELETE" backups" $BACKUPS_TO_DELETE
 61
 62  while [ $BACKUPS_TO_DELETE -gt 0 ]; do
 63    BACKUP=${BACKUPS_LIST[${#BACKUPS_LIST[*]}-1]}
 64    unset BACKUPS_LIST[${#BACKUPS_LIST[*]}-1]
 65    echo "[" `date +%Y-%m-%d_%R` "]" "Backup a borrar:" $BACKUP
 66    sudo rm -rf $DEST_DIR"/"$BACKUP
 67    if [ $? -ne 0 ]; then
 68      echo "[" `date +%Y-%m-%d_%R` "]" "####### Error borrando el backup #######"
 69    else
 70      echo "[" `date +%Y-%m-%d_%R` "]" "Backup correctamente borrad0"
 71    fi
 72    let BACKUPS_TO_DELETE=BACKUPS_TO_DELETE-1
 73  done
 74else
 75  echo "[" `date +%Y-%m-%d_%R` "]" "No es necesario borrar backups"
 76fi
 77
 78##########################################################################################
 79#  Backup de la carpeta Nextcloud                                                        #
 80##########################################################################################
 81
 82sudo rsync $OPTIONS  $EXCLUSSIONS $SOURCE_DIRS $DEST_DIR/$NXT_BACKUP_STRING 2>> $DEST_DIR/error.log
 83
 84if [ $? -ne 0 ]; then
 85    echo "####### Error rsync  #######"$'\r' >> $DEST_DIR/error.log
 86    echo -e "rsync fallo el $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> $DEST_DIR/error.log
 87    echo "[" `date +%Y-%m-%d_%R` "]" "####### Error rsync  #######"
 88    ERROR=1
 89else
 90    echo  "[" `date +%Y-%m-%d_%R` "]" "Backup carpeta Nextcloud se realizo correctamente" >> $DEST_DIR/nextcloud-backup.log
 91    echo  "[" `date +%Y-%m-%d_%R` "]" "Backup carpeta Nextcloud se realizo correctamente"
 92fi
 93
 94
 95##########################################################################################
 96# Backup BD Nextcloudd                                                                   #
 97##########################################################################################
 98
 99mysqldump --single-transaction -h localhost -u nextcloud -p'contraseña' nextcloud > $DEST_DIR/$BD_BACKUP_STRING 2>> $DEST_DIR/error.log
100
101if [ $? -ne 0 ]; then
102    echo -e "mysqldump fallo el $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> $DEST_DIR/error.log
103    echo "[" `date +%Y-%m-%d_%R` "]" "####### Error mysqldump  #######"
104    echo "####### Error mysqldump  #######"$'\r' >> $DEST_DIR/error.log
105    ERROR=1
106else
107    echo  "[" `date +%Y-%m-%d_%R` "]" "Backup BD se realizo correctamente" >> $DEST_DIR/nextcloud-backup.log
108    echo  "[" `date +%Y-%m-%d_%R` "]" "Backup BD se realizo correctamente"
109fi
110
111##########################################################################################
112# Si no hay Error, Uno, Comprimo y Borro los Backups                                   #
113##########################################################################################
114
115if [ $ERROR -eq 0 ]; then
116    sudo tar -cvzf $DEST_DIR/backup-nextcloud-$DATE.tar.gz  $DEST_DIR/nextcloud*$DATE 2>> $DEST_DIR/error.log
117    if [ $? -ne 0 ]; then
118        echo "####### Error rsync  #######"$'\r' >> $DEST_DIR/error.log
119        echo -e "tar -cvzf fallo el $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> $DEST_DIR/error.log
120        echo "[" `date +%Y-%m-%d_%R` "]" "####### Error en la ejecucion de tar  #######"
121    else
122        echo  "[" `date +%Y-%m-%d_%R` "]" "tar -cvzf se realizo correctamente" >> $DEST_DIR/nextcloud-backup.log
123        echo  "[" `date +%Y-%m-%d_%R` "]" "tar -cvzf se realizo correctamente"
124        sudo rm -rf $DEST_DIR/$BD_BACKUP_STRING
125        sudo rm -rf $DEST_DIR/$NXT_BACKUP_STRING
126    fi
127fi