Nextcloud, utilizando Docker y proxy inverso con Nginx
Aprendemos a instalar nuestra propia nube privada con Nextcloud, pero esta vez utilizando la tecnología de contenedores con Docker. De ambos productos ya he hablado largo y tendido en la web de Colaboratorio.net, donde colaboro.
La idea de esta entrada es crear una nube privada, que me sirva para tener sincronizado el contenido gestionado por la herramienta Joplin. De esta forma podré tener siempre al día la información, tanto en el portátil o laptop como en mi dispositivo móvil con sistema operativo Android.
También aprovecho para añadir un poco más de «chicha» al VPS que tengo en Clouding.io, al que ya le he instalado Icecast 2 para la emisión de una radio en directo, Jenkins para la integración continua (por si lo necesito para mi inclusión en el mundo del DevOps), el producto de monitoreo Cacti; todo ello condimentado con un servidor web con Nginx, que utilizo como proxy inverso para todos los productos. Además, un servidor de Minecraft que monté en su día, con la colaboración de mi hermano, para que los compañeros de la clase de mis hijos pudiesen entretenerse.
Despliegue de Nextcloud utilizando Docker
Así que vayamos allá. Para esta entrada he creado un fichero de configuración para Docker Compose. En este he especificado los contenedores que voy a utilizar. El primero es el motor de base de datos MariaDB y el otro el de la propia aplicación.
Nextcloud trabaja por defecto con SQlite, aunque no es lo recomendado para entornos en producción. Por lo que me he decido por MariaDB, la otra opción es PostgreSQL.
Respecto a la base de datos, antes del despliegue debemos definir los datos necesarios para su correcto funcionamiento, esto es, la contraseña de root y de la base de datos, su nombre y el del usuario que la va a administrar.
También he definido una serie de volúmenes, para que la información quede almacenada de forma persistente, aunque se reinicie o apague el contenedor. Estos volúmenes son el de la propia aplicación (/var/www/html), el de la información almacenada (/var/www/html/data) y el de la base de datos (/var/lib/mysql)
Por último, he definido la exposición del puerto 80, por un puerto que tenía disponible en el host.
Aquí os dejo la plantilla:
version: '2'
volumes:
nextcloud:
db:
data:
services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=contrasea
- MYSQL_PASSWORD=contrasea
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
image: nextcloud
ports:
- 8684:80
links:
- db
volumes:
- nextcloud:/var/www/html
- data:/var/www/html/data
restart: always
Esta la plantilla la podemos modificar a nuestro gusto.
Una vez guardado el documento «Docker-compose.yml«, ya podemos generar el entorno, en el mismo directorio donde tengamos el fichero YML
docker-compose up -d
Con un resultado similar al siguiente:
[root@servubuntu nextcloud]# docker-compose up -d
Creating volume "nextcloud_data" with default driver
Creating volume "nextcloud_nextcloud" with default driver
Creating nextcloud_db_1 ... done
Creating nextcloud_db_1 ...
Creating nextcloud_app_1 ... done
Podemos ver que efectivamente se han creado ambos contenedores y están funcionando:
[root@servubuntu nextcloud]# docker ps
CONTAINER ID IMAGE COMMAND CREATED \
STATUS PORTS NAMES
c59e4a045e9d nextcloud "/entrypoint.sh ap..." About a minute ago \
Up About a minute 0.0.0.0:8684->80/tcp nextcloud_app_1
acba20c1699g mariadb "docker-entrypoint..." About a minute ago \
Up About a minute 3306/tcp
Pero antes de continuar, para no tener que acceder por un puerto, vamos a configurar el proxy inverso con Nginx. Para ello vamos a generar un fichero de configuración, tal y como hemos en otras ocasiones.
sudo vi /etc/nginx/sites-available/nextcloud.bitsandlinux.com
Con el siguiente contenido:
server {
listen 80;
listen [::]:80;
server_name nextcloud.bitsandlinux.com;
location / {
proxy_pass http://localhost:8684;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Una vez hecho esto, guardamos y creamos el correspondiente enlace simbólico:
ln -s /etc/nginx/sites-available/nextcloud.bitsandlinux.com /etc/nginx/sites-enabled/
Reiniciamos el servidor web Nginx para que se apliquen los cambios:
sudo systemctl restart nginx
Ahora nos falta una parte fundamental, que es habilitar el acceso HTTPS por el puerto 443, para ello utilizaremos las herramientas y certificados que nos ofrece la iniciativa Let’s Encrypt.
Habilitar HTTPS con Lets Encrypt
Para poder habilitar la conexión HTTPS, debemos instalar la herramienta Certbot:
sudo apt-get install python-certbot-nginx
De esta manera ya podemos utilizar la herramienta:
sudo certbot --nginx
Nos hará una serie de preguntas y al final listará los proyectos web que ha detectado y debemos seleccionar cuál de ellos será al que se le añadirán los certificados. Todo bastante fácil la verdad.
Los paquetes de Certbot vienen con un trabajo cron o un temporizador systemd que renovará los certificados automáticamente antes de que caduquen. No necesitaremos ejecutar Certbot nuevamente, a menos que cambiemos su configuración. Puede probar la renovación automática de los certificados ejecutando este comando:
sudo certbot renew --dry-run
La herramienta añadira la tarea programada en algún de los siguientes lugares:
/etc/crontab/
/etc/cron.*/*
systemctl list-timers
Podemos comprobar el certificado desde la siguiente URL: https://www.ssllabs.com/ssltest/
Instalación web de Nextcloud
Una vez hemos hecho todos estos pasos, toca la instalación vía web. En esta debemos definir el usuario administrador y su contraseña, además de los datos de conexión para la base de datos.
En la parte superior debemos indicar el usuario administrador y su contraseña:
A continuación indicamos donde vamos a guardar los datos (en nuestro caso dejamos la configuración por defecto) y que motor de base de datos vamos a utilizar:
Aquí es muy importante la última casilla, donde indicamos la ubicación de la base de datos y el puerto a utilizar. Recordar que esto ya lo habíamos definido en fichero de configuración del Docker Compose.
De esta manera ya podemos acceder a la aplicación sin problemas:
Y esto es todo. ¿Ya habéis instalado Nextcloud de esta manera? ¿Vuestra configuración es diferente? Me gustaría saber vuestra opinión. Nos vamos leyendo.