Replica automatizada de NAS un docker de NextCloud + MariaDB
#1
Hola

Vamos a ver como hacer una réplica de forma automatizada y periódica de dos contenedores interrelacionados desde una nas origen a una destino.

De nuevo lo haré con NextCloud y su BBDD MariaDB.

En este caso la idea es dejar programado el trabajo para que sea realizado por ejemplo durante la noche o en fin de semana.

Todo son variantes de otros hilos, pero en este caso NO usaremos comandos docker para hacer copias de seguridad, simplemente transferiremos TODO el contenido de los contenedores a otra NAS, tras la transferencia se hacen unos pequeños cambios que nos permitan ejecutar el contenedor sin problemas.

Todos los procesos van a ser lanzados desde la nas destino ya que es ahí donde tenemos que hacer más operaciones, y los de la nas origen pueden ser realizados remotamente desde la otra.

Los procesos básicamente son:

  1. preparación de comunicaciones seguras entre ambas nas.
  2. instalación limpia de los contenedores en la nas remota.
  3. detención remota y detención local de los contenedores.
  4. copia de nas origen a destino
  5. activación de los dockers de nas origen
  6. reconfiguración de docker destino
  7. activación de los dockers de nas destino
  8. Construcción de un script para automatizar el proceso
Los punto 1 y 2 sólo hemos de hacerlos una única vez, para las siguientes veces ya no son necesarios.

Todas las operaciones las vamos a hacer con usuarios admin, esto es importante de cara a privilegios.


1-Preparación de comunicaciones entre ambas nas

Lo que vamos a hacer es que la nas destino pueda acceder por ssh a la nas origen sin introducir clave.

Eso se hace generando un certificado en la nas destino e instalado la parte pública en la nas origen.

Para ello primero generamos el certificado desde la consola de la nas destino:
Código:
ssh-keygen -b 4096 -t rsa
a las diversas preguntas que nos haga pulsamos  intro para dejarlos vacíos.

Si ya existe uno, no hace generarlo y usamos el que tengamos.

Ahora hemos de introducirlo en la origen:
Código:
cat ~/.ssh/id-rsa.pub | ssh -p 22 admin@ip_nas_origen 'cat >> ~/.ssh/authorized_keys'
con el anterior comando nos pedirá la clave del usuario admin de la nas origen.

A partir de este momento ya podemos acceder a la nas origen desde la remota por ssh SIN petición de clave.

Vamos a comprobarlo haciendo una búsqueda del archivo "docker" en la nas origen:
Código:
ssh -p 22 admin@ip_nas_origen
Si todo ha ido bien, no nos pide clave y se nos abre el acceso a la consola de la nas origen de forma remota.  Smile

Ahora vamos a ejecutar un comando de búsqueda del archivo "docker"
   

Con el comando anterior, which,  nos muestra la ruta donde está situado "docker".
El "exit" es para volver a la consola local.
Anotamos esa ruta ya que la usaremos mas adelante en la detención de los contendores remotos.


2-instalación limpia de los contenedores en la nas remota

Esto lo hacemos para que QTS tenga la estructura y configuraciones necesarias para que funcionen los contenedores.

Lo mejor es repetir las cadenas de creación usadas en la nas origen de ambos contendores.

En el caso de Mariadb el comando es:
Código:
docker run -d -p 3307:3306 --restart always --name="mariadb-server" --network=Dockers -v /share/DockerData/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=CLAVEROOT -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=CLAVE -e MYSQL_DATABASE=nextcloud_db mariadb:10.5.11

En el caso de NextCloud el comando es:
Código:
docker run -d -p 7080:80 -p 7443:443 --restart always --network=Dockers --name="nextcloud-mariadb" --link mariadb-server:mysql -v /share/DockerData/nextcloud-mariadb/html:/var/www/html -v /share/DockerData/nextcloud-mariadb/apps:/var/www/html/custom_apps -v /share/DockerData/nextcloud-mariadb/config:/var/www/html/config -v /share/DockerData/nextcloud-mariadb/data:/var/www/html/data -v /share/DockerData/nextcloud-mariadb/theme:/var/www/html/themes  -e MYSQL_HOST=mariadb-server:3306 -e MYSQL_DATABASE=nextcloud_db -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=CLAVE -e NEXTCLOUD_ADMIN_USER=admin -e NEXTCLOUD_ADMIN_PASSWORD=CLAVEROOT -e NEXTCLOUD_TRUSTED_DOMAINS="ip_nas_destino:7080 ip_nas_destino:7443"  nextcloud:22.2.0

Si todo ha ido bien, podremos acceder NextCloud limpio yendo desde un navegador a http://ip_nas_destino:7080


3-detención remota y detención local de los contenedores

Ahora vamos a detener todos los contendores tanto locales como remotos.

Recordamos que el comando será algo del tipo "docker stop nombre_contenedor"

Pero para ello debemos saber la ruta donde está el comando.

Empezamos con los contenedores remotos de la nas origen

Primero el de nextcloud-mariadb de la nas origen
Código:
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/DockerData/docker stop mariadb-server"
La ruta "/share/CACHEDEV1_DATA/.qpkg/container-station/bin/docker"  es la que obtuvimos del which de la imagen anterior.
Esta ruta depende del almacenamiento definido en nuestra nas.

Luego detenemos en contenedor NextCloud de la nas origen con el comando siguiente:
Código:
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/DockerData/docker stop nextcloud-mariadb"

Ahora finalizamos en contenedor NextCloud de la nas destino. Que es local y carente de contenido en este momento.
Código:
docker stop nextcloud-mariadb

 y finalmente detenemos el contenedor local de mariadb
Código:
docker stop mariadb-server


4-copia de nas origen a destino

Con los contenedores detenidos, lanzamos la orden de sincronización Rsync de ambas carpetas (de 
Código:
rsync -Aavx -e "ssh -p 22" admin@ip_nas_origen:/share/CACHEDEV1_DATA/DockerData/nextcloud-mariadb/ /share/DockerData/nextcloud-mariadb/
rsync -Aavx -e "ssh -p 22" admin@ip_nas_origen:/share/CACHEDEV1_DATA/DockerData/mariadb/ /share/DockerData/mariadb/
Con esto ya habremos copiado el contenido de ambas carpetas persistentes, dejándolas iguales incluso a nivel de permisos.


5-activación de los dockers de nas origen

Lanzamos los comandos remotos de activación, que son muy similares a los de detención.
Código:
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/DockerData/docker start mariadb-server"
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/DockerData/docker start nextcloud-mariadb"

Con esto la nas origen ya tendrá operativo de nuevo NextCloud


6-reconfiguración de docker destino

Ahora vamos con algo que nos va servir para modificar el archivo de configuración del nextcloud sin llegar a editarlo manualmente.
Usaremos el comando "sed" para substituir la cadena de la "ip_nas_origen" por "ip_nas_destino".

Así cuando arranquemos NextCloud en la nas de destino, tendremos como página de confianza la ip de la nas.
Código:
sed -i "s%ip_nas_origen,%ip_nas_destino,%g" "/share/DockerData/nextcloud-mariadb/config/config.php"


7-activación de los dockers de nas destino

Ahora nos queda levantar los contenedores de la nas destino con los comandos
Código:
docker start mariadb-server
docker start nextcloud-mariadb

Si todo ha ido bien ya tendremos operativo un segundo NextCloud en la nas destino.


8-Construcción de un script para automatizar el proceso

La idea es ahora reunir todos los comandos en la secuencia adecuada (esto es importante) para que mediante la ejecución de un script, se hago todo lo anterior de forma lo más automatizada posible.

El script lo guardamos en la carpeta /share/DockerData de la nas destino con el nombre sincroDocker.sh y tendrá este contenido:
Código:
#!/bin/sh
inicio=$(date +%s)
#detengo los docker de nas remota
echo Deteniendo contenedores remotos
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/.qpkg/container-station/bin/docker stop mariadb-server"
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/.qpkg/container-station/bin/docker stop nextcloud-mariadb"
echo Deteniendo contenedores locales
docker stop mariadb-server
docker stop nextcloud-mariadb
#hacemos sincronizacion sólo de los cambios.
echo Ejecutando sincronización de archivos en una dirección
rsync -Aavx -e "ssh -p 22" admin@ip_nas_origen:/share/CACHEDEV1_DATA/DockerData/nextcloud-mariadb/ /share/DockerData/nextcloud-mariadb/
rsync -Aavx -e "ssh -p 22" admin@ip_nas_origen:/share/CACHEDEV1_DATA/DockerData/mariadb/ /share/DockerData/mariadb/
#iniciamos dockers remotos
echo Iniciando contenedores remotos
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/.qpkg/container-station/bin/docker start mariadb-server"
ssh -p 22 admin@ip_nas_origen "/share/CACHEDEV1_DATA/.qpkg/container-station/bin/docker start nextcloud-mariadb"
#hago cambios de cadenas en archivo de configuracion local
sed -i "s%ip_nas_origen,%ip_nas_destino,%g" "/share/DockerData/nextcloud-mariadb/config/config.php"
#iniciamos dockers locales
echo Iniciando contenedores locales
docker start mariadb-server
docker start nextcloud-mariadb
final=$(date +%s)
resta=$(( $final - $inicio ))
minutos=$(( $resta /60 ))
echo El proceso empleando $minutos minutos o mas exactamente $resta segundos.
He añadido algunos mensajes para informar de las pasos que se van haciendo y el tiempo que tarda en ejecutarlos.
Si va a ser algo programado se pueden comentar insertando un carácter # como primer carácter de la línea.

Recordad que para que sea ejecutable tenemos que cambiarle los atributos con:
Código:
chmod +x /share/DockerData/sincroDocker.sh

Después programamos la ejecución del script en el crontab una vez a la semana, por ejemplo cada domingo de cada mes a las 3:00
Código:
echo -e "00 3 * * 0 /share/DockerData/sincroDocker.sh">> /mnt/HDA_ROOT/.config/crontab

Si lo queremos cada primer y tercer domingo de cada mes Cool , el comando sería el siguiente
Código:
echo -e "00 3 1-7,14-20 * * [ 'date +\%u' = 0 ] && /share/DockerData/sincroDocker.sh">> /mnt/HDA_ROOT/.config/crontab

Y ahora una vez agregada la programación al crontab, lo que haremos es activarla:
Código:
crontab  /etc/config/crontab
/etc/init.d/crond.sh restart


Con todo esto ya tenemos activa la ejecución del script y por tanto la copia de ambos contenedores de una nas a otra.

P.D. como siempre si veis alguna errata, enviadme un mensaje privado para corregirlo.
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be y QHora-301w) Ʀɐɯ0η
  Responder




Usuarios navegando en este tema: 1 invitado(s)