Contenido

Pequeña mejora en mi script para backups

Como automatizar copias de seguridad

¡Realiza copias!

Tengo un NAS, hacia donde realizo copias de seguridad de fotos, blogs, notas, comprobantes, y documentos en general.

Para esta tarea pueden nombrarse incontables herramientas especialmente pensadas y diseñadas a tal fin.

Sin embargo yo utilizo el siguiente método desde hace ’eones’ y todavía no me falló. No obstante eso, estaba pensando en mejorarlo un poco y finalmente decidí hacer algo parecido pero en Python. Cabe aclarar que no hace exactamente lo mismo pero es un buen apaño para facilitar las copias de seguridad.

Mi script primitivo en Bash:

👍🏻 Lo bueno: Muy sencillo, claro y super-configurable.

👎🏻 Lo malo: Pide contraseña cada vez que se conecta al servidor (requiere configuración para conexión sin contraseña)

#!/bin/bash
# Cambia las carpetas locales (a copiar) y las carpetas remotas de destino según necesidad.
# Backup de:

# Blogs
rsync -r -avz -P --delete /media/datos/javier/carpeta1/ 10.147.20.135:/backup/carpeta1
rsync -r -avz -P --delete /media/datos/javier/carpeta2/ 10.147.20.135:/backup/carpeta2
rsync -r -avz -P --delete /media/datos/javier/carpeta3/ 10.147.20.135:/backup/carpeta3
rsync -r -avz -P --delete /media/datos/javier/carpeta4/ 10.147.20.135:/backup/carpeta4
rsync -r -avz -P --delete /media/datos/javier/carpeta5/ 10.147.20.135:/backup/carpeta5
rsync -r -avz -P --delete /media/datos/javier/carpeta6/ 10.147.20.135:/backup/carpeta6

# Comprobantes
rsync -r -avz -P /media/datos/javier/carpeta7/ 10.147.20.135:/backup/carpeta7

# Documentación
rsync -r -avz -P /media/datos/javier/carpeta8/ 10.147.20.135:/backup/carpeta8

# Dotfiles
rsync -r -avz -P /media/datos/javier/carpeta9/ 10.147.20.135:/backup/carpeta9

# Notas
rsync -r -avz -P /media/datos/javier/carpeta10/ 10.147.20.135:/backup/carpeta10
Recordatorio de algunas opciones de Rsync:

-r Copia recursiva

-a Modo archive incluye: -rlptgoD (no -A,-X,-U,-N,-H)

-v Muestra más información de como va la copia

-z Comprime archivos durante la transferencia

-P Muestra el progreso

–delete Elimina archivos en la carpeta destino que no estén en la de origen

Y más recientemente, eso si, sin querer hacerlo mejor aunque si algo más ’elegante’, tengo este otro más nuevo:

Script en python un poco mejor:

Este script no hace los mismo que el anterior, pero lo hace muy parecido.

👍🏻 Lo bueno: Copia todas las carpetas que se hayan establecido en el archivo de configuración.

👎🏻 Lo malo: Todavía no permite argumentos de Rsync diferentes para cada carpeta

 

import subprocess

# Configuración del archivo de texto y el servidor remoto
file_path = 'backup.conf'  # Reemplaza con la ruta de tu archivo de texto
remote_server = 'javier@nas'  # Reemplaza con tu servidor remoto
remote_folder = '/backup'  # Reemplaza con la carpeta de destino en el servidor remoto

# exclude_list = ["*~", ".*~", "#*#", ".#*", "*.o", ".Trash", ".dropbox", ".st*"]

def create_backup_from_file(file_path, remote_server, remote_folder):
    with open(file_path, 'r') as f:
        local_folders = [line.strip() for line in f if not line.startswith('#')]

    create_backup(local_folders, remote_server, remote_folder)

def create_backup(local_folders, remote_server, remote_folder):
    for folder in local_folders:
        # Construir el comando rsync
        command = [
            'rsync',
            '-avz',
            folder,
            f'{remote_server}:{remote_folder}'
        ]

        # Ejecutar el comando rsync
        subprocess.run(command)


# Crear las copias de seguridad a partir del archivo de texto
create_backup_from_file(file_path, remote_server, remote_folder)

 

Archivo de configuración donde se especifican las carpetas a resguardar:

backup.conf

# Backup de:

# Blogs
/media/datos/javier/carpeta1/
# Comprobantes
/media/datos/javier/carpeta2/
# Documentación
/media/datos/javier/carpeta3/
# Dotfiles
/media/datos/javier/carpeta4/
/media/datos/javier/carpeta5/
/media/datos/javier/carpeta6/
/media/datos/javier/carpeta7/
# Notas
/media/datos/javier/carpeta8/
# Scripts
/media/datos/javier/carpeta9/

 

Debo aclarar que estas líneas de código van cambiando y sufriendo modificaciones casi todo el tiempo. En algún momento, por ejemplo, decido que ya no quiero tener un script con un archivo de configuración por separado y lo cambio.

Espero que les haya resultado interesante.

 

¡Deja tus comentarios aquí !

  Saludos.

 

  Image by jakob5200 from Pixabay

 

Dame feedback!