Centralizar backups de servidores y ordenadores con BackupPC, utilizando DigitalOcean & Docker

Para que te sitúes un poco, hace tiempo que estoy detrás de una solución generalizada para hacer respaldos de todos los servidores que tenemos activos y los ordenadores que utilizamos en Charrúa. Hasta ahora, en cada servidor, cuenta de cliente u ordenador, teníamos que instalar y ejecutar algún tipo de software o script que desencadene, cada determinado tiempo, la tarea de backup y luego lo transfiera de manera segura a un NAS o a la nube.

Te presento a BackupPC:

BackupPC es un software libre de respaldo disco-a-disco, con una interfaz web. El software es multiplataforma, y puede ejecutarse en cualquier sistema tipo Linux, Solaris o servidor basado en Unix. No se requiere el uso de clientes, ya que el servidor es en sí mismo es cliente para múltiples protocolos que son manejados por otros servicios nativos del sistema operativo.

Wikipedia

En este artículo voy a enseñarte varias cosas, crear un servidor de respaldo en DigitalOcean con CentOS 7, instalar Docker y luego instalar BackupPC. Por último te voy a dejar unos conceptos básicos de como realizar tu primer backup a uno de tus servidores (a los que llamaremos clientes o hosts).

Algo muy interesante a destacar, será que el servidor de respaldo se comunicara con tus otros servidores u ordenadores mediante SSH. De esta manera, cada determinado tiempo, supongamos 1 día, todos tus datos serán respaldados.

1- Crear el droplet en DigitalOcean

Un «droplet» es un servidor virtual privado, o como mejor se conoce VPS. DigitalOcean los llama «droplets».

Lo interesante de esta empresa es que te dan USD 100 para que pruebes de manera gratuita los servicios, mas allá de la calidad del servicio que te prestan. Yo lo utilizo hace ya 3 años, y la verdad no me puedo quejar, ni mis clientes.

Si no tienes una cuenta con ellos, te dejo el enlace para tus USD 100 iniciales https://m.do.co/c/bbd50ca17fc0. Básicamente si te suscribes utilizando este enlace a ti te dan USD 100 y a mi, si en el futuro trabajas con ellos, me darán un pago de USD 25.

Una vez tengas una cuenta creada, crearas tu primer droplet. En mi caso he seleccionado estas opciones:

  • Imagen: CentOS 7.6 x64
  • Plan: Standard USD 5 por mes
  • Datacenter: Frankfurt
  • Opciones adicionales: Monitoring
  • Autenticación: One-time password

Una vez creamos el droplet, DigitalOcean nos envía un correo con la clave del servidor. Dentro del panel del droplet, tenemos un botón Console sobre el margen superior derecho, le damos click.

Esto nos abrirá la consola del servidor donde debemos ingresar el login root y el password que nos han enviado. El sistema nos pedirá cambiar el password generado automáticamente. Es importante no utilizar el usuario root (a menos que sepas lo que haces), para ello, puedes seguir una guía de configuración inicial para CentOS 7: https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7

En la siguiente guía lo que harás será:

  • Crear un super-usuario con privilegios root.
  • Crear una llave SSH en tu ordenador para comunicarte con el servidor de manera segura.
  • Copiar la llave SSH al servidor.
  • Deshabilitar el acceso root al servidor.

Los comandos que debes ejecutar son:

ssh [email protected]_IP_ADDRESS
adduser demo
passwd demo
gpasswd -a demo wheel
gpasswd -a demo wheel

He copiado como luce mi consola para que puedas hacerte una idea de los comandos que he ejecutado. Recuerda que todo esto, lo tienes detallado en la guía mencionada anteriormente. Verás que uso asteriscos *** para ocultar ciertos datos.

Charrua01:~ danielpereyra$ ssh [email protected]***
[email protected]***'s password: 
Last login: Wed Jan 8 13:02:27 2020 from ***
[[email protected] ~]# adduser demo
[[email protected] ~]# passwd demo
Cambiando la contraseña del usuario demo.
Nueva contraseña: 
Vuelva a escribir la nueva contraseña: 
passwd: todos los símbolos de autenticación se actualizaron con éxito.
[[email protected] ~]# gpasswd -a demo wheel
Añadiendo al usuario demo al grupo wheel

Luego en mi ordenador local, en mi caso ya tengo generada la llave SSH, por lo que solo la voy a copiar al droplet, ejecutamos:

ssh-copy-id [email protected]_IP_ADDRESS
Charrua01:~ danielpereyra$ ssh-copy-id [email protected]***
/***/ssh-copy-id: INFO: Source of key(s) to be installed: "/***/.ssh/id_rsa.pub"
/***/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/***/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]***'s password: 

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh '[email protected]***'"
and check to make sure that only the key(s) you wanted were added.

Aquí solo te queda modificar el archivo /etc/ssh/sshd_config para deshabilitar el acceso root al servidor y reiniciar SSH con systemctl reload sshd.

Recuerda que en el caso de que no tengas generada tu llave SSH la deberas generar antes de poder copiarla al servidor.

2- Instalar Docker en CentOS 7

Puedes ver la guía completa en: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-centos-7

sudo yum check-update
curl -fsSL https://get.docker.com/ | sh
sudo systemctl start docker
sudo systemctl status docker

La salida de este último comando debería ser similar a:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
     Docs: https://docs.docker.com
 Main PID: 749 (docker)

3- Instalar y ejecutar BackupPC

El paquete que utilizaremos es adferrand/backuppc y lo puedes ver aquí: https://hub.docker.com/r/adferrand/backuppc/

Probaremos la primera vez, ejecutar el siguiente comando, para que se descargue la imagen, se cree la configuración inicial del paquete y se ejecute:

sudo docker run \
    --name backuppc \
    --publish 80:8080 \
    adferrand/backuppc

Algo interesante a tener en cuenta es que también se crea una llave SSH cuando ejecutamos el contenedor, esta es la clave que utilizaremos para comunicarnos con los ordenadores o servidores (clientes) que queremos respaldar.

En la consola te saldrá todo lo que se esta ejecutando y al final verás algo similar a esto:

Enjoy!
2020-01-08 13:32:24 circus[1] [INFO] Starting master on pid 1
2020-01-08 13:32:24 circus[1] [INFO] Arbiter now waiting for commands
2020-01-08 13:32:24 circus[1] [INFO] backuppc started
2020-01-08 13:32:24 circus[1] [INFO] lighttpd started

Si vemos esto, estamos ejecutando correctamente el servidor lightttpd, iremos al navegador y escribiremos: http://SERVER_IP_ADDRESS. Se nos preguntará por usuario y password, por defecto son:

  • Usuario: backuppc
  • Password: password

Debemos prestar atención a que si finalizamos la ejecución del contenedor, no podremos acceder a BackupPC.
Puedes consultar la documentación del paquete de BackupPC en el enlace https://hub.docker.com/r/adferrand/backuppc/.

Finalizaremos la ejecución del contenedor, en nuestra consola, presionamos control+c. Vamos a ver el siguiente mensaje en consola:

2020-01-08 13:40:56 circus[1] [INFO] Got signal SIG_INT
2020-01-08 13:40:56 circus[1] [INFO] Arbiter exiting
2020-01-08 13:40:56 circus[1] [INFO] backuppc stopped
2020-01-08 13:40:56 circus[1] [INFO] lighttpd stopped

Si probamos ingresar nuevamente en http://SERVER_IP_ADDRESS comprobaremos que no es posible.

Debemos recordar que el contenedor se ha creado y esta con estado stopped, para poder chequearlo ejecutaremos:

sudo docker ps --filter "status=exited"

Lo que nos devolverá

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                     PORTS               NAMES
e54c649339a1        adferrand/backuppc   "/entrypoint.sh /run…"   11 minutes ago      Exited (0) 3 minutes ago                       backuppc

Vamos a eliminar ese contenedor para poder ejecutarlo nuevamente con alguna configuración extra:

sudo docker container prune

El siguiente paso será ejecutar el contenedor en segundo plano configurando algunas opciones, simplemente he copiado las que vienen por defecto en la documentación del paquete.
Recuerda que si tienes o quieres una configuración distinta, deberás modificar los valores a tus necesidades.

sudo docker run -d \
    --name backuppc \
    --publish 80:8080 \
    --volume /var/docker-data/backuppc/etc:/etc/backuppc \
    --volume /var/docker-data/backuppc/home:/home/backuppc \
    --volume /var/docker-data/backuppc/data:/data/backuppc \
    --env ‘BACKUPPC_UUID=1001’ \
    --env ‘BACKUPPC_GUID=1001’ \
    adferrand/backuppc

4- Configuración básica de BackupPC

En el navegador, ingresaremos a la URL donde está nuestro servidor http://SERVER_IP_ADDRESS.

Lo primero que haremos será configurar las opciones de transferencia, en este ejemplo realizaremos un backup a otro servidor web que utiliza Linux.

En el menú de la izquierda, ingresamos en Edit Config.

4.1- Opciones de transferencia.

Una vez dentro de Edit Config ingresamos a Xfer (transferencia) en el menu superior.
Configuraremos 3 opciones:

  • XferMethod: método de transferencia.
    Utilizaremos rsync.
  • RsyncShareName: ruta que queremos respaldar.
    Puedes utilizar / para respaldar el servidor u ordenador completamente. También puedes seleccionar otras rutas o carpetas que quieras respaldar y no hacerlo a todo.
  • BackupFilesExclude: exclusión de archivos.
    Configuraremos esta opción en nuestro caso ya que haremos un respaldo completo y hay ciertas rutas que no nos interesa respaldar ya que pueden provocar que el respaldo nunca se finalize.
    En primer lugar agregaremos un asterisco * y luego agregaremos dos rutas /sys y /proc.

Por último debemos salvar los cambios con el botón Save.

4.2- Opciones de programación.

Una vez dentro de Edit Config ingresamos a Schedule (programación) en el menu superior.

Las opciones por defecto son:

  • Full backup: cada 7 días manteniendo solo la última copia.
  • Incremetal backup: todos los días manteniendo las últimas 6 copias.

Vamos a utilizar las opciones por defecto. Recuerda que si haces cambios debes salvar con el botón Save.
En el caso de que quieras más información, en cada opción puedes hacer click y vas directo a la documentación donde está todo muy bien explicado.

5- Tu primer backup

Para que nuestro servidor de respaldo pueda realizar las tareas, debemos configurar su acceso a ordenadores o servidores (clientes) mediante SSH.

Esto lo haremos copiando la llave SSH del usuario que ejecutará BackupPC a los clientes que queremos respaldar.

Si vamos a la sección número 3 de este artículo, veremos que al ejecutar el contenedor de BackupPC se crea la llave SSH.

Si prestas atención, la segunda vez que ejecutamos el contenedor en segundo plano, hemos definido algunas opciones, entre ellas rutas y que usuario va a utilizar BackupPC.

El usuario que hemos definido es BACKUPPC_UUID=1001 y BACKUPPC_GUID=1001. Estos datos corresponden al usuario que hemos creado en la sección número 1 de este artículo: demo.

Para saber cual es el UUID y el GUID de tu usuario puedes ejecutar el comando:

id demo

Esto te devolverá:

uid=1001(demo) gid=1001(demo) grupos=1001(demo),10(wheel)

Por lo tanto podemos decir que nuestro usuario demo será quien este usando BackupPC y al que se le ha creado la llave SSH.

5.1- Copiar llave SSH

Siguiendo el ejemplo, nuestra llave SSH estaría ubicada dentro de uno de los directorios o rutas que hemos definido al ejecutar por segunda vez el contenedor. Precisamente en /var/docker-data/backuppc/home/.ssh/id_rsa.

Si volvemos a nuestra consola del servidor de respaldo ejecutaremos el siguiente comando para copiar la llave SSH a uno de nuestros clientes:

ssh-copy-id -i /var/docker-data/backuppc/home/.ssh/id_rsa [email protected]_HOST

Si la operación es correcta, hemos copiado nuestra llave SSH al servidor cliente que queremos respaldar. De esta forma nuestro servidor de respaldo, se comunicaría directamente con el cliente mediante SSH.

5.2- Configurar el cliente en BackupPC

Dentro de la interfaz gráfica de BackupPC, haremos click en la opción Edit Hosts del menú lateral. Luego haremos click en Add para añadir un nuevo host (o cliente).

En el campo Host, indicaremos el IP del cliente y en el campo User, ingresaremos nuestro usuario demo.

Recuerda hacer click en Save al finalizar.

5.3- Hacer un respaldo manual

Una vez hemos configurado nuestro host (cliente) vamos a iniciar el primer respaldo manual. Para ello, luego de salvar el host, vamos a recargar la interfaz gráfica. Veremos que aparece por arriba del menu lateral una nuevo campo desplegable y un título Hosts.

Vamos a desplegar el campo y le damos click a nuestro cliente (por el momento es el único que tenemos). Una vez estemos dentro del host, le haremos click al botón Start Full Backup.

Esto comenzará nuestro primer respaldo. Si hay algún tipo de error lo podremos ver en el menú izquierdo, bajo LOG file o LOG files.

6- Conclusión

Hemos creado un VPS en DigitalOcean con CentOS 7, realizamos la configuración inicial del mismo y hemos instalado Docker en el que será nuestro servidor centralizado de respaldo.

A su vez hemos instalado BackupPC desde el paquete adferrand/backuppc para Docker.

Por último hemos configurado el acceso a un cliente mediante SSH y creado nuestro primer respaldo con BackupPC.

Si te he ayudado, comparte ayudando a otros! 🤓