Saltar a contenido

Backups

En esta sección se podrá encontrar información sobre cómo crear scripts de backup así como otros aspectos relacionados.

Backup scripts para servidor clásico

Los siguientes scripts permiten crear un backup de un conjunto de carpetas dentro de otra carpeta, comprimirlos y mandarlo a otro servidor, usando un servidor clásico.

Nota sobre la externalización de las copias

Si se desea externalizar las copias (tal como está en los scripts), es necesario configurar las claves SSH entre los 2 servidores implicados para facilitar su comunicación

Raw Backup

Este script hace una copia "en crudo".

#!/bin/bash

PASS=cat /home/user/.hiddenFileWithPass #(1)!
BACKUP_ROOT_PATH="/home/user/backups" #(2)!
BASE_PROJECTS="/home/user/projects" #(3)!
FOLDERS_TO_BACKUP=("project1" \ #(4)!
                "project2" \
                "project3"
                )
SPECIAL_FOLDERS=("project4") #(5)!

for carpeta in $BASE_PROJECTS/*; do
  if [ -d "$carpeta" ]; then
    FOLDER_TO_BACKUP=$BASE_PROJECTS/$(basename $carpeta) #(6)!
    BACKUP_DEST=$BACKUP_ROOT_PATH/$(basename $carpeta) #(7)!
    if [[ " ${FOLDERS_TO_BACKUP[@]} " =~ " $(basename $carpeta) " ]]; then
      echo $(basename $carpeta)
      cd $FOLDER_TO_BACKUP
      echo "Local backup "$(basename $carpeta)" files..."
      echo $PASS | sudo -S rsync -r . $BACKUP_DEST #(8)!
      echo "Remote backup "$(basename $carpeta)" files..."
      echo $PASS | sudo -S chown -R user: $BACKUP_DEST #(9)!
      echo "Remote backup files..."
      rsync -r $BACKUP_DEST user@XX.XX.XX.XX:/home/user/backups/ #(10)!
      curl -fsS -m 10 --retry 5 -o /dev/null https://healthchecks.example.com/ping/TOKEN/$(basename $carpeta) #(11)!
    elif [[ " ${SPECIAL_FOLDERS[@]} " =~ " $(basename $carpeta) " ]]; then #(12)!
      echo "Special folder $(basename $carpeta)"
      cd $FOLDER_TO_BACKUP
      ./backup.sh
    fi
  fi
done
exit
  1. (Opcional). Fichero oculto, accesible sólo por el propio usuario, que contiene su contraseña. Se usa en caso de necesitar permisos de administrador para ciertas acciones y no tener que pasar la pass en claro en el propio comando
  2. Carpeta raíz donde se ubicaran los backups "en crudo" dentro del propio servidor
  3. Carpeta raíz que contiene las carpetas de las que se quiere hacer backup
  4. Lista de carpetas de las que se quiere hacer backup.
  5. Lista de carpetas "especiales". Puede que la forma de realizar el backup sea diferente para un tipo de carpetas. En ese caso, se realizará el backup acorde a dicho proyecto, que deberá especificarse en un fichero llamado backup.sh dentro de la propia carpeta del proyecto
  6. Ruta a la carpeta del proyecto a copiar (BASE+FOLDER)
  7. Ruta a la carpeta destino del proyecto a copiar (BASE+FOLDER)
  8. Se hace un backup "en crudo" del contenido completo de la carpeta
  9. Se modifican los permisos para que todo el contenido del backup pertenezca al usuario. De esta manera podemos trabajar con ellos sin problemas
  10. Se hace una copia "en crudo" a un servidor externo
  11. (Opcional). Si se usa algún sistema de monitorización, en este punto se manda una notificación de que el proceso ha terminado.
  12. Opción de backup de carpetas especiales

Compress Backup

Este script comprime todos los backups anteriores, los manda a un servidor externo y hace una rotación de 5 días, por lo que siempre se mantendrán las 5 ñultimas copias de seguridad (podría unificarse en caso de ser necesario)

#!/bin/bash
echo "Compressing files..."
DATE=$(date +"%d-%m-%Y") #(1)!
BASE_PROJECT_PATH="/home/user/backups" #(2)!
BACKUP_PATH="/home/user/backups/old_backups" #(3)!
PASS=`cat /home/user/.hiddenFileWithPass` #(4)!
EXCLUDED_FOLDERS=("bk_scripts" "old_backups" "folder3") #(5)!

cd $BACKUP_PATH #(6)!

for carpeta in $BASE_PROJECT_PATH/*; do
  if [ -d "$carpeta" ]; then
    if [[ ! " ${EXCLUDED_FOLDERS[@]} " =~ " $(basename $carpeta) " ]]; then
      echo $(basename $carpeta)
      echo $PASS | sudo -S tar -czf $BACKUP_PATH/$(basename $carpeta).$DATE.tar $BASE_PROJECT_PATH/$(basename $carpeta) #(7)!
    fi
  fi
done

sudo chown user: * #(8)!

echo "Deleting older backups..."
files=$(find $BACKUP_PATH/*.tar -mtime +5 -type f | wc -l)
if [ $files -gt 0 ]; then #(9)!
    find $BACKUP_PATH/*.tar -mtime +5 -exec rm {} \; #(10)!
else
    echo "Not enought files to delete"
fi
echo "Copying files to backup server..."
rsync -rl $BACKUP_PATH/*.$DATE.tar user@XX.XX.XX.XX:/home/user/backups/old_backups #(11)!
echo "Done!"
  1. Fecha actual que se añadirá al nombre del backup
  2. Ruta base de los proyectos a comprimir
  3. Ruta donde se ubicarán los backups comprimidos. En este caso se usa backups_old, ya que en la raíz están los propios proyectos, pero puede elegirse la carpeta que se desee
  4. (Opcional). Fichero oculto, accesible sólo por el propio usuario, que contiene su contraseña. Se usa en caso de necesitar permisos de administrador para ciertas acciones y no tener que pasar la pass en claro en el propio comando
  5. Lista de carpetas que no se quieren comprimir
  6. Nos desplazamos a la carpeta raíz
  7. En este punto es donde se comprimen las carpetas, una por una
  8. Se modifican los permisos para que todo el contenido del backup pertenezca al usuario. De esta manera podemos trabajar con ellos sin problemas
  9. Este check permite controlar cuándo queremos eliminar los ficheros antiguos. Útil, por ejemplo, si sabemos que siempre debe haber un número mínimo de copias y evitar pérdidas accidentales.
  10. Se eliminan los backups anteriores a 5 días
  11. Se exportan los backuos a un servidor externo