En este tutorial, vamos a desplegar una infraestructura de contenedores, para poner en funcionamiento un servidor Nextcloud usando varios contenedores Docker:
Nextcloud: Contenedor ya preparado, aunque tiene la opción de phpfpm, vamos a usar Apache y lo vamos a poner detràs de un proxy inverso en Nginx.
Mariadb: Contenedor de base de datos Mariadb, un fork de MySQL que presenta un rendimiento superior respeto a MySQL, es necesario para que Nextcloud funcione ya que requiere de una conexión con una base de datos.
Nginx: Contenedor oficial de Nginx, vamos a usarlo para recibir todas las peticiones http y https y las va a direccionar al contenedor Nextcloud, junto a el vamos a poner otro contenedor que va a automatizar la gestión de los certificados SSL con Let’s Encrypt.
Letsencrypt nginx proxy companion: Este contenedor automatiza todo el proceso de creación y renovaciones de certificados para Ngninx con Let’s Encrypt.
Vamos a usar datastores persistentes, pues nos interesa mantener la configuración de los contenedores, como los datos del SQL, la configuración Nginx y certificados SSL además de los datos almacenados en nuestro Nextcloud. Para que todos estos contenedores se comuniquen entre ellos también vamos a crear una red en Docker que va a permitir que solo se puedan ver entre ellos, en excepción de Nginx que si va a ser accesible a internet.
Preparando proxy inverso y SSL.
Vamos a crear una red para que los contenedores se comuniquen entre ellos
docker network create netnext
El siguiente paso es crear el contenedor Nginx para que haga el proxy inverso y atienda a las peticiones http y https que vienen de internet.
docker run --name nginx --net netnext -p 80:80 -p 443:443 \
-v nginx-certs:/etc/nginx/certs \
-v nginx-vhost:/etc/nginx/vhost.d \
-v nginx-conf:/etc/nginx/conf.d \
-v nginx-dhparam:/etc/nginx/dhparam \
-v nginx-html:/usr/share/nginx/html \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
--label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy \
-d --restart always jwilder/nginx-proxy
Ahora vamos a poner en marcha el contenedor que nos va a permitir gestionar los certificados SSL.
docker run --name leproxy --net netnext \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--volumes-from nginx \
-d --restart always jrcs/letsencrypt-nginx-proxy-companion
Desplegando Nextcloud
Ahora que ya tenemos listo el proxy inverso y la gestión de los certificados digitales, ya podemos empezar desplegando Nextcloud, en primer lugar vamos a preparar un contenedor para la base de datos en Mariadb.
docker run --name nextclouddb --net netnext \
-v nextclouddb:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=contraseña-root \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=contraseña-nextcloud \
-d --restart always mariadb
Por último ya podemos desplegar nuestro Nextcloud usando la base de datos de mariadb y el proxy inverso de nginx levantados anteriormente.
docker run --name nextcloud --net netnext \
-v nextcloud-html:/var/www/html \
-v nextcloud-apps:/var/www/html/custom_apps \
-v nextcloud-config:/var/www/html/config \
-v nextcloud-data:/var/www/html/data \
-v nextcloud-theme:/var/www/html/themes/ \
-e MYSQL_HOST=nextclouddb \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=contraseña-nextcloud \
-e VIRTUAL_HOST=direcciondetunextcloud.com \
-e LETSENCRYPT_HOST=direcciondetunextcloud.com \
-e LETSENCRYPT_EMAIL=tu@correo.com \
-d --restart always nextcloud
Accediendo por primera vez a tu Nextcloud
Ahora ya puedes acceder a tu nextcloud con la URL de tu sitio 😉
Lo primero que nos va a pedir es dar de alta un usuario y contraseña de administrador, una vez la entramos Nextcloud va a realizar los ultimos pasos de instal·lación y ya lo vamos a tener listo para usar.
A partir de aquí, puedes administrar tu Nextcloud, como tu necesites, recuerda que los datos se encuentran en volumenes persistentes:
docker volume ls
DRIVER VOLUME NAME
local nextcloud-apps
local nextcloud-config
local nextcloud-data
local nextcloud-html
local nextcloud-theme
local nextclouddb
local nginx-certs
local nginx-conf
local nginx-dhparam
local nginx-html
local nginx-vhost
Alberto Trejo dice
Hola, el tutorial me ha servido mucho, pero hay una parte donde no puedo seguir avanzando, al desplegar nextcloud con :
docker run –name nextcloud –net netnext \
-v nextcloud-html:/var/www/html \
-v nextcloud-apps:/var/www/html/custom_apps \
-v nextcloud-config:/var/www/html/config \
-v nextcloud-data:/var/www/html/data \
-v nextcloud-theme:/var/www/html/themes/ \
-e MYSQL_HOST=nextclouddb \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=contraseña-nextcloud \
-e VIRTUAL_HOST=direcciondetunextcloud.com \
-e LETSENCRYPT_HOST=direcciondetunextcloud.com \
-e LETSENCRYPT_EMAIL=tu@correo.com \
-d –restart always nextcloud
la consola me arroja
Unable to find image ‘alberto.nextcloud.com:latest’ locally
docker: Error response from daemon: pull access denied for alberto.nextcloud.com , repository does not exist or may require ‘docker login’: denied: requested acc ess to the resource is denied.
See ‘docker run –help’.
alberto.nextcloud.com es un dominio ficticio que cree en mi red local, no entiendo que hago mal en esto, ojalá puedas ayudarme.
Sebastián dice
Hola Joan, gracias por tu trabajo. Al intentar acceder al servidor obtengo un 503 Service Temporaly Unavailable. El servidor lo tengo detrás de un router, pero tengo el puerto 443 y 80 configurados hacia el servidor. Podrías echarme una mano?
Gonzalo dice
¿Conseguiste resolverlo?