Mover de NAS un docker de NextCloud + MariaDB
#1
Hola

Vamos a ver como hacer copias de seguridad de la combinación de los contenedores NextCloud y su base de datos MariaDB.
Y que luego podremos restaurar o mover a otra nas.
En ambos caso tenemos definidas rutas persistentes, que es lo habitual para hacer copia de seguridad de estas carpetas. 

Así en caso de desastre, sólo hemos de recuperar estas carpetas y reinstalar el contenedor para que encuentra la cfg y datos anteriores.

Pero en este caso la cosa se complica a que hay una interacción entre NextCloud que guarda/gestiona archivos y la base de datos que registra los archivos y operaciones. 

Y es que podríamos tener una descoordinación entre ambos contenedores y eso haría que la restauración no funcionase.

Y a colación de esto, salió el tema de trasladarlo a una nas secundaria, es decir, hacer una restauración en otra máquina con alguna particularidad final de adaptación.

Lo que vamos a ver son las dos cosas, hacer copias de seguridad y como restaurarlas en otra nas.

En el caso que pongo estoy suponiendo que las imágenes de los contenedores que usamos son iguales en ambas nas. 

Si esto no es así, podríamos tener pequeñas diferencias de definición y funcionamiento entre los contenedores y nos puede ocurrir que no funcionen los datos del contenedor original. 

Es decir, si las arquitecturas de los paquetes de contendores no son la misma, es posible que no podamos hacer el traslado

El guion básico es:
  1. recopilamos las cadenas de comandos de creación de los contenedores iniciales que hicimos en la consola.
  2. puesta en mantenimiento de NextCloud para que no siga habiendo cambios.
  3. copia de seguridad de la base de datos de NextCloud del contenedor de la BBDD.
  4. copia de seguridad de la carpeta persistente de NextCloud.
  5. creación en la nas destino del contenedor de la base de datos (hemos de hacerlo con la misma versión que el original).
  6. creación en la nas destino del contenedor de NextCloud (hemos de hacerlo con la misma versión que el original).
  7. restauramos la copia de seguridad de la base de datos mariaDB de NextCloud en la BBDD de la máquina destino.
  8. recuperación de los datos persistentes de NextCloud en la nas destino.
  9. editamos los archivos de configuración de Nextcloud para salir del mantenimiento y para ajustar las direcciones ip permitidas.
Yo voy a explicarlo ahora con NextCloud y con MariaDB. Con MySQL es igual

Trabajamos en la nas origen


1- Recopilamos las cadenas de comandos de creación de los contenedores iniciales que hicimos en la consola.

En nuestro caso las cadenas de creación de los docker iniciales fueron las siguientes:

Para MariaDB
Code:
docker run -d -p 3307:3306 --restart always --name="mariadb-server" --network=misdockers -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 la definición vemos que internamente se usa el puerto 3306 y que externamente es el 3307.

En este caso para simplificar, obligamos en su momento a la versión del contenedor 10.5.11, pero podía haber sido un latest.
Si hubiese sido "latest" estamos obligados a saber que versión se ha instalado. Esto es así, para que la nas destino vaya a tener la misma versión o una compatible a nivel de copia/restauración.

Para NextCloud se usó la siguiente en la que nos evitamos tener que dar datos en el primer inicio
Code:
docker run -d -p ip_nas:7080:80 -p ip_nas:7443:443 --restart always --network=misdockers --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:7080 ip_nas:7443"  nextcloud:22.2.0

En la definición vemos que internamente se usan el puertos 443 y 80 y que externamente son 7443 y 7080 respectivamente.

En este caso para simplificar, obligamos en su momento a la versión del contenedor 22.2.0

De nuevo, si colocamos "latest" en vez de una versión concreta, se colocará la última publicada. Y debemos tenerlo en cuenta en casos de traslado, para repetir la misma o colocar una compatible.


2-puesta en mantenimiento de NextCloud para que no siga habiendo cambios.

Para ello editamos el archivo /share/DockerData/nextcloud/config/config.php

Podemos hacerlo por consola con "vi" o con el mas amigable WinSCP.

Buscamos la línea donde pone 'maintenance' => false, y la cambiamos por 'maintenance' => true,

Si no existe la esa línea debemos añadirla nosotros mismos.
La colocamos por ejemplo debajo de la línea que comienza por 'version' y escribimos
Code:
'maintenance' => true,

Al guardarlo ya está activo ese modo, como podemos comprobar según la imagen siguiente

   

A partir de ese momento, NextCloud ya no permite el acceso a clientes.
Prefiero tenerlo asó no vaya a ser que un cliente móvil o alguno que no tengamos controlado, nos haga cambios no deseados.

Hay que recordar esto ya que la final de todo debemos salir de este modo si queremos que vuelva a estar operativo.


3-copia de seguridad de la base de datos PotgreSQL de NextCloud del contenedor de la BBDD de la NAS origen

Aquí vamos a hacerlo por consola todo. Cool

primero accedemos a la ruta de la carpeta compartida DockerData que es la persistente donde tenemos las carpetas de los contenedores.
Code:
cd /share/DockerData
Es en esta ruta anterior ejecutaremos todos los comandos que siguen, tanto en la de origen como en la destino.

En el destino crearemos la carpeta compartida DockerData si es que no existe.

Para hacer la copia de seguridad de la base de datos, hemos de usar comandos que NO están dentro del contenedor.

Por ello hemos de lanzar un comando desde fuera que acceda al contenido del contenedor.


El comando sería:
Code:
/usr/local/mariadb/bin/mysqldump --user=nextcloud --password=CLAVE --lock-tables --host=ip_nas --port=3307 --databases nextcloud_db > nextcloud_db.sql
Al ser un comando externo al contenedor, hemos de acceder a su interior usando el puerto 3307 o el que hayamos definido en la creación del contenedor.
Con esto hemos obtenido el archivo de la copia de nombre nextcloud_db.sql en la carpeta /share/DockerData.


4-copia de seguridad de los datos NextCloud de la NAS origen (la carpeta persistente)

Simplemente vamos a comprimir la carpeta persistente de NextCloud, lo hacemos ejecutando los siguientes comando estando en la carpeta /share/DockerData
Code:
docker stop nextcloud-mariadb
tar -zvcf nextcloud.tar.gz nextcloud-mariadb
docker start nextcloud-mariadb

en el segundo comando estamos indicando que se comprime la carpeta "nextcloud-mariadb" . Carpeta que está en /share/DockerData, si es otro nombre lo podemos ver en el comando de creación del contenedor.

Con ello obtenemos el archivo nextcloud.tar.gz y también tenemos el nextcloud_db.sql obtenido en el paso del punto anterior. 
Con ello ya tenemos los archivos de datos necesarios para guardar y/o restaurar mas adelante ambos contenedores.

Estos dos archivos hemos de copiarlos a la otra nas.

Podemos hacerlo de varias formas. La mas fácil es usar WinSCP estando conectado a ambas nas y haciendo un copia pega.
Pero si ya nos sentimos cómodos con la consola Cool y podemos hacerlo por comandos:
Code:
scp -P 22 /share/DockerData/nextcloud_db.sql user_remoto@ip_nas_remota:/share/DockerData/nextcloud_db.sql
scp -P 22 /share/DockerData/nextcloud.tar.gz user_remoto@ip_nas_remota:/share/DockerData/nextcloud.tar.gz

En este comando anterior lo que hago es copiar por ssh usando el puerto 22 (hemos de cambiarlo si la nas remota usa otro).
Si no ponemos "-P 22" también funciona ya que es el puerto que se toma por defecto.

Al ejecutarlo y ser nuestra primera vez entre nas, nos pedirá la aceptación como de confianza de la otra nas al visionar su huella y luego que escribamos la clave del usuario user_remoto de la nas remota (no se ve al escribirla).

Estos mismos comandos lo podemos hacer desde la nas destino, cambiando los orígenes y destinos
PHP Code:
scp -P 22 user_remoto@ip_nas_remota:/share/DockerData/nextcloud_db.sql /share/DockerData/nextcloud_db.sql 
scp 
-P 22 user_remoto@ip_nas_remota:/share/DockerData/nextcloud.tar.gz /share/DockerData/nextcloud.tar.gz 


Trabajamos en la nas destino

Creamos la red de dockers si es que no la tenemos definida.
Daré el mismo nombre que en el original. Si se asigna otro, distinto recordadlo a la hora de crear los nuevos contenedores.
Code:
docker network create misdockers


5-creación en la nas destino del contenedor de la base de datos (hemos de hacerlo con la misma versión que el original).

Esto es importante ya que en determinados casos no es posible restaurar la copia en el nuevo docker.
Eso deberemos hacerlo siempre que en la creación del contenedor no obliguemos a una versión y usemos "latest".

Para ver la versión he usado el contenedor Portainer que es un indispensable en nuestros dockers.
Con el puedes ver variables, versiones,...y muchas cosas mas.

Es decir hemos de instalar un docker de MariaDB que lo haga con esa versión o una que sea compatible con los datos exportados anteriormente.

Usamos el comando de creación en la nas destino. Podríamos cambiar el puerto exterior del contendor por ejemplo
Code:
docker run -d -p 3307:3306 --restart always --name="mariadb-server" --network=misdockers -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


6-creación en la nas destino del contenedor de NextCloud (hemos de hacerlo con la misma versión que el original).

Ejecutamos la instalación limpia de Nextcloud enlazado con la mariaDB anterior

La cadena quedaría así
Code:
docker run -d -p ip_nas:7080:80 -p ip_nas:7443:443 --restart always --network=misdockers --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:7080 ip_nas:7443"  nextcloud:22.2.0

Los parámetros son los mismos que usamos en nuestro NextCloud de la nas origen. Incluso las direcciones de las rutas persistentes.

Pero ip_nas hemos de cambiarla a la ip local de la nas destino.

Le damos unos instantes a que se termine de configurar internamente y si vamos desde un navegador web a la dirección http://ip_de_la_nas:7080 nos saldrá la web con un NextCloud. Un Nextcloud limpio y si datos, excepto el usuario administrador de NextCloud.

   

Ahora detenemos el docker de Nextcloud con el comando (o bien usando Portatiner) 
Code:
docker stop nextcloud-mariadb


7-restauramos la copia de seguridad de la base de datos mariaDB de NextCloud en la BBDD de la máquina destino.

Una vez operativo el docker ya podemos restaurar la base de datos nextcloud_db

Como ya tenemos los archivos de la copia en esa nas en la ruta /share/DockerData, ejecutaremos el comando de restauración
Code:
/usr/local/mariadb/bin/mysql --user root --password --host=ip_nas --port=3307 < nextcloud_db.sql

El comando nos pedirá la clave del usuario "root" que según la definición del contenedor es "CLAVEROOT". 
No veremos en pantalla la clave al escribirla.
Es un comando que ejecutado desde la consola de la nas, introduce datos en el contenedor vía el puerto externo del mismo, el 3307  y no el 3306 interno.

En este punto ya tenemos la base PostgreSQL con los datos de la otra nas (sólo los relativos a NextCloud)


8-recuperación de los datos persistentes de NextCloud en la nas destino.

Para recuperarlo, detenemos el docker de NextCloud y eliminamos el contenido de la carpeta /share/DockerData de la nas destino.
Code:
docker stop nextcloud-postgresql
rm -Rf /share/DockerData/nextcloud-mariadb

Ahora descomprimiremos el archivo nextcloud.tar.gz que nos copiamos desde la otra nas
Code:
cd /share/DockerData
tar -xzvf nextcloud.tar.gz

He agregado el primer cd para asegurarme que estamos en la ruta adecuada.
Evidentemente todas las operaciones anteriores han de hacerse con un usuario con privilegios elevados (por ejemplo el denostado admin) para que restaure los archivos con los permisos iniciales.


9-editamos los archivos de configuración de Nextcloud para salir del mantenimiento y para ajustar las direcciones ip permitidas.

Ahora editamos el archivo /share/DockerData/nextcloud-mariadb/config/config.php para poner fuera de mantenimiento el contenedor y para actualizar las ips permitidas. Ya que se supone que la nas destino tienen una ip distinta de la original (si están en redes distintas puede ser que sean coincidentes)

Antes del cambio tendremos en ambas nas 
   
En la origen cambiamos el valor del estado de mantenimiento y en la de destino cambiaremos además los valores de la ip de las direcciones de confianza.

Tras el cambio sería algo similar a 
   


Ahora arrancamos el docker con el comando
Code:
docker start nextcloud-mariadb

Y si todo ha ido bien ya podemos tenemos nuestro NextCloud con MariaDB operativo en otra nas.

Recordad que nos quedaría pendiente el eliminar los archivos .tar y tar.gz (los podemos usar de copia de seguridad).

En otro hilo cuento como hacerlo con base de datos PostgreSQL, donde veremos que los pasos serán muy similares.


P.D. si veis cualquier errata o error, comentadlo por privado para corregirlo.
Si vais a hacer pruebas, cambiad las clave de las definiciones y no uséis CLAVE y CLAVEROOT  Tongue
Un saludo

Agur eta ondo ibili

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




Users browsing this thread: 2 Guest(s)