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
  2. Imagen Docker de Nextcloud (nextcloud/docker en GitHub)
  3. Imagen oficial nextcloud en Docker Hub

Ruta: Productividad y documentos self-hosted con Docker