Cómo hacer un respaldo de Nextcloud y enviarlo a otro equipo por SSH

¿Para que?

Como usuario de Nextcloud he tenido la necesidad de hacer un respaldo periódico de mis archivos en Nextcloud. La tarea puede realizarse de diferentes maneras. Por ejemplo puedo entrar desde mi navegador y descargar los archivos a mi computadora. Pero eso no es nada practico ni cómodo, ademas los archivos los tengo que enviar a otra computadora para que se almacenen ahí y no en la mía. y para terminar lo tengo que hacer diario así que después de investigar genere un script que nos permite hacer eso desde la terminal.

¿Que necesitamos?

Bueno hay que mencionar que yo no uso Nextcloud en el navegador y utilizo el cliente de Nextcloud para escritorio asi que tengo una carpeta local que esta sincronizada con la nube. Eso tampoco resuelve el problema por que no guarda versiones anteriores de los archivos.

Buscando encontré varios paquetes en debian 10 (que es el sistema que uso) que son utiles.

[su_box title=”Herramientas”]
ssh – El programa que nos permite conectarnos por el protocolo SSH a otro equipo.
sshpass – El programa que nos permite ingresar la,contraseña del equipo remoto en la misma linea
nextcloud-desktop-cmd – Es el programa para sincronizar nuestros archivos en la nube en una carpeta local
tar – Programa para comprimir archivos
[/su_box]

Instalando lo nescesario


El primer paso seria instalar los paquetes en nuestro sistema con el siguiente comando:

sudo apt install ssh sshpass nextcloud-desktop-cmd tar

Creando el script

Ahora necesitamos crear un archivo de texto plano que sera nuestro script, para hacerlo mas simple lo podemos crear desde la terminal con el nombre nextcloudbackup.sh

nano nextcloudbackup.sh

y dentro de este texto escribiremos lo siguiente reemplazando lo que esta en mayúsculas con tus datos

#!/bin/bash
##Script de respaldo y envio mediante ssh a otro equipo
#Sincronización de Nextcloud
echo "Comenzando sincronización"
nextcloudcmd -u USUARIO_DE_NEXTCLOUD -p CONTRASEÑA_DE_NEXTCLOUD /RUTA_DE_TU_CARPETA_DONDE_SE_DESCARGARAN_TUS_ARCHIVOS DIRECCIÓN_URL_DE_NEXTCLOUD
echo "La sincronización fue exitosa"
#Comprimir carpeta a un archivo TAR
echo "Comprimiendo archivos"
tar -zcvf  NOMBRE_DEL_ARCHIVO_A_CREAR`date +"%Y%m%d"`.tar /RUTA_DE_TU_CARPETA_DONDE_SE_DESCARGARAN_TUS_ARCHIVOS
echo "La compresión fue exitosa"
#Enviar por ssh
echo "Enviando archivos a servidor remoto"
sshpass -p CONTRASEÑA_DEL_EQUIPO_REMOTO scp NOMBRE_DEL_ARCHIVO_A_CREAR`date +"%Y%m%d"`.tar USUARIO_DEL_EQUIPO_REMOTO@DIRECIÓN_DEL_EQUIPO:/RUTA_DONDE_SE_GUARDARA
echo "Los archivos han sido enviados satisfactoriamente"

WTF?

Bueno, explicando un poco el script, es una serie de ordenes a ejecutar en el orden:
1.- Baja todos los archivos de mi cuenta a esta carpeta.
2.-Comprime esa carpeta en un archivo TAR y ademas ponle la fecha de hoy.
3.-Envía el archivo TAR por SSH a otra computadora.

Ahora el script (agregando datos falsos) quedaría algo así:

#!/bin/bash
##Script de respaldo y envio mediante ssh a otro equipo
#Sincronización de Nextcloud
echo "Comenzando sincronización"
nextcloudcmd -u cempazuchitl -p olakase /home/cempazuchitl/nextcloud/ nube.nextcloud.com
echo "La sincronización fue exitosa"
#Comprimir carpeta a un archivo TAR
echo "Comprimiendo archivos"
tar -zcvf  respaldo_nc`date +"%Y%m%d"`.tar /home/cempazuchitl/nextcloud/
echo "La compresión fue exitosa"
#Enviar por ssh
echo "Enviando archivos a servidor remoto"
sshpass -p QuedateEnCasa scp respaldo_nc`date +"%Y%m%d"`.tar bugambilia@nube.cempazuchitl.org:/home/cempazuchitl/respaldos/nextcloud
echo "Los archivos han sido enviados satisfactoriamente"

Ahora guardamos el archivo

Probar el script

Para ejecutar el script necesitamos primero darle permisos de ejecución con el siguiente comando:

sudo chmod +r nextcloudbackup.sh

Y si todo sale bien bastaría con ejecutarlo de alguna de las dos maneras:

#Opcion1
bash nextcloudbackup.sh
#Opción2
./nextcloudbackup.sh

Ahora solo deber confirmar que el respaldo esta hecho y se encuentra en el otro equipo.

Automatizando la tarea

Como este es un proceso que se realizara automáticamente todos los días o semanas o meses (eso tu lo decides) necesitamos automatizarlo

¿Como? Bueno en debían existe un programa llamado CRON que se encarga de ejecutar periódicamente tareas o scripts como el que hemos creado y es muy facil de usar.

Basta con saber dos cosas:
1.-Donde esta nuestro script
2.-Cada cuanto tiempo debe ejecutarse

Para abrir cron en debían basta con escribir (desde la terminal como root):

crontab -e

Se nos abrirá un archivo de texto con nano donde aparecerá esto:

 Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

Básicamente tiene una explicación con la siguiente receta:

Entonces si por ejemplo yo quiero ejecutar mi script todos los días a las 7 AM necesito escribir algo así al final del documento:

0 7 * * * bash /home/cempazuchitl/scripts/nextcloudbackup.sh

Pero si por el contrario lo quiero hacer cada semana el día viernes a las 10 PM quedaría algo asi

0 22 * * 5 bash /home/cempazuchitl/scripts/nextcloudbackup.sh

cuando terminemos debemos guardar y reiniciar el equipo o reiniciar el servicio con:

sudo systemctl restart cron

Notas finales

Es importante señalar que esto me funciono a mi con mis necesidades especificas pero no esta resuelto completamente, pues existen varios problemas aun:

1.- Los archivos TAR se irán acumulando en el equipo remoto y habría que ir borrandolos de alguna manera y automatizada.

2.- También se irán acumulando en mi computadora personal y hay que borrarlos también de manera automatizada.

Aun así resuelve el problema a medias, pero el usar cron tiene varias ventajas como enviar un mail si algo salio mal

Espero que esta nota personal escrita para mi funcione para alguien mas.