Nextcloud es la solución perfecta para una alternativa autohospedada de Google Drive o Dropbox.
No te voy a decir por qué deberías usar Nextcloud. En su lugar, le mostraré cómo instalar el servidor Nextcloud con contenedores Docker.
El tutorial utiliza la configuración del proxy inverso Ngnix para que pueda implementar su instancia de Nextcloud con SSL. De esta manera, su URL de implementación de Nextcloud usará HTTPS y transferirá archivos de forma segura.
Hacia el final del tutorial, compartiré algunos consejos para los usuarios de la nube de Linode para reducir el esfuerzo en la implementación de Nextcloud.
Linodo | La nube abierta independiente para desarrolladores Nuestra misión es acelerar la innovación haciendo que la computación en la nube sea simple, asequible y accesible para todos. LinodeRequisitos
Antes de seguir adelante, algunas cosas deben ser atendidas. Esto es lo que necesita:
- Un servidor Linux ya sea físico, una máquina virtual o en un servidor en la nube.
- Docker y Docker Compose instalados en su servidor Linux. Si necesita ayuda, siga la guía de instalación de Docker en Ubuntu y CentOS. Del mismo modo, puede seguir los tutoriales de instalación de docker-compose en Ubuntu y CentOS.
- Es bueno tener algún conocimiento de Docker y Docker Compose.
- Un nombre de dominio. Esta implementación, como todas las demás del Manual de Linux, se realiza bajo un nombre de dominio real con HTTPS.
- Algo de experiencia con comandos de shell y Linux, ya que hay mucho movimiento allí.
- Acceso a un servicio SMTP como Sendgrid. Lo necesitará para enviar notificaciones por correo electrónico, restablecer la contraseña, etc.
- Tiempo y paciencia.
Implementación del servidor Nextcloud con Docker en proxy inverso
Veamos los pasos uno por uno.
Paso 1:configurar el proxy inverso
Con el proxy inverso, puede implementar varios servicios web en el mismo servidor. Esto no es opcional porque necesita el contenedor let's Encrypt para SSL.
Hay dos formas de configurar el proxy inverso de Ngnix.
Si no está utilizando Linode, consulte mi artículo sobre cómo configurar nginx-reverse-proxy con Docker.
Cómo usar Nginx Reverse Proxy con múltiples aplicaciones Docker Aprenda cómo puede implementar múltiples servicios web en el mismo servidor usando Nginx Reverse Proxy y Docker Containers. Manual de LinuxDebdut ChakrabortySi está usando Linode, le recomiendo que use nuestro StackScript de proxy inverso-jwilder para implementar fácilmente su servidor con todo ya configurado.
La implementación del proxy inverso se debe realizar mediante un archivo Compose separado para que pueda reiniciar o actualizar los servicios web sin alterar la configuración del proxy inverso.
Ya preparé los archivos de redacción en nuestro repositorio público de GitHub. Dado que este no es un artículo detallado sobre la implementación del proxy inverso, no entraré en los detalles del archivo Compose.
Puedes usar git
o wget
para descargar los archivos. Si usa git
, clona todo el repositorio:
git clone https://github.com/linuxhandbook/tutorial-snippets && \
cd tutorial-snippets/Reverse_Proxy
De lo contrario, simplemente descargue los archivos necesarios:
mkdir -p ~/Reverse_Proxy && cd ~/Reverse_Proxy
for file in max_upload_size.conf env.example docker-compose.yaml; do
wget https://raw.githubusercontent.com/linuxhandbook/tutorial-snippets/main/Reverse_Proxy/${file}
done
Hay tres archivos aquí:
- env.example:cámbiele el nombre a .env y cambie el valor de
DEFAULT_EMAIL
a tu correo electrónico - max_upload_size.conf:este archivo garantiza que pueda cargar archivos de hasta 1 GB (el valor predeterminado es 2 MB).
- docker-compose.yaml:el más grande de todos. Discutido en breve en el siguiente párrafo.
Cree una red docker llamada net
. Esto se usa en el archivo docker-compose.yaml.
docker network create net
El archivo docker-compose se ve así:
Finalmente, despliegue los contenedores
docker-compose up -d
En una implementación exitosa, debe obtener un 503 cuando intente visitar la dirección IP del servidor que aloja este proxy inverso. Esta bien. Todavía no tienes un servicio web ejecutándose.
Paso 2:implementar Nextcloud
Hay dos componentes aquí:uno es la base de datos, otro es Nextcloud en sí mismo, o más bien llamémoslo la interfaz.
Para la base de datos backend, cualquier base de datos basada en MySQL funcionará. Voy con MariaDB, especialmente la etiqueta de imagen (o versión) 10.5.9.
Para Nextcloud, usaré la versión 21.0.0, esta es la última en el momento de escribir este artículo.
Por lo tanto, las imágenes utilizadas son
mariadb:10.5.9
nextcloud:21.0.0
Los archivos de esqueleto, es decir, el archivo de redacción y los archivos env ya están cargados en nuestro repositorio público de GitHub. Puede descargarlos o reescribirlos mientras lee las explicaciones.
Te recomiendo que descargues los archivos y luego revises todo para entender qué está pasando, no es necesario que vuelvas a escribir todo desde cero.
Puede clonar todo nuestro repositorio de GitHub o simplemente descargar los archivos necesarios.
Si clonó el repositorio "tutorial-snippets" mientras implementaba el proxy inverso, simplemente cambie su directorio actual a tutorial-snippets/Nextcloud
.
El git
de trabajo El comando es el siguiente:
git clone https://github.com/linuxhandbook/tutorial-snippets && \
cd tutorial-snippets/Nextcloud
De lo contrario, use el siguiente código de shell para crear un directorio llamado "Nextcloud" y descargue los archivos allí.
mkdir -p ~/Nextcloud && cd ~/Nextcloud
for file in env.example docker-compose.yaml; do
wget https://raw.githubusercontent.com/linuxhandbook/tutorial-snippets/main/Nextcloud/${file}
done
Copie el env.example
archivo a .env
. Editará este archivo más tarde para las variables de entorno. Mantener el archivo original es solo por el bien de la copia de seguridad, nada más.
cp env.example .env
Ahora, permítanme repasar las definiciones de servicios:
1. Base de datos NC
La NCDatabase
el servicio se ve así:
NCDatabase:
image: "mariadb:10.5.9"
volumes:
- "NCMariaDB:/var/lib/mysql"
environment:
- MYSQL_ROOT_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
- MYSQL_DATABASE
- MYSQL_USER
- MYSQL_PASSWORD
restart: "on-failure"
networks: ["common"]
Este es el servicio de base de datos y, como se indicó anteriormente, utiliza el mariadb:10.5.9
imagen como modelo.
Para almacenamiento persistente, estoy usando un volumen llamado NCMariaDB
, está montado en /var/lib/mysql
, donde MariaDB almacena sus datos.
Las variables de entorno se manejan usando un .env
archivo, hablaré de eso en un momento.
Me gusta el on-failure
reinicie la política, pero puede elegir unless-stopped
o always
. Es posible que desee leer más sobre la política de reinicio en Docker.
El common
la red es común entre este y el servicio frontend, está ahí para garantizar que la comunicación sea posible entre estos contenedores.
Variables de entorno
Esta es una implementación basada en Docker, está obligado a configurar algunas variables de entorno. Ahora abre este .env
archivo en su editor de texto favorito y comience a cambiar los valores de la siguiente manera:
MYSQL_ROOT_PASSWORD
o MYSQL_RANDOM_ROOT_PASSWORD
:Establecer MYSQL_RANDOM_ROOT_PASSWORD
a 1 o establezca una contraseña raíz segura para MariaDB. Usa openssl
para generar una contraseña aleatoria.
MYSQL_DATABASE
&MYSQL_USER
:Hay algunos valores predeterminados establecidos, pero puede cambiarlos si es necesario. Establézcalos en su nombre de base de datos y nombre de usuario preferidos, respectivamente.
MYSQL_PASSWORD
:Contraseña para el usuario (MYSQL_USER
) que tendrá acceso a la base de datos principal de MariaDB (MYSQL_DATABASE
).
MYSQL_HOST
:Este es el nombre de servicio del contenedor de la base de datos. Si no va a cambiar el nombre del servicio en Compose File, déjelo como está.
2. Interfaz NCF
Este es el servicio frontend de Nextcloud. Este servicio es tan sencillo como el anterior. Echa un vistazo:
NCFrontend:
image: "nextcloud:21.0.0"
volumes:
- "NCData:/var/www/html"
environment:
- LETSENCRYPT_HOST
- VIRTUAL_HOST
- TRUSTED_PROXIES
- OVERWRITEPROTOCOL
- MYSQL_DATABASE
- MYSQL_USER
- MYSQL_PASSWORD
- MYSQL_HOST
- SMTP_HOST
- SMTP_PORT
- SMTP_NAME
- SMTP_PASSWORD
- MAIL_FROM_ADDRESS
- NEXTCLOUD_TRUSTED_DOMAINS
- NEXTCLOUD_ADMIN_USER
- NEXTCLOUD_ADMIN_PASSWORD
depends_on:
- "NCDatabase"
networks: ["net", "common"]
La imagen utilizada es nextcloud:21.0.0
, como dije anteriormente, es la última versión en el momento de escribir este artículo.
Para asegurarse de mantener sus datos seguros y no perderlos en el caso desafortunado de un simple reinicio del contenedor, los datos deben conservarse. Nextcloud guarda sus datos/información en /var/www/html
, por lo que esta ubicación se vuelve persistente usando un volumen llamado NCData
.
El depends_on
array es interesante. Se asegura de que los valores, es decir, los servicios mencionados en él, se implementen primero antes de que comience el actual.
Aquí, me aseguro de que la base de datos se inicie antes que Nextcloud, para evitar problemas de conexión.
Es posible que aún vea algunos problemas en los registros, porque un inicio correcto del contenedor no indica que los procesos previstos dentro del contenedor también se hayan iniciado correctamente. Pueden tomar más tiempo. En nuestro caso, mysqld tarda un poco más en iniciarse, por lo que es posible que vea un par de errores en los registros hasta que finalmente se realice una conexión exitosa.
Hay dos redes. El primero es net
, que también formaba parte de la implementación de proxy inverso. Esto es necesario porque el proxy inverso debe poder comunicarse con los servicios proxy, es decir, Nextcloud. El common
la red es para que los contenedores de base de datos y nextcloud puedan comunicarse con éxito.
Variables de entorno
Abra el .env
(el mismo que usó para MariaDB) en su editor de texto favorito y comience a cambiar los valores de la siguiente manera:
LETSENCRYPT_HOST
, VIRTUAL_HOST
&NEXTCLOUD_TRUSTED_DOMAINS
:Establézcalos en el dominio/subdominio en el que desea alojar su instancia de Nextcloud.
TRUSTED_PROXIES
:La subred de la red, compartida por el proxy inverso y esta interfaz. Puede obtener la subred con el siguiente comando (asegúrese de que jq
está instalado)
docker inspect -f '{{ json .IPAM.Config }}' net | jq -r .[].Subnet
OVERWRITEPROTOCOL
:El parámetro overwriteprotocol se utiliza para configurar el protocolo del proxy. Como usamos HTTPS, configúrelo en HTTPS.
SMTP_HOST
&SMTP_PORT
:La dirección del servidor SMTP y el puerto en el que escuchará, para SendGrid es smtp.sendgrid.net y el puerto 587 para TLS automático.
SMTP_NAME
&SMTP_PASSWORD
:El nombre de usuario y la contraseña para la autenticación. Para SendGrid, el valor del nombre de usuario es muy consistente. Es apikey
. Para la contraseña, será su clave API.
MAIL_FROM_ADDRESS
:El valor de From
Encabezado SMTP. Establézcalo en algo como [email protected]
.
NEXTCLOUD_ADMIN_USER
&NEXTCLOUD_ADMIN_PASSWORD
:en lugar de usar la interfaz de usuario web la primera vez para crear el usuario administrador, puede crearlo directamente en la etapa de implementación a través de estas variables. Configúrelos con el nombre de usuario y la contraseña de su usuario administrador. Si lo dejó, se le pedirá que cree una cuenta la primera vez que inicie Nextcloud.
Volúmenes
Tengo dos volúmenes internos definidos en esta red, NCMariaDB
para MariaDB y NCData
para Nextcloud. Depende de usted mantenerlos internos o externos.
Muchos dirán que es arriesgado mantener estos internos ya que fácilmente puede cometer el error de usar docker-compose down -v
y retire los volúmenes junto con los contenedores. Al mismo tiempo, con volúmenes externos, puede cometer el error de docker volume prune
y borra todos tus datos.
Decide cuál va a ser más seguro para ti. Si decide hacerlos externos, abra el archivo Compose y cambie los volumes
definición a algo como esto:-
volumes:
NCMariaDB:
external: true
NCData:
external: true
Luego, cree los volúmenes:
for volume in NCMariaDB NCData; do
docker volume create ${volume}
done
Redes
No hay mucho aquí. Notará que hay dos redes definidas. Uno es para el frontend y el proxy inverso, y el otro es para que el frontend y el backend puedan comunicarse.
El contenedor de la base de datos y la interfaz de nextcloud tienen una red común llamada "común", que está ahí para que estos dos contenedores puedan comunicarse entre sí. Puede hacer que esto sea interno, lo que limitará el acceso del contenedor de la base de datos a la Internet pública, pero no estoy seguro de las ventajas que podría obtener de esto.
Aún así, si quieres hacer esto, debería verse así:
networks:
net:
external: true
common:
internal: true
Finalmente, implementando Nextcloud
No queda nada más por hacer. Simplemente ejecute el siguiente comando
docker-compose up -d
Las imágenes necesarias se extraerán y luego se desplegarán.
Una vez implementado, debería haber un total de cuatro contenedores ejecutándose en su servidor.
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1dce1c7909fe jrcs/letsencrypt-nginx-proxy-companion:latest "/bin/bash /app/entr…" 7 hours ago Up 7 hours reverse_proxy_LetsencryptCompanion_1
d29719999132 jwilder/nginx-proxy:latest "/app/docker-entrypo…" 7 hours ago Up 7 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp reverse_proxy_NginxProxy_1
cd719cb2a677 nextcloud:21.0.0 "/entrypoint.sh apac…" 7 hours ago Up 7 hours 80/tcp nextcloud_NCFrontend_1
60dff2062aa5 mariadb:10.5.9 "docker-entrypoint.s…" 7 hours ago Up 7 hours 3306/tcp nextcloud_NCDatabase_1
Usted puede tenga más contenedores ejecutándose también si había contenedores ejecutándose anteriormente. La conclusión es que esta implementación de Nextcloud consta de cuatro contenedores, el contenedor nginx, el contenedor complementario de letsencrypt, el contenedor mariadb y, finalmente, el contenedor real de nextcloud.
Después de la implementación
Antes de terminar con esto, quería mencionar una cosa rápida que tal vez quiera saber después de la implementación.
Primero abra su navegador y diríjase al dominio en el que está alojada esta instancia de Nextcloud (VIRTUAL_HOST
). Debería ver una pantalla similar a esta, si no configuró el usuario administrador usando el archivo de redacción
Dado que las variables de entorno de la base de datos se comparten a través del común .env
archivo, no verá la interfaz de usuario de instalación web más común que solicita la información de la base de datos, como el nombre de host, el puerto, la contraseña del nombre de usuario de la base de datos.
También se puede ver una casilla de verificación similar allí. Te recomiendo que desmarques esta casilla e instales las aplicaciones que necesites más adelante de la lista de aplicaciones.
Para obtener más consejos posteriores a la implementación, lea este increíble artículo escrito por mi colega Avimanyu:
10 consejos útiles para administrar una instancia de Docker de Nextcloud ¡Algunos consejos útiles para tener en cuenta y seguir en la práctica mientras aloja su instancia de Nextcloud con Docker! Manual de LinuxAvimanyu BandyopadhyayEso es todo. Espero que este tutorial detallado lo ayude con la instalación de su servidor Nextcloud con Docker. Si tiene preguntas o sugerencias, hágamelo saber en la sección de comentarios y estaré encantado de ayudarle.