Cómo instalar Nextcloud con Docker
Índice de contenidos
- Puntos clave
- ¿Qué es Nextcloud y para qué sirve?
- ¿Qué necesitas antes de empezar?
- El docker-compose.yml de Nextcloud con MariaDB y Redis
- Primer arranque y configuración
- ¿Cómo publicarlo con Traefik y HTTPS?
- ¿Cómo hago copias de seguridad y actualizaciones?
- Preguntas frecuentes
- ¿Necesito de verdad Redis y MariaDB para usar Nextcloud?
- ¿Por qué no debo usar la etiqueta latest de la imagen?
- ¿Qué diferencia hay entre la imagen apache y la fpm?
- Conclusión
- Fuentes
Nextcloud es una plataforma de nube privada de código abierto que, en Docker, se levanta con tres contenedores: la aplicación, una base de datos MariaDB y una caché Redis. Con un único archivo docker-compose.yml tienes tu propio Drive, calendario y contactos autoalojados en pocos minutos, con tus datos guardados en un volumen que tú controlas.
Nextcloud es la forma más directa de tener tu propia nube privada, y con Docker se instala en cuestión de minutos. En esta guía levantas la aplicación junto a una base de datos MariaDB y una caché Redis usando un solo archivo docker-compose.yml, aprendes a configurarla en el primer arranque, a publicarla con HTTPS detrás de un proxy inverso y a hacer copias de seguridad. La misma explicación está disponible en inglés.
Puntos clave
- Nextcloud es una plataforma de código abierto para archivos, calendario, contactos y edición de documentos que alojas en tu propio servidor.
- El montaje recomendado usa tres contenedores: la aplicación (imagen oficial
nextcloud), una base de datos MariaDB y una caché Redis para el bloqueo de ficheros. - Toda la instalación vive en el volumen
/var/www/html, así que tus datos, la configuración y las apps instaladas persisten aunque borres el contenedor. - Fija una versión concreta de la imagen (por ejemplo
nextcloud:33-apache) en lugar de:latest; así controlas cuándo saltas de versión mayor, que solo puede subir de una en una. - Para exponerla a Internet con un certificado válido, colócala detrás de Traefik o de otro proxy inverso; Nextcloud nunca debería servirse por HTTP plano.
¿Qué es Nextcloud y para qué sirve?
Nextcloud es una plataforma de nube privada de código abierto: un sustituto autoalojado de servicios como Google Drive, Dropbox o iCloud. Nació en 2016 como bifurcación de ownCloud, de la mano de Frank Karlitschek y buena parte del equipo original, y desde entonces se ha convertido en el proyecto de referencia para recuperar el control de tus archivos.
Su núcleo es la sincronización de ficheros entre ordenadores y móviles, pero a través de aplicaciones añade calendario, contactos, edición colaborativa de documentos con Nextcloud Office, videollamadas con Talk, gestión de tareas y mucho más. La diferencia con la nube comercial es sencilla: los datos se guardan en tu servidor, en un volumen que tú administras, y nadie los analiza ni los revende.
¿Qué necesitas antes de empezar?
Necesitas una máquina Linux con Docker y el plugin Compose ya instalados. Si aún no lo tienes, sigue primero la guía para instalar Docker en Ubuntu 24.04. Para un uso doméstico o de equipo pequeño basta con 2 GB de RAM y un par de núcleos, aunque conviene subir a 4 GB si vas a editar documentos en línea.
El montaje se apoya en dos servicios de datos que quizá quieras conocer por separado: la base de datos MariaDB, donde Nextcloud guarda los metadatos, y Redis, que actúa como caché y como sistema de bloqueo transaccional de ficheros. En este tutorial los definimos dentro del mismo docker-compose.yml, de modo que no hace falta instalarlos aparte.
El docker-compose.yml de Nextcloud con MariaDB y Redis
Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Sustituye cada valor cambia_esta_clave... por una contraseña propia y segura antes de arrancar:
services:
db:
image: mariadb:11.4
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: cambia_esta_clave_root
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
MYSQL_PASSWORD: cambia_esta_clave
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 30s
timeout: 5s
retries: 5
redis:
image: redis:7.4-alpine
restart: unless-stopped
command: redis-server --requirepass cambia_esta_clave_redis
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 5s
retries: 5
app:
image: nextcloud:33-apache
restart: unless-stopped
ports:
- "8080:80"
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- nextcloud_data:/var/www/html
environment:
MYSQL_HOST: db
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
MYSQL_PASSWORD: cambia_esta_clave
REDIS_HOST: redis
REDIS_HOST_PASSWORD: cambia_esta_clave_redis
NEXTCLOUD_ADMIN_USER: admin
NEXTCLOUD_ADMIN_PASSWORD: cambia_esta_clave_admin
NEXTCLOUD_TRUSTED_DOMAINS: localhost nube.midominio.com
PHP_MEMORY_LIMIT: 512M
volumes:
db_data:
redis_data:
nextcloud_data:
Fíjate en algunos detalles del archivo. La aplicación no arranca hasta que la base de datos y Redis pasan su healthcheck, gracias a depends_on con la condición service_healthy. El puerto 80 del contenedor se publica en el 8080 del anfitrión, así que la nube quedará en http://localhost:8080. Y todo el estado importante (datos, configuración y apps) vive en el volumen nextcloud_data, montado en /var/www/html.
Con el archivo listo, arranca la pila en segundo plano y comprueba que los tres servicios están sanos:
docker compose up -d
docker compose ps
docker compose logs -f app
La primera vez, la imagen ejecuta un script de instalación que descomprime Nextcloud y prepara la base de datos, por lo que el arranque tarda un poco más de lo habitual. Cuando el registro deje de moverse, la nube estará lista.
Primer arranque y configuración
Abre http://localhost:8080 en el navegador. Como definimos NEXTCLOUD_ADMIN_USER y NEXTCLOUD_ADMIN_PASSWORD en el Compose, Nextcloud completa la instalación sin asistente y te lleva directo al inicio de sesión. Entra con esas credenciales y verás tu panel con los archivos de ejemplo.
Lo primero que conviene revisar es el aviso de seguridad en Ajustes de administración → Resumen. Ahí Nextcloud comprueba que Redis está conectado, que la cabecera de dominios de confianza es correcta y que las tareas programadas (cron) funcionan. Para los comandos de mantenimiento se usa la herramienta occ, que ejecutas dentro del contenedor como el usuario www-data:
docker compose exec --user www-data app php occ status
docker compose exec --user www-data app php occ config:list system
Si más adelante cambias de dominio, añádelo a la lista de dominios de confianza sin recrear el contenedor:
docker compose exec --user www-data app php occ config:system:set trusted_domains 2 --value=nube.midominio.com
¿Cómo publicarlo con Traefik y HTTPS?
Servir Nextcloud por HTTP plano es una mala idea: las contraseñas y los archivos viajarían sin cifrar. La forma habitual de darle un certificado válido es ponerlo detrás de un proxy inverso que gestione TLS por ti. Si sigues la serie, ya tendrás montado Traefik con Docker Compose; en ese caso, quita la sección ports del servicio app, conéctalo a la red del proxy y añádele estas etiquetas:
labels:
- "traefik.enable=true"
- "traefik.http.routers.nextcloud.rule=Host(`nube.midominio.com`)"
- "traefik.http.routers.nextcloud.entrypoints=websecure"
- "traefik.http.routers.nextcloud.tls.certresolver=le"
- "traefik.http.services.nextcloud.loadbalancer.server.port=80"
Traefik pedirá el certificado a Let’s Encrypt y renovará automáticamente. Recuerda ajustar NEXTCLOUD_TRUSTED_DOMAINS con tu dominio real y, tras el primer acceso por HTTPS, revisar de nuevo el resumen de administración para que no quede ningún aviso pendiente sobre las cabeceras del proxy.
¿Cómo hago copias de seguridad y actualizaciones?
Una copia de seguridad completa de Nextcloud tiene tres piezas: el volumen de datos, la configuración y el volcado de la base de datos. Pon la instancia en modo mantenimiento, exporta la base de datos con mariadb-dump y vuelve a activarla:
docker compose exec --user www-data app php occ maintenance:mode --on
docker compose exec db mariadb-dump -u nextcloud -pcambia_esta_clave nextcloud > nextcloud-db.sql
docker compose exec --user www-data app php occ maintenance:mode --off
El volumen nextcloud_data lo respaldas con la herramienta que prefieras; en esta serie lo automatizamos con Duplicati más adelante. Para actualizar, cambia la etiqueta de la imagen a la nueva versión (o descarga la actual) y recrea el contenedor:
docker compose pull
docker compose up -d
La imagen detecta el desfase de versión y ejecuta la actualización interna al arrancar. Un límite importante: Nextcloud solo permite subir una versión mayor cada vez, así que no saltes, por ejemplo, de la 32 a la 34 de golpe; pasa primero por la 33.
Preguntas frecuentes
¿Necesito de verdad Redis y MariaDB para usar Nextcloud?
Puedes arrancar Nextcloud solo con la base de datos SQLite que trae por defecto, pero no es recomendable más allá de una prueba. MariaDB aguanta mucho mejor la carga real y Redis aporta el bloqueo transaccional de ficheros que evita conflictos cuando varios dispositivos sincronizan a la vez. Para cualquier uso serio, los tres contenedores son la configuración estándar.
¿Por qué no debo usar la etiqueta latest de la imagen?
Porque :latest cambia sin avisarte y puede arrastrarte a una nueva versión mayor durante un simple reinicio, cuando Nextcloud solo admite subir de una versión mayor a la siguiente. Al fijar nextcloud:33-apache decides tú cuándo actualizas y evitas que una actualización automática deje tu instancia a medio migrar.
¿Qué diferencia hay entre la imagen apache y la fpm?
La variante -apache incluye un servidor web Apache listo para usar y escucha en el puerto 80, ideal para empezar. La variante -fpm solo expone PHP-FPM y necesita que le pongas delante un servidor web como Nginx, un montaje más avanzado que da más control pero exige un contenedor extra. Para una primera instalación, la de Apache es la opción sencilla.
Conclusión
Con un único docker-compose.yml tienes una nube privada completa: aplicación, base de datos y caché, todo con datos que no salen de tu servidor. El siguiente paso lógico es sacarla a Internet con seguridad detrás de Traefik y programar copias de seguridad periódicas del volumen. A partir de ahí puedes activar Nextcloud Office, Talk o el calendario y sustituir, una a una, las nubes comerciales que usabas.
Fuentes: [1] Documentación oficial de Nextcloud[1], [2] Imagen Docker de Nextcloud (nextcloud/docker en GitHub)[2], [3] Imagen oficial nextcloud en Docker Hub[3].