Foro QNAP en español
Mover de NAS un docker de NextCloud + PostgreSQL - Versión para impresión

+- Foro QNAP en español (https://www.qnapclub.es)
+-- Foro: GENERAL (https://www.qnapclub.es/forumdisplay.php?fid=3)
+--- Foro: Firmware, Aplicaciones y Tutoriales (https://www.qnapclub.es/forumdisplay.php?fid=39)
+--- Tema: Mover de NAS un docker de NextCloud + PostgreSQL (/showthread.php?tid=4356)



Mover de NAS un docker de NextCloud + PostgreSQL - Ganekogorta - 28-11-2021

Hola

Me plantearon el problema de las copias de seguridad de la combinación de los contenedores NextCloud y el contenedor de su base de datos.

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. 

Ya 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 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 PostgreSQL. Con MariaDB/MySQL es muy similar.


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 PostgreSQL
Código:
docker run -d --name="postgresql" --restart always --network=misdockers -e POSTGRES_USER=nextcloud -e POSTGRES_PASSWORD=CLAVE -e POSTGRES_DB=nextcloud_db -v /share/DockerData/postgresql:/var/lib/postgresql/data postgres

Para NextCloud se usó la siguiente en la que nos evitamos tener que dar datos en el primer inicio
Código:
docker run -d  -p ip_de_la_nas:1080:80 -p ip_de_la_nas:1443:443 --restart always --network=misdockers --name="nextcloud-potgresql" -v /share/DockerData/nextcloud/html:/var/www/html -v /share/DockerData/nextcloud/apps:/var/www/html/custom_apps -v /share/DockerData/nextcloud/config:/var/www/html/config -v  /share/DockerData/nextcloud/data:/var/www/html/data -v /share/DockerData/nextcloud/theme:/var/www/html/themes -e POSTGRES_HOST=postgresql -e POSTGRES_DB=nextcloud_db -e POSTGRES_USER=nextcloud -e POSTGRES_PASSWORD=CLAVE -e NEXTCLOUD_ADMIN_USER=ADMIN_NEXT -e NEXTCLOUD_ADMIN_PASSWORD=CLAVENEXT -e VIRTUAL_HOST=nextcloud.thebest.com -e LETSENCRYPT_EMAIL=userqnap@thebest.com -e NEXTCLOUD_TRUSTED_DOMAINS="ip_de_la_nas:1080 ip_de_la_nas:1443" nextcloud:latest


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,

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

   

A partir de ese momento, NextCloud ya no recibe Wink 

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

De todas formas también podemos evitar la edición anterior si hacemos una parada del contenedor con
Código:
docker stop nextcloud-postgresql


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. Cry

Primero accedemos a la ruta de la carpeta compartida DockerData que es la persistente donde tenemos las carpetas de los contenedores.
Código:
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

luego accedemos al interior del contenedor mediante
Código:
docker exec -it postgresql /bin/bash

Una vez dentro del contenedor hacemos la copia de la base de datos con el comando
Código:
pg_dump -U nextcloud -W -F t nextcloud_db > nextcloud_db.tar

Este comando nos pide la clave de la base de datos. Según la cadena del ejemplo era "CLAVE"

Y nos generará un archivo llamado nextcloud_db.tar que está en el interior del docker.

Para sacarlo y tenerlo en la carpeta compartida escribimos los siguientes comandos
Código:
exit
docker cp postgresql:/nextcloud_db.tar ./nextcloud_db.tar

la primera línea es para salir del contenedor y la segunda para copiar el archivo de copia TAR a la carpeta compartida de la nas


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
Código:
docker stop nextcloud-postgresql
tar -zvcf nextcloud.tar.gz nextcloud
docker start nextcloud-postgresql

Con ello obtenemos el archivo nextcloud.tar.gz y también tenemos el nextcloud_db.tar. Con ello ya tenemos los archivos necesarios para guardar y/o restaurar mas adelante.

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 y podemos hacerlo por comandos:
Código:
scp -P 22 /share/DockerData/nextcloud_db.tar user_remoto@ip_nas_remota:/share/DockerData/nextcloud_db.tar
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)

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.

Estos mismos comandos lo podemos hacer desde la nas destino, cambiando los orígenes y destinos
Código PHP:
scp -P 22 user_remoto@ip_nas_remota:/share/DockerData/nextcloud_db.tar /share/DockerData/nextcloud_db.tar 
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, yo daré el mismo nombre que en el original
Código:
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".

Por ejemplo en PostgreSQL directamente te da el aviso y no lo realiza.

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.

Ponga una captura de ello donde se ve que es una versión 13, concretamente la 13.1

   

Es decir hemos de instalar un docker de PostgreSQL que lo haga con esa versión.

Vamos a la web de dockers para ver que parámetro de etiqueta que hemos poner en nuestra cadena de creación.

   

Vamos a tag y filtramos por 13.1

   

Aquí vemos que hay dos posibles docker, usaremos el de tag "postgres:13.1"

Con ello lo que tendríamos que hacer es ejecutar en la nas destino el comando siguiente para crear un docker compatible con los datos que tenemos en el backup.
Código:
docker run -d --name="postgresql" --network=misdockers --restart always -e POSTGRES_USER=nextcloud -e POSTGRES_PASSWORD=CLAVE -e POSTGRES_DB=nextcloud_db -v /share/DockerData/postgresql:/var/lib/postgresql/data postgres:13.1


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

Nuevamente hemos de ver que versión tenemos de NextCloud en el docker.

Vamos de nuevo a Portatiner y comprobamos que tenemos la versión 21.0.2

   

Luego vamos al hub de dockers para ver que tag hemos de usar en la creación del docker.

   

Con esto la cadena quedaría así
Código:
docker run -d  -p ip_de_la_nas:1080:80 -p ip_de_la_nas:1443:443 --restart always --network=misdockers --name="nextcloud-potgresql" -v /share/DockerData/nextcloud/html:/var/www/html -v /share/DockerData/nextcloud/apps:/var/www/html/custom_apps -v /share/DockerData/nextcloud/config:/var/www/html/config -v  /share/DockerData/nextcloud/data:/var/www/html/data -v /share/DockerData/nextcloud/theme:/var/www/html/themes -e POSTGRES_HOST=postgresql -e POSTGRES_DB=nextcloud_db -e POSTGRES_USER=nextcloud -e POSTGRES_PASSWORD=CLAVE -e NEXTCLOUD_ADMIN_USER=ADMIN_NEXT -e NEXTCLOUD_ADMIN_PASSWORD=CLAVENEXT -e VIRTUAL_HOST=nextcloud.thebest.com -e LETSENCRYPT_EMAIL=userqnap@thebest.com -e NEXTCLOUD_TRUSTED_DOMAINS="ip_de_la_nas:1080 ip_de_la_nas:1443" nextcloud:21.0.2

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

Le damos unos momentos y si vamos a la web ip_de_la_nas:1080 nos saldrá la web

   

Ahora detenemos el docker de Nextcloud con el comando (o bien usando Portatiner) 
Código:
docker stop nextcloud-postgresql


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

Una vez operativo el docker ya podemos restaurar el contenedor.

Como ya tenemos el archivo de la copia en esa nas en la ruta /share/DockerData, hemos de introducirlo en el docker y borrarlo de la carpeta origen.
Código:
docker cp /share/DockerData/nextcloud_db.tar postgresql:/nextcloud_db.tar
rm /share/DockerData/nextcloud_db.tar

ahora nos metemos dentro del docker
Código:
docker exec -it postgresql /bin/bash

y ejecutamos el comando de restauración
Código:
pg_restore --dbname=nextcloud_db -U nextcloud -W --create nextcloud_db.tar
rm nextcloud_db.tar
exit

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.
Código:
docker stop nextcloud-postgresql
rm -Rf /share/DockerData/nextcloud

Ahora descomprimiremos el archivo nextcloud.tar.gz que nos trajimos desde la otra nas
Código:
tar -xzvf nextcloud.tar.gz


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/DaockerData/nextcloud/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)

   

Ahora arrancamos el docker con el comando
Código:
docker start nextcloud-postgresql

Y si todo ha ido bien ya podemos tenemos nuestro NextCloud 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) y tenemos que editar el archivo de cfg del NextCloud de la nas origen y cambiar maintenance true a false, si es que no lo hicimos antes.

En otro hilo se describire como hacerlo si nuestra base de datos es MariaDB/mySQL y veremos que los pasos serán muy similares.