NextCloud en un docker
#1
Hola
Hace poco he tenido un "accidente" en mi máquina virtual de NextCloud por un problema de actualización del Webmin que integraba.
El caso es que en vez de empezar de cero una VM con su Linux server LTS (ahora por la versión 20), fail2ban, webmin, certificados, nextcloud....  he mirado otras formas de instalarlo.
Una sería mediante un QPKG desde el app Center, pero hace tiempo que ese qpkg que hay es de pago (1 € en qnapclub.eu ), dependemos de la buena voluntad del excelente programador Qoolbox, y además luego siempre pasa algo con las actualizaciones.
Así que me he decidido a ver como hacerlo mediante la virtualización ligera de dockers con almacenamiento persistente. 
Esto se hace para conservar datos y no perderlos si eliminamos el contenedor (container).
Como ya sabéis NextClod es un fork (escisión) de OnwCloud, una nube alojada en nuestra NAS.
No os tengo que recordar las ventajas de tener vuestros datos bajo vuestro control  Smile
Bueno, vamos al lío, NextCloud para gestionar el contenido, versiones,... de nuestros archivos usa una base de datos. 
Hay tres posibles: MySQL/mariaDB, PostGreSQL y SQLlite (sólo para hacer pruebas).
Yo voy a explicarlo para hacerlo con MySQL de dos formas:
-Con la de serie que trae nuestra QNAP. Pero no está actualizada y está en la versión 5.5.57
-Con una paralela en otro contenedor de versión 10.4.12 que tiene mas funciones 

Requisitos previos

1-Tenemos que tener instalado en Container Station e iniciado.
La primera vez que lo iniciamos, sale un pequeño asistente. Hacedlo y dejar la ruta "/Container" por defecto. Luego podéis cerrar la aplicación (que no detenerla).
No todas las nas de QNAP lo soportan, deben tener QTS 4.2 o superior, y ser de las de las familias TS-x51,TS-x53x, TS-x55, TxS-x63, TVS-x70, TVS-x71, TS-x73 y los ARM TS-x28, TS-x31, TS-328. Se puede comprobar que modelos ARM de menor potencia pueden usarlo.

2-Vamos a usar la consola o putty. Ya se que desde Container Station podríamos hacerlo, pero creedme que vamos a ir mejor si lo hacemos por consola.

3-Vamos a crear una carpeta compartida llamada "misContenedores", que es donde se quedan los datos de forma persistente.

Definición de la red de contenedores

Abrimos la consola y primero definimos una red llamada "Contenedores" en docker. La cual nos creará un switch virtual.
Código:
docker network create Contenedores

Definición de los contenedores

Ahora vamos a crear un contenedor para la base de datos MariaDB.
Si queréis saltar este paso y usar la base de datos integrada podéis hacerlo, pero recordad que antes ha de estar activada y configurada (hay que saber la clave de su usuario root)
De nuevo desde consola lanzamos las líneas de comando:
Código:
docker run -d -p 3307:3307 --net Contenedores --restart always --name="mariadb-server" -v /share/misContenedores/mariadb:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=laClaveDelRoot -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clavedeusernextcloud -e MYSQL_DATABASE=nextcloud_db \
mariadb:latest

Es importante que:
-la red sea "--net Contenedores", por cierto podemos poner también "--network=Contenedores"
-en la definición de la ruta persistente hayamos incluido la carpeta compartida "-v /share/misContenedores/mariadb:/var/lib/mysql"

En la definición creo en un usuario llamado "nextcloud", su clave es "clavedeusernextcloud" y la base de datos es "nextcloud_db".
Si os fijáis hay tres líneas, pero se puede hacer en una sola si eliminamos el carácter "\". Quedaría algo así:

Código:
docker run -d -p 3307:3307 --net Contenedores --restart always --name="mariadb-server" -v /share/misContenedores/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=laClaveDelRoot -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clavedeusernextcloud -e MYSQL_DATABASE=nextcloud_db mariadb:latest

Esta cadena la podeis copiar ( seleccionando, Ctrl+C )y pegar en Putty con botón secundario del ratón   Wink
Al hacerlo se habrá creado nuestro primer container y si todo está bien, ya estará funcionando y arrancando.
   
Ahora vamos con la creación del contenedor de NextCloud en putty
Código:
docker run -d  -p 11080:80 -p 11443:443 --network=Contenedores --restart always --name="nextcloud-web" -v /share/misContenedores/nextcloud:/var/www/html \
-e MYSQL_HOST=mariadb-server -e MYSQL_DATABASE=nextcloud_db -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clavedeusernextcloud \
-e VIRTUAL_HOST=nextcloud.midominio.es -e LETSENCRYPT_EMAIL=micorreo@midominio.es \
nextcloud:latest

De nuevo lo he puesto en varias líneas, pero si queréis sólo una, el código sería :
Código:
docker run -d  -p 11080:80 -p 11443:443 --network=Contenedores --restart always --name="nextcloud-web" -v /share/misContenedores/nextcloud:/var/www/html -e MYSQL_HOST=mariadb-server -e MYSQL_DATABASE=nextcloud_db -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clavedeusernextcloud -e VIRTUAL_HOST=nextcloud.midominio.es -e LETSENCRYPT_EMAIL=micorreo@midominio.es nextcloud:latest

Al hacerlo se creará un segundo contenedor para nextcloud que dejará datos en la mariaDB del contenedor vecino.
   
Son importantes los siguientes valores:
-referencia "-v /share/misContenedores/nextcloud:/var/www/html" para que queden los datos en una nueva carpeta persistente.
-definición de la variable "-e MYSQL_HOST=mariadb-server", para que vea al contenedor vecino que lo llamamos "mariadb-server" anteriormente.
-definición de la base en la que dejaremos los datos "-e MYSQL_DATABASE=nextcloud_db"
-definición de variable usuario y su clave para acceder a la base de datos "-e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clavedeusernextcloud"
Si queremos usar la mariaDB integrada en la nas, omitiremos en el comando de creación los parámetros "-e MYSQL_HOST=mariadb-server -e MYSQL_DATABASE=nextcloud_db -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clavedeusernextcloud" y es que al iniciar por la web NextCloud, comenzará el asistente. Nos pedirá datos de usuario y del motor de base de datoa a usar. Ahí indicaremos MySQL, el usuario,... y en ubicación del servidor MySQL pondremos la IP local de nuestra nas.
Si queremos acceder a nuestra web de nextcloud, hemos de hacerlo mediante los puertos que definimos en la creación del contenedor.
En nuestro caso 10080 para http y 10443 para https.
Es decir, si nuestra QNAP tiene la ip 192.168.50.25, escribiremos en un equipo de nuestra red "http://192.168.50.25:10080"
Para que funcione la web en https hay que escribir los siguientes comandos en la consola:
Código:
docker exec -it nextcloud-web /bin/bash
apt update
apt install dialog apt-utils
apt install ssl-cert
make-ssl-cert generate-default-snakeoil --force-overwrite
a2enmod ssl
a2ensite default-ssl
service apache2 restart
docker restart nextcloud-web

Con ello ya podremos acceder a "https://192.168.50.25:10443"
Eso sí, tendremos que agregar la excepción de seguridad ya que no es un certificado generado por una entidad autorizada.
La ventaja de usar estos contenedores es:
-poder hacer una copia de seguridad, si lo hacemos de las carpetas compartidas "Container" y "misContenedores" (incluida la MySQL)
-podemos desinstalar los containers, el switch virtual que se generó y la aplicación Dcoker Station y volver a instalarlo rápidamente ya que las imagenes de los contenedores y sus datos persistentes están ahí. También podríamos moverlos a otra NAS  Wink
-tenemos contenedores de con las aplicaciones oficiales en su última versión.
Bueno creo que con esto ya podemos perder el miedo a los contenedores   Tongue
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#2
Genial aporte sobre Nextcloud y contenedores, otra cosa más que tengo pendiente Smile

Probé en su día con el OwnClouwd del repo oficial de QNAP pero no iba muy fino.
TS-253A 2x4TB RAID1 8GB RAM
“La inteligencia es la habilidad de evitar hacer trabajo y conseguir que el trabajo se haga.” (Linus Torvalds)
  Responder
#3
Ganekogorta estupendo manual.
Pero una pregunta lo quiero hacer por MariaDB integrado. La base de datos como el usuario ya los tengo que tener creados en phpMyAdmin? Siempre me da el error "SQLSTATE[HY000] [1045] Access denied for user 'nextcloud_user'@'NAS-RAMOS' (using password: YES)" y no se de que puede ser.

Y una pregunta de autentico novato. Cuando pones en las configuraciones ejemplo: "/share/misContenedores/mariadb:/var/lib/mysql" yo esa carpeta no la podría ver por qfile yo suelo poner "/share/CACHEDEV1_DATA/misContenedores/mariadb:/var/lib/mysql" para que sepa que volumen es. Como ves no tengo mucha idea pero estoy intentado entender... tu no pones el "CACHEDEV1_DATA" xq solo tienes 1???
  Responder
#4
(11-05-2020, 10:53 PM)jeejee escribió: Ganekogorta estupendo manual.
Pero una pregunta lo quiero hacer por MariaDB integrado. La base de datos como el usuario ya los tengo que tener creados en phpMyAdmin? Siempre me da el error "SQLSTATE[HY000] [1045] Access denied for user 'nextcloud_user'@'NAS-RAMOS' (using password: YES)" y no se de que puede ser.
Si, claro, si te fijas, en la definición del contenedor de la base de datos, se crea la base, el usuario de esa base y su clave.

Recomiendo hacer usuarios específicos para cada base de datos y no usar al usuario root y la clave maestra de la MySQL.

También podrías hacerlos desde phpmyadmin, pero ya ves que no hace falta.
(11-05-2020, 10:53 PM)jeejee escribió: Y una pregunta de autentico novato. Cuando pones en las configuraciones ejemplo: "/share/misContenedores/mariadb:/var/lib/mysql" yo esa carpeta no la podría ver por qfile yo suelo poner "/share/CACHEDEV1_DATA/misContenedores/mariadb:/var/lib/mysql" para que sepa que volumen es. Como ves no tengo mucha idea pero estoy intentado entender... tu no pones el "CACHEDEV1_DATA" xq solo tienes 1???
Eso te pasa porque yo la he creado como carpeta compartida y al hacerlo se crea el enlace simbólico en share y me permite acortar la ruta. Tu pones la ruta absoluta y también es válida.

Uso CACHEDEV1_DATA porque es lo habitual, pero ese nombre depende de las estructura raid y el tipo de volumen definido.

Y no hay preguntas de novato, estamos aquí para aprender los unos de los otros y acelerar nuestros conocimientos.




Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TS-453Be y TVS-673)
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#5
Muchas gracias pruebo y te digo si me ha funcionado
  Responder
#6
Buenas tardes
Me da un error y no doy con ello he separado los comandos por si veo cual es el error pero no consigo

Lo he dejado en

docker run -d -p 3307:3307 --network=Contenedores \
--restart always \
--name="mariadb-server" \
-v /share/CACHEDEV1_DATA/DockerVolumes/mariadb:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=clave_root -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clave_nextcloud -e MYSQL_DATABASE=nextcloud_db \
mariadb:latest

y me devuelve


[1] 32115
-sh: n: command not found
[~] # "docker run" requires at least 1 argument.
See 'docker run --help'.

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

[1]+  Done(1)                docker run -d -p 3307:3307 --network=Contenedores --restart always --name="mariadb-server" -v /share/            CACHEDEV1_DATA/DockerVolumes/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=clave_root -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD          =clave_nextcloud
  Responder
#7
Hola

Seguramente tendrás un error que no veo. ¿tal vez sea esta separación "-e MYSQL_PASSWORD          =clave_nextcloud" ?

Las líneas que acaben en "\" indican que el comando continua.

Puedes hacer un copia pega de una sola línea como la siguiente (aquí se ve la ventaja de usar putty y copiar-pegar)

Código:
docker run -d -p 3307:3307 --network=Contenedores --restart always --name="mariadb-server" -v /share/CACHEDEV1_DATA/DockerVolumes/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=clave_root -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=clave_nextcloud -e MYSQL_DATABASE=nextcloud_db mariadb:latest

Si tienes un contenedor del mismo nombre, quítalo antes, ya que no los sobrescribe.
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#8
Ante todo gracias por ayudarme.

Después de hacer pruebas me he dado cuenta que el error me da al poner las claves y password. Te explico:

Si pongo:

Código:
docker run -d -p 3307:3307 --network=Contenedores --restart always --name="mariadb-server" -v /share/CACHEDEV1_DATA/DockerVolumes/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass_root -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=pass_next -e MYSQL_DATABASE=nextcloud_db mariadb:latest


me da error

   

Si solo dejo esta parte si que me lo instala. Pero no me configura el puerto ni el "network" por lo que entiendo que QNAP lo tiene reservado para su servidor integrado.

Código PHP:
docker run --p 3307:3307 --network=Contenedores --restart always --name="mariadb-server" -/share/CACHEDEV1_DATA/DockerVolumes/mariadb:/var/lib/mysql -e MYSQL_DATABASE=nextcloud_db mariadb:latest 

Es decir solo le he puesto que me cree una base de datos, entendiendo que tengo ya los usuarios creados de antes si darme yo cuenta.

Pero cuando voy al docker veo esto en la consola. Y entiendo que me esta pidiendo justo "MYSQL_ROOT_PASSWORD="

   

Como puedo saber si tengo ya usuarios creados?

Gracias por tus consejos y paciencia
  Responder
#9
Hola

Instala phpMyAdmin desde el app center (paquete qpkg )y configúrala para que acceda a la ip de esa mariaDB (será del rango 172.x.y.z).

Desde phpmyadmin es mucho más visual y cómodo gestionar las mysql, sobretodo para los que NO estamos acostumbrados a su línea de comandos.
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#10
phpMyAdmin instalado
Para cambiar configurar la ip que cambio el localhost de config.inc.php ?
al final como el puerto 3307 no me dejaba configurarle le he puesto el 9000. Algun problema? tyambien lo tengo que configurar el puerto en el config.inc.php?

   

Y eskerrikasko por la paciencia!!
  Responder




Usuarios navegando en este tema: 3 invitado(s)