Saltar al contenido principal

Crear backup en Google Drive

· 6 min de lectura
Oscar Adrian Ortiz Bustos

Introducción

Cuando se trata de crear copias de seguridad en lo primero que pienso siempre es es Google Drive; ya que es una de las plataformas más usadas y que más espacio gratuito ofrece. Sin embargo a veces me da flojera tener que estar cargando los archivos manualmente, así que decidí crear un script que combina Bash y Python que me permite hacerlo de forma automática. Si bien en los sistemas operativos de Windows y Mac existe la aplicación de Google Drive, en Linux no existe una aplicación oficial, por lo que tenemos que ingeniarnos la forma de poder subir archivos a Google Drive. Y es por eso que creé este script o aplicación, llámalo como quieras, que me permite subir archivos a Google Drive de forma automática. Lo estoy automatizando con Cron, pero puedes usarlo como quieras. Dado que no soy muy brillante que digamos, decidí llamarlo HomeBack (si, soy muy original).

Requisitos

  • Python 3.6 o superior. Lo puedes descargar desde aquí

  • pip3. Lo puedes instalar con el comando sudo apt install python3-pip o haciendo clic aquí

  • Credenciales de Google.

Obtención de credenciales

Una vez instalados Python y Pip3 es necesario conseguir las credenciales de Google, para eso vamos a ir a este enlace

Nos aparecerá una página como esta:

GoogleCloud

Buscaremos Google Drive y entramos al enlace de Google Drive API

GoogleDriveAPI

Al ingresar a esa página habilitamos la API, en mi caso ya se encuentra habilitada. Después ingresamos a Administrar.

GoogleDriveEnabled

Una vez en esta pantalla nos vamos a la sección de Credenciales.

GDriveCredenciales

A continuación damos click en el botón de Crear Credenciales. Y seleccionamos ID de cliente de OAuth

GoogleDriveOAuth

  • En tipo de aplicación colocamos Aplicación Web
  • Le damos el nombre que deseemos.

Donde nos pide agregar uri colocamos lo siguiente:

  • Orígenes autorizados de Javascript: http://localhost:8080
  • URI de redireccionamiento autorizados: http://localhost:8080/

GDriveURI

Advertencia

Es de suma importancia que en el apartado de "URI de redireccionamiento autorizados" se coloque la diagonal "/" al final.

Una vez agregadas las uri podemos darle clic al botón de Crear.

Nos arrojará la siguiente ventana con la confirmación de la creación de las credenciales. Descargaremos el JSON.

GDriveURI

El archivo descargado lo renombramos como client_secret.json y lo movemos a la carpeta raíz.

Funcionamiento

Diagrama

Es necesario crear un archivo .env con la siguiente estructura:

ID_CARPETA=
CLIENT_ID=
CLIENT_SECRET=

## Sin la de abajo no funciona el script
DIRECTORIO_HOME=/home/<NombreUsuario>
## Sin la de arriba no funciona el script
Nota

El CLIENT_ID y CLIENT_SECRET se encuentran en el archivo JSON descargado.

El ID_CARPETA lo podemos conseguir al ingresar a la carpeta de drive donde queremos guardar el backup, el link se ve de la siguiente manera:

https://drive.google.com/drive/folders/aquiseencuentraeliddecarpeta

Cuando se descarga el archivo settings.yaml del repositorio se deben de modificar las variables CLIENT_ID y CLIENT_SECRET con los que se descargaron en el paso anterior. Se puede dejar con las variables, pero ocasiona error con la autenticación y es necesario autenticarte cada vez que ejecutas el script. De mi parte colocando las credenciales en el archivo settings.yaml no me ha ocasionado ningún problema de seguridad, pero si no te sientes cómodo puedes dejarlo con las variables de entorno.

client_config_backend: settings

client_config:
client_id: {{ CLIENT_ID }}
client_secret: {{ CLIENT_SECRET }}

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials_module.json

get_refresh_token: True

oauth_scope:
- https://www.googleapis.com/auth/drive

Partes de interés

Si quieres curiosear en el código para eso está el repositorio

Para poder excluir carpetas se debe de modificar esta parte del script de bash:

# Carpetas a excluir en la copia de seguridad
declare -A carpetas_excluidas=(
["$HOME/.cache"]='',
["$HOME/.bin"]='',
["$HOME/snap"]='',
["$HOME/.mozilla"]='',
["$HOME/.backup"]='',
["$HOME/.local"]='',
)

Como pudimos ver en el Diagrama de funcionamiento el script de Bash finaliza y ejecuta el script de Python. En el script de Python hay un trozo de código en donde nos permite colocar un máximo de archivos, es decir que nos permite tener varias versiones de la copia de seguridad. Como es sabido las cuentas gratuitas de Google Drive únicamente permiten almacenar 15GB, por lo que podemos dejar ese máximo de archivos en 1. Como se muestra a continuación:


# Carga las variables de entorno desde el archivo .env
load_dotenv()

# Obtiene el ID de carpeta de las variables de entorno
id_carpeta = os.getenv("ID_CARPETA")

# Obtiene las credenciales de la API de Google Drive de las variables de entorno
client_id = os.getenv("CLIENT_ID")
client_secret = os.getenv("CLIENT_SECRET")
directorio_home = os.getenv("DIRECTORIO_HOME")

# Usa las variables de entorno para acceder a la API de Google Drive

if len(sys.argv) < 2:
print("Debes pasar el nombre del archivo como argumento")
sys.exit(1)

max_archivo = 1

nombre_archivo = sys.argv[1]


print("Subiendo archivo: " + nombre_archivo)

Cron

Cron es un poderoso sistema de programación de tareas utilizado en sistemas operativos tipo Unix y sistemas basados en Linux. Este servicio nos permite programar comandos o scripts para que se ejecuten automáticamente en momentos específicos, lo que facilita la automatización de tareas repetitivas y programadas.

La automatización con Cron tiene varias ventajas:

  • Ahorro de tiempo: La automatización de tareas repetitivas ahorra tiempo y esfuerzo, ya que no es necesario ejecutarlas manualmente.
  • Precisión: Cron asegura que las tareas se ejecuten en el momento exacto especificado, evitando posibles errores humanos.
  • Planificación flexible: Permite programar tareas diarias, semanales, mensuales o incluso en horarios más complejos.
  • Administración del sistema simplificada: Cron se utiliza ampliamente para tareas de mantenimiento, copias de seguridad, limpieza de archivos temporales y más.

Estructura de tiempo de Cron

El tiempo en Cron se divide en cinco campos, cada uno indicando cuándo se ejecutará la tarea programada. Los campos son los siguientes:

  1. Minuto (0-59)
  2. Hora (0-23)
  3. Día del mes (1-31)
  4. Mes (1-12) 5 Día de la semana (0-7), donde 0 y 7 representan domingo.
*     *     *     *     *     comando a ejecutar
- - - - -
| | | | |
| | | | +----- día de la semana (0 - 6) (Domingo = 0)
| | | +------- mes (1 - 12)
| | +--------- día del mes (1 - 31)
| +----------- hora (0 - 23)
+------------- minuto (0 - 59)

Usando combinaciones específicas en estos campos, se puede configurar la frecuencia exacta y el momento en que se activarán las tareas.

Ejemplo de uso

Por ejemplo para que el script de HomeBack se ejecute todos los domingos a las 03:00 quedaría así:

0 3 * * 0 /aqui/va/la/ruta/al/script/HomeBack.sh

Conclusiones

La creación del script HomeBack ha sido una solución eficiente y práctica para automatizar la tarea de respaldar archivos en la nube de Google.

HomeBack representa una solución efectiva y accesible para aquellos usuarios de sistemas Linux que deseen respaldar sus archivos de forma automática en Google Drive, brindando tranquilidad y confianza en la preservación de su información importante. El proyecto continúa siendo accesible y está disponible para su exploración y contribución en el repositorio de Github.