Logotipo de Bitdoze

Instalar Cloudreve con Docker: Autoalojamiento con Cloudflare Tunnels

Autoaloja Cloudreve con Docker Compose y Dockge, y exponlo de forma segura a través de Cloudflare Tunnels. Actualizado para 4.19 con subidas en fragmentos y copias de seguridad.

Dragos

45 min de lectura

Instalar Cloudreve con Docker: Autoalojamiento con Cloudflare Tunnels

Cloudreve es un sistema de gestión de archivos de código abierto para almacenamiento en la nube autoalojado. Funciona como Google Drive o Dropbox, salvo que lo ejecutas en tu propio hardware y conservas todos los datos.

El proyecto admite almacenamiento local, backends compatibles con S3 y OneDrive. Obtienes subidas con arrastrar y soltar, vistas previas de archivos en el navegador, acceso WebDAV para montarlo como unidad de red e integración con Aria2 para descargar archivos directamente a tu servidor.

Esta guía cubre el despliegue de Cloudreve con Docker Compose y Dockge y su exposición a través de Cloudflare Tunnels, usando PostgreSQL y Redis para un mejor rendimiento que con la configuración SQLite predeterminada. También te muestro cómo configurar las descargas remotas con Aria2, además de los detalles que importan en 2026: el límite de subida de 100 MB de Cloudflare, las subidas en fragmentos, las copias de seguridad y las actualizaciones a 4.19.

Actualizado para Cloudreve 4.19 - comprueba tu versión

Si desplegaste Cloudreve con la versión de enero de 2026 de esta guía, actualiza ahora. La versión 4.13.0 (2026-02-05) corrigió CVE-2026-25726, un generador de números aleatorios débil usado para campos sensibles. Las bases de datos inicializadas por primera vez en 4.10.0 o posterior no eran vulnerables, pero ejecutar cualquier versión anterior a 4.13.0 en producción es mala idea. La actualización invalida todas las sesiones y los enlaces de descarga firmados existentes (?sign=...), así que avisa a tus usuarios antes de apretar el gatillo.

Versión Publicada Qué cambió
4.13.0 2026-02-05 Corrección de CVE-2026-25726; sesiones y enlaces firmados invalidados al actualizar
4.14.0 2026-02-14 Búsqueda de texto completo y búsqueda semántica con IA (Tika + Meilisearch), renombrar con F2
4.16.1 - 4.18.0 2026-06/07 Más correcciones de seguridad, papelera de reciclaje, __ como separador de entorno, correcciones en la subida paralela de fragmentos
4.19.1 2026-09-18 Versión actual; cambios en la subida paralela de fragmentos, correcciones de WOPI/email

Funciones de Cloudreve

Cloudreve viene en dos ediciones: Community (gratuita y de código abierto) y Pro (licencia de pago). La edición Community cubre la mayoría de los casos de uso de servidores domésticos para almacenamiento en la nube autoalojado.

Edición Community

La versión gratuita incluye:

  • Múltiples backends de almacenamiento - Disco local, servicios compatibles con S3 (Cloudflare R2, MinIO, Backblaze B2), OneDrive, SharePoint y proveedores chinos como Qiniu, Alibaba OSS, Tencent COS
  • Compartición de archivos - Genera enlaces para compartir con contraseñas y fechas de caducidad
  • WebDAV - Monta tu almacenamiento como unidad de red en Windows, macOS o Linux
  • Vistas previas en el navegador - Visualiza documentos, imágenes, vídeos, audio, archivos ePub y código sin descargar
  • Gestión de usuarios - Crea múltiples usuarios con diferentes cuotas de almacenamiento y permisos
  • Descargas remotas - Integración con Aria2 y qBittorrent para descargar desde URL, enlaces magnet y torrents
  • Búsqueda de texto completo y semántica con IA - Búsqueda de contenido mediante Apache Tika y Meilisearch (4.14+), cubierta más adelante en esta guía
  • Compresión de archivos - Crea y extrae archivos ZIP en el navegador
  • Miniaturas - Generación automática de miniaturas para imágenes, vídeos y documentos de Office
  • Autenticación OIDC - Inicio de sesión único con Google, GitHub o tu propio proveedor de identidad

Edición Pro

La licencia Pro añade funciones para despliegues más grandes:

  • Nodos esclavos - Distribuye el almacenamiento y las descargas entre varios servidores
  • Balanceo de carga - Reparte el tráfico entre backends de almacenamiento
  • Colaboración en documentos de Office - Edición en tiempo real con integración WOPI (como Collabora u OnlyOffice)
  • Cliente de sincronización de escritorio - Cliente para Windows 10 1903+ con archivos de marcador de posición; WebDAV sigue siendo la vía gratuita
  • Proveedores de pago personalizados - Vende almacenamiento a usuarios con tu propia pasarela de pago
  • Cifrado de archivos - Cifra archivos en reposo en los backends de almacenamiento

Las licencias Pro se compran en cloudreve.org. El precio depende del tamaño del despliegue.

Para un servidor doméstico o un equipo pequeño, la edición Community tiene todo lo que necesitas.

Requisitos previos

Necesitarás:

Los precios de los VPS subieron en general en 2026: si estás reconsiderando una máquina alquilada, mira qué cambió y cuándo gana un mini PC.

DigitalOcean $100 gratis Vultr $100 gratis Hetzner €20 gratis Hostinger VPS

Traefik funciona como alternativa a Cloudflare Tunnels. Escribí una guía aparte: Cómo usar Traefik como reverse proxy en Docker.

Desplegar Cloudreve con Docker Compose

Esta configuración de Cloudreve con Docker Compose ejecuta tres contenedores: Cloudreve para la interfaz web y la gestión de archivos, PostgreSQL para almacenar metadatos y datos de usuarios, y Redis para la caché. PostgreSQL maneja más usuarios y bibliotecas de archivos más grandes mejor que SQLite.

1. Crea el archivo de entorno

Mantén las credenciales y la configuración en un archivo .env separado. Dockge lo carga automáticamente cuando despliegas el stack.

bash
# .env file for Cloudreve

# PostgreSQL database credentials
POSTGRES_USER=cloudreve
POSTGRES_DB=cloudreve
POSTGRES_HOST_AUTH_METHOD=trust

# Cloudreve database connection
CR_DB_TYPE=postgres
CR_DB_HOST=postgresql
CR_DB_USER=cloudreve
CR_DB_NAME=cloudreve
CR_DB_PORT=5432

# Redis connection
CR_REDIS_SERVER=redis:6379

El método de autenticación trust funciona aquí porque PostgreSQL solo acepta conexiones de otros contenedores en la misma red Docker. Nada externo puede alcanzarlo directamente. Si eso te incomoda, cambia a scram-sha-256 y define POSTGRES_PASSWORD en su lugar.

Patrones de variables de entorno que conviene conocer

CR_CONF_<Sección>.<Clave> sobrescribe valores del archivo de configuración (usado abajo para los ajustes de base de datos y Redis). CR_SETTING_DEFAULT_<setting> inicializa ajustes almacenados en la base de datos. Desde 4.18.0, __ también funciona como separador (CR_CONF_System__Listen) en plataformas que destrozan los puntos en nombres de variables de entorno. Para cualquier cosa más allá de una demo, lee Secretos en Docker Compose: qué funciona y alternativas seguras.

2. Crea el archivo Docker Compose

Aquí está el stack completo con Cloudreve, PostgreSQL y Redis. Fija las etiquetas de las imágenes para que un docker compose pull casual no te sorprenda: cloudreve/cloudreve:v4 sigue la línea 4.x (el repositorio oficial de compose usa esta etiqueta), y redis:8-alpine mantiene Redis reproducible. Si quieres un pin estricto, usa cloudreve/cloudreve:4.19.1 en su lugar. También existen etiquetas por arquitectura (-amd64, -arm64). Esta configuración incluye el puerto 6888 para descargas BitTorrent (explicado en la sección de descargas remotas más abajo):

yaml
services:
  cloudreve:
    image: cloudreve/cloudreve:v4
    container_name: cloudreve-backend
    depends_on:
      - postgresql
      - redis
    restart: unless-stopped
    ports:
      - 5212:5212
      - 6888:6888
      - 6888:6888/udp
    environment:
      - CR_CONF_Database.Type=${CR_DB_TYPE}
      - CR_CONF_Database.Host=${CR_DB_HOST}
      - CR_CONF_Database.User=${CR_DB_USER}
      - CR_CONF_Database.Name=${CR_DB_NAME}
      - CR_CONF_Database.Port=${CR_DB_PORT}
      - CR_CONF_Redis.Server=${CR_REDIS_SERVER}
      - CR_CONF_System.ProxyHeader=X-Forwarded-For
    volumes:
      - backend_data:/cloudreve/data

  postgresql:
    image: postgres:17
    container_name: cloudreve-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_HOST_AUTH_METHOD=${POSTGRES_HOST_AUTH_METHOD}
    volumes:
      - database_postgres:/var/lib/postgresql/data

  redis:
    image: redis:8-alpine
    container_name: cloudreve-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data

volumes:
  backend_data:
  database_postgres:
  redis_data:

Sobre el puerto 6888

El puerto 6888 (TCP y UDP) lo usa Aria2 para conexiones de pares BitTorrent. Si no planeas usar descargas de torrents, puedes eliminar estos mapeos de puertos. La interfaz web solo necesita el puerto 5212.

No subas la versión de Postgres a la ligera

El stack fija postgres:17 a propósito. Saltar a postgres:18 no migra el volumen de datos: necesitarías un pg_dump/restauración o pg_upgrade. Déjalo como está, a menos que disfrutes ese tipo de veladas.

CR_CONF_System.ProxyHeader=X-Forwarded-For hace que los registros de eventos guarden las IP reales de los clientes en lugar de la dirección del contenedor del túnel. Esa línea solo es segura porque lo único que envía tráfico es cloudflared. No la configures si clientes no confiables pueden alcanzar el puerto 5212 directamente.

Entender los volúmenes de Docker

Los volúmenes de Docker almacenan datos fuera del sistema de archivos del contenedor. Cuando reinicias o actualizas un contenedor, el volumen mantiene tus archivos a salvo.

Este stack usa tres volúmenes con nombre:

Volumen Ubicación dentro del contenedor Qué almacena
backend_data /cloudreve/data Blobs de archivos bajo data/uploads, además de conf.ini, avatares, miniaturas y archivos temporales
database_postgres /var/lib/postgresql/data Archivos de la base de datos PostgreSQL con cuentas de usuario, metadatos de archivos y enlaces compartidos
redis_data /data Datos de caché de Redis para almacenamiento de sesiones y rendimiento

En v4, los archivos que ves en la interfaz web corresponden a blobs inmutables en disco (nombrados por hash de contenido) más filas en la base de datos. Los blobs sin uso son eliminados por el recolector de basura del programador de colas. Los volúmenes con nombre como backend_data los gestiona Docker y se almacenan en /var/lib/docker/volumes/ en tu host. No necesitas crear carpetas manualmente.

Usar una ubicación de almacenamiento personalizada

Si prefieres almacenar los archivos en una ubicación específica de tu host (por ejemplo, un disco separado para multimedia), sustituye el volumen con nombre por un bind mount:

yaml
volumes:
  - /mnt/storage/cloudreve:/cloudreve/data

Esto mapea /mnt/storage/cloudreve en tu host directamente a /cloudreve/data dentro del contenedor. Crea la carpeta y ajusta los permisos antes de arrancar el stack:

bash
sudo mkdir -p /mnt/storage/cloudreve
sudo chown -R 1000:1000 /mnt/storage/cloudreve

Añadir directorios de almacenamiento externos

Para usar un directorio existente como /media/storage/downloads con Cloudreve, tienes que montarlo dentro del contenedor. Añádelo a la sección de volúmenes:

yaml
services:
  cloudreve:
    image: cloudreve/cloudreve:v4
    container_name: cloudreve-backend
    volumes:
      - backend_data:/cloudreve/data
      - /media/storage/downloads:/cloudreve/downloads

Esto hace que tu carpeta /media/storage/downloads esté disponible dentro del contenedor en /cloudreve/downloads. Puedes añadir varios directorios:

yaml
volumes:
  - backend_data:/cloudreve/data
  - /media/storage/downloads:/cloudreve/downloads
  - /media/storage/media:/cloudreve/media
  - /media/storage/backups:/cloudreve/backups

Se requieren políticas de almacenamiento

Montar un directorio no hace que los archivos sean visibles automáticamente en Cloudreve. Necesitas crear una política de almacenamiento que apunte a esa ruta. Consulta la sección «Configura las políticas de almacenamiento» más abajo para las instrucciones.

Tras añadir los volúmenes, reinicia el stack:

bash
docker compose down && docker compose up -d

3. Despliega con Dockge

Dockge te da una interfaz web para gestionar stacks de Docker Compose. Este es el proceso de despliegue:

  1. Abre Dockge en tu navegador (normalmente http://your-server-ip:5001)
  2. Haz clic en el botón + Compose de la esquina superior derecha
  3. Escribe cloudreve como nombre del stack
  4. Pega el contenido de Docker Compose en el editor
  5. Haz clic en la sección Environment Variables debajo del editor
  6. Añade cada variable del archivo .env:
    • POSTGRES_USER = cloudreve
    • POSTGRES_DB = cloudreve
    • POSTGRES_HOST_AUTH_METHOD = trust
    • CR_DB_TYPE = postgres
    • CR_DB_HOST = postgresql
    • CR_DB_USER = cloudreve
    • CR_DB_NAME = cloudreve
    • CR_DB_PORT = 5432
    • CR_REDIS_SERVER = redis:6379
  7. Haz clic en Save
  8. Haz clic en Start para desplegar el stack

Dockge guarda los archivos del stack en /opt/stacks/cloudreve/ por defecto. Ahí encontrarás compose.yaml si necesitas editarlo más tarde.

Tras hacer clic en Start, Dockge muestra los logs en tiempo real de los tres contenedores. Espera hasta ver el mensaje de arranque de Cloudreve indicando que está listo para aceptar conexiones.

Dockge UI

El enfoque visual funciona bien para la mayoría de usuarios: crea un stack llamado cloudreve, pega el contenido del compose, añade las variables de entorno en la UI, guarda y arranca. Dockge escribe el archivo .env por ti a partir de esas variables.

Línea de comandos

Si prefieres trabajar directamente en el servidor:

bash
mkdir -p /opt/stacks/cloudreve
cd /opt/stacks/cloudreve

Crea compose.yaml con el contenido de Docker Compose de arriba y .env con tus variables de entorno, luego:

bash
docker compose up -d
docker compose logs -f

4. Verifica que los contenedores estén en ejecución

Este es el primer punto de control. No continúes hasta que todo esto pase:

  • docker ps –format “table {{.Names}}\t{{.Status}}\t{{.Ports}}” muestra cloudreve-backend, cloudreve-db y cloudreve-redis todos como “Up”
  • curl -I http://localhost:5212 devuelve 200 o 302 (cualquier otra cosa significa que la app aún no está escuchando)
  • docker logs cloudreve-backend muestra la línea de arranque con la dirección de escucha, sin errores de conexión a la base de datos

Si un contenedor se reinicia constantemente, docker logs cloudreve-backend es el primer lugar donde mirar. PostgreSQL normalmente solo necesita unos segundos extra en el primer arranque; un docker compose down && docker compose up -d tras 30 segundos arregla la mayoría de las carreras del primer inicio.

Configura Cloudflare Tunnels para Cloudreve

Cloudflare Tunnels es la forma más limpia de autoalojar Cloudreve sin abrir puertos en tu router. El túnel se ejecuta como un contenedor en tu servidor y crea una conexión saliente hacia la red de Cloudflare, así que nada entrante toca tu conexión doméstica.

Arquitectura del stack de Cloudreve: del navegador al edge de Cloudflare, a cloudflared y a cloudreve-backend, con PostgreSQL y Redis detrás y BitTorrent en el puerto 6888 abierto directamente

Si seguiste mi guía de Dockge, ya tienes un túnel funcionando. Añade un nuevo hostname para Cloudreve:

  1. Inicia sesión en el panel de Cloudflare One (la antigua marca «Zero Trust» ya no existe)
  2. Ve a Networks > Tunnels
  3. Haz clic en el nombre de tu túnel y luego en Configure
  4. Bajo Public Hostname, haz clic en Add a public hostname
  5. Rellena los datos:
    • Subdomain: cloudreve (o elige otro)
    • Domain: selecciona tu dominio del desplegable
    • Service Type: HTTP
    • URL: cloudreve-backend:5212
Panel de Cloudflare One mostrando el hostname público del túnel de Cloudreve apuntando a cloudreve-backend:5212

Usar cloudreve-backend:5212 funciona si tu contenedor del túnel comparte una red Docker con Cloudreve. Si están en redes separadas, usa la IP local de tu servidor (como 192.168.1.50:5212).

Guarda el hostname. Dale un minuto para propagarse y luego prueba a acceder a https://cloudreve.yourdomain.com. Si la página carga, el túnel está haciendo su trabajo.

CloudPanel también funciona como reverse proxy. Consulta Configurar CloudPanel como reverse proxy con Docker y Dockge para ese enfoque.

Si prefieres no depender de Cloudflare en absoluto, echa un vistazo a Pangolin, una alternativa autoalojada a Cloudflare Tunnels.

Configuración inicial de Cloudreve

Crea tu cuenta de administrador

Abre Cloudreve en tu navegador. Usa la URL de tu Cloudflare Tunnel (https://cloudreve.yourdomain.com) o la dirección local (http://your-server-ip:5212).

  1. Haz clic en Sign up en la página de inicio de sesión
  2. Introduce una dirección de email y una contraseña
  3. Haz clic en Sign up de nuevo para crear la cuenta
  4. Inicia sesión con esas credenciales

La primera cuenta que creas se convierte en administrador. Cloudreve v4 eliminó las antiguas credenciales de administrador por defecto en favor de este flujo de registro, así que no dejes una instancia recién creada expuesta en una URL pública antes de registrarte.

Configura las URL del sitio

v4 mantiene una lista de URL del sitio en lugar del antiguo par primaria/secundaria. Indícale a Cloudreve todas las direcciones que la gente usará:

  1. Haz clic en tu avatar en la esquina superior derecha
  2. Selecciona Dashboard para abrir el panel de administración
  3. Ve a Settings > Site Information
  4. Añade ambas URL a la lista de Site URLs:
    • Tu dirección local, como http://192.168.1.50:5212
    • Tu dirección pública, como https://cloudreve.yourdomain.com
  5. Haz clic en Save

Los enlaces para compartir y los enlaces de descarga firmados toman su hostname de esta lista. Cuando la lista es incorrecta o está incompleta, los enlaces salen apuntando al host equivocado, o a http:// cuando estás en https://.

¿Hostname incorrecto en los enlaces de descarga?

Tras corregir la lista de URL del sitio, ve a Filesystem > Clear Blob URL Cache. Cloudreve cachea las URL de blobs generadas, así que los enlaces antiguos mantienen el hostname obsoleto hasta que la limpias. Otras dos cosas rompen los enlaces firmados: una discrepancia HTTP-vs-HTTPS entre lo configurado y lo que usan los usuarios, y el desfase del reloj del servidor. Mantén la sincronización horaria activada (timedate status debería mostrar NTP activo).

Configura las políticas de almacenamiento

Las políticas de almacenamiento controlan dónde van los archivos y qué límites se aplican. Cada política apunta a una ubicación de almacenamiento específica.

Editar la política por defecto:

  1. En el Dashboard, ve a Storage Policies
  2. Haz clic en la política por defecto para editarla
  3. Define el tamaño máximo de subida, las extensiones de archivo permitidas y la cuota de almacenamiento
  4. Activa la subida en fragmentos (chunked upload) y define el tamaño del fragmento por debajo de 100 MB (yo usaría 25-50 MB). Esto es lo que hace que las subidas grandes funcionen detrás de Cloudflare, cubierto en detalle más abajo
  5. Opcionalmente activa Pre-allocate disk space en Linux/macOS para reducir la fragmentación de los fragmentos. Ten en cuenta que desde 4.19.0, las subidas paralelas de fragmentos se desactivan forzosamente cuando esto está apagado
  6. Guarda los cambios

La política por defecto almacena los archivos en data/uploads dentro del contenedor (mapeado al volumen backend_data o a tu bind mount).

Define un tamaño de fragmento inferior a 100 MB si usas Cloudflare

El plan gratuito de Cloudflare limita una sola petición HTTP a 100 MB. Sin la subida en fragmentos, cualquier cosa más grande falla. Consulta la sección «Subir archivos grandes a través de Cloudflare Tunnel» más abajo para el panorama completo.

Crear una política para directorios externos:

Si montaste un directorio externo como /media/storage/downloads en el contenedor, crea una nueva política de almacenamiento para usarlo:

  1. Ve a Dashboard > Storage Policies
  2. Haz clic en New Storage Policy
  3. Selecciona Local como tipo de almacenamiento
  4. Configura la política:
    • Name: ponle un nombre descriptivo como “Almacenamiento de descargas”
    • Storage Path: introduce la ruta del contenedor, p. ej. /cloudreve/downloads (debe coincidir con donde montaste el directorio en tu archivo compose)
    • Max Size: define el tamaño máximo de archivo para las subidas
    • Allowed Extensions: déjalo vacío para todos los tipos, o especifica extensiones
  5. Guarda la política

La ruta debe coincidir con tu montaje

La ruta de almacenamiento en Cloudreve debe coincidir con la ruta del contenedor de tu montaje de volumen. Si montaste -v /media/storage/downloads:/cloudreve/downloads, usa /cloudreve/downloads como ruta de almacenamiento.

El disco local es lo predeterminado, pero la misma pantalla te permite apuntar una política a backends compatibles con S3 como Cloudflare R2, Backblaze B2 o almacenamiento Bunny.net. Si estás buscando ese bucket externo, mi comparativa de los backends de almacenamiento en la nube más baratos: Bunny vs S3 vs Backblaze repasa los precios.

Asignar la política a los usuarios:

Las políticas de almacenamiento se asignan a través de los grupos de usuarios:

  1. Ve a Dashboard > User Groups
  2. Edita el grupo que quieras que use el nuevo almacenamiento
  3. Bajo Storage Policy, selecciona tu nueva política
  4. Guarda el grupo

Los usuarios de ese grupo ahora subirán archivos al directorio externo y verán los archivos de él.

Sobre los archivos existentes:

Cloudreve rastrea los archivos a través de su base de datos. Si tienes archivos existentes en /media/storage/downloads, no aparecerán automáticamente en la interfaz web.

Usa la función de importación integrada para añadir archivos existentes sin copiarlos:

  1. Ve a Dashboard > Files > Import
  2. Selecciona la política de almacenamiento, la ruta de origen, el usuario de destino y la carpeta de destino
  3. Activa la importación recursiva para los subdirectorios
  4. Haz clic en Import

Consulta la sección «Usar archivos existentes en disco» más abajo para todos los detalles.

Añade más usuarios

Para dejar que otras personas usen tu Cloudreve:

  1. Ve a Dashboard > Users
  2. Haz clic en New User
  3. Introduce su email y define una contraseña
  4. Elige un grupo de usuarios (controla los permisos)
  5. Define su cuota de almacenamiento
  6. Guarda el usuario

Cada usuario obtiene su propio espacio de archivos y puede crear sus propios enlaces para compartir. El grupo de usuarios es la palanca que lo une todo: define la política de almacenamiento, la cuota y si se permiten las descargas remotas.

Cómo funcionan los usuarios y el almacenamiento de archivos

El almacenamiento de archivos de Cloudreve no usa carpetas por usuario en el disco. En su lugar, usa una base de datos para rastrear qué archivos pertenecen a qué usuario.

Dónde se almacenan los archivos en disco

Todos los archivos de usuarios van a la misma ubicación de almacenamiento definida por la política de almacenamiento. En v4 el directorio de blobs por defecto es data/uploads (es /cloudreve/data/uploads en esta configuración Docker). El contenido subido se convierte en blobs inmutables nombrados por hash de contenido:

text
/cloudreve/data/
├── uploads/        # file blobs (content-hash names)
├── thumb/          # generated thumbnails
├── temp/           # in-flight uploads and downloads
└── conf.ini        # config file

La disposición exacta de subcarpetas dentro de uploads puede variar según la versión y la política, así que no construyas automatización que la recorra. Piensa en ello como un almacén de blobs que pertenece a Cloudreve. El modelo Files / File Blobs / Physical Files es el que describen los docs de administración: los usuarios ven Files, la base de datos registra qué blobs los respaldan, y los blobs son los bytes físicos. Los blobs sin uso son eliminados por el recolector de basura del programador de colas.

Separación de archivos por usuario

Los usuarios solo ven sus propios archivos en la interfaz web. La base de datos rastrea la propiedad:

Lo que ven los usuarios Lo que hay en disco
/Documents/report.pdf Un blob hasheado bajo data/uploads
/Photos/vacation.jpg Otro blob hasheado bajo data/uploads

Dos usuarios pueden tener archivos con el mismo nombre en la misma ruta virtual. Se almacenan por separado en disco con hashes diferentes.

Acceder a los archivos fuera de Cloudreve

No puedes navegar fácilmente por los archivos de los usuarios recorriendo la carpeta de almacenamiento. Para acceder a los archivos:

  • WebDAV: monta el almacenamiento como unidad de red. Cada usuario se autentica y solo ve sus archivos.
  • Enlaces para compartir: crea un enlace para compartir en la interfaz web.
  • API: usa la API de Cloudreve para listar y descargar archivos programáticamente.
  • Descarga directa: desde la interfaz web, haz clic derecho en un archivo y copia el enlace de descarga.

Usar archivos existentes en disco

Cloudreve rastrea los archivos a través de su base de datos. Los archivos colocados directamente en la carpeta de almacenamiento no aparecerán en la interfaz hasta que los importes.

Importar carpetas existentes:

Cloudreve tiene una función de importación integrada que añade archivos existentes a la biblioteca de un usuario sin copiarlos:

  1. Ve a Dashboard > Files > Import
  2. Configura la importación:
    • Storage policy: selecciona la política donde están tus archivos
    • Source folder path: introduce la ruta en disco
    • Target user and folder: quién es el propietario de los archivos importados y dónde aparecen
    • Recursively import: actívalo para incluir subdirectorios
    • Extract media information: actívalo para extraer metadatos de vídeos e imágenes
  3. Haz clic en Import

Propiedad tras la importación

Tras la importación, Cloudreve gestiona los archivos físicos. No los modifiques ni elimines fuera de Cloudreve. Importar el mismo archivo dos veces omitirá los duplicados. Los archivos cuentan para la cuota de almacenamiento del usuario aunque no se copie ningún dato.

Esta es la forma más rápida de añadir grandes colecciones existentes. Los archivos permanecen en su sitio en el disco y Cloudreve crea entradas en la base de datos que apuntan a ellos. Las ubicaciones de los menús cambian entre versiones; si no ves Files > Import, busca en las acciones de la propia política de almacenamiento.

Subir archivos grandes a través de Cloudflare Tunnel

Este es el fallo con el que casi todo el mundo se topa con este stack exacto, así que tiene su propia sección.

Plan gratuito de Cloudflare: 100 MB por petición

El plan gratuito de Cloudflare limita una sola petición HTTP a 100 MB. Sube un vídeo de 200 MB a través del túnel sin la subida en fragmentos y obtendrás un 413 Request Entity Too Large. Business eleva el límite a unos 200 MB y Enterprise a unos 500 MB, pero las cifras cambian: consulta la página de límites actuales de Cloudflare antes de confiar en ellas. cloudflared en sí no añade límite de cuerpo; la restricción está en el edge.

La solución es dejar que Cloudreve divida las subidas en fragmentos en el lado del cliente. Cada fragmento es su propia petición HTTP, así que nada dispara el límite de 100 MB. Cloudreve reensambla el blob en el servidor.

Activar la subida en fragmentos:

  1. Ve a Dashboard > Storage Policies
  2. Edita la política a la que suben tus usuarios
  3. Activa la subida en fragmentos y define el tamaño del fragmento por debajo de 100 MB. 25-50 MB es un buen rango: lo bastante pequeño para superar el límite con margen, lo bastante grande para evitar miles de peticiones
  4. Guarda la política

Verifica que funciona: sube un archivo de más de 100 MB a través de https://cloudreve.yourdomain.com. Debería completarse sin 413. Si sigue fallando, abre la pestaña de red de las herramientas de desarrollo del navegador y mira qué petición muere: si es un único POST gigante, el cambio de política no se aplicó al grupo del usuario.

  • Subida en fragmentos activada en la política de almacenamiento
  • Tamaño de fragmento por debajo de 100 MB (25-50 MB recomendado)
  • Política asignada al grupo de usuarios que usa tu cuenta de prueba
  • La subida de prueba de un archivo de más de 100 MB se completa

Alternativas si no quieres la subida en fragmentos:

  • WebDAV: monta la unidad y copia los archivos por el endpoint WebDAV. El mismo límite de 100 MB por petición se aplica a través del túnel, pero muchos clientes WebDAV fragmentan por su cuenta.
  • Subida por la LAN: usa la URL local (http://server-ip:5212) para las transferencias grandes. Sin Cloudflare en el camino, sin límite.
  • Política compatible con S3: apunta una política de almacenamiento a Cloudflare R2 o Backblaze B2 para que los clientes suban al bucket en lugar de a través de tu túnel.

Si también pones nginx delante de Cloudreve en algún punto, el propio client_max_body_size de nginx (¡1 MB por defecto!) es un límite aparte. Ponlo por encima de tu tamaño de fragmento o el proxy rechazará los fragmentos primero.

Búsqueda de texto completo con Meilisearch (complemento opcional)

Desde 4.14.0, la edición Community puede buscar dentro del contenido de los archivos. Es un complemento de dos contenedores: Apache Tika extrae el texto (puerto 9998) y Meilisearch lo indexa (puerto 7700). Sáltate esto si solo navegas por carpeta y nombre de archivo.

El repositorio oficial de compose incluye un archivo override, así que no tienes que escribir los servicios a mano. Añade una master key a tu .env:

bash
# in /opt/stacks/cloudreve/.env
MEILI_MASTER_KEY=$(openssl rand -hex 32)

Luego, o bien descarga docker-compose.fts.yml de cloudreve/docker-compose, o define los servicios meilisearch y tika tú mismo, y arranca con ambos archivos:

bash
docker compose -f docker-compose.yml -f docker-compose.fts.yml up -d

El override oficial conecta getmeili/meilisearch:v1.37 y apache/tika:latest e inicializa las variables CR_SETTING_DEFAULT_fts_* correctas.

Una vez que los contenedores estén arriba, configura el backend en el panel de administración:

  1. Dashboard > Filesystem > Full-text Search
  2. Define el endpoint de Meilisearch como http://meilisearch:7700 y pega la master key
  3. Define el endpoint de Tika como http://tika:9998
  4. Guarda

Los archivos existentes necesitan un reindexado manual

Activar la búsqueda no indexa retroactivamente lo que ya está subido. Haz clic en Rebuild Index y espera que tarde un rato en bibliotecas grandes. Hazlo fuera de horas punta. La búsqueda semántica con IA es la función complementaria sobre este stack; consulta los docs de búsqueda semántica con IA.

Nota sobre el coste: son dos contenedores más en la máquina. La RAM de Meilisearch crece con el tamaño del índice, así que unos cientos de GB de documentos pueden sumar bastante. En un VPS de 2 GB, mide antes de dejarlo activado.

Descargas remotas con Aria2

Cloudreve incluye Aria2 en la imagen Docker oficial, así que las tareas de descarga remota desde URL, enlaces magnet y torrents van directo a tu almacenamiento. Los archivos aparecen en tu explorador de archivos de Cloudreve cuando la descarga termina. La imagen ocupa ~572 MB en parte porque incluye Aria2 junto con ffmpeg, LibreOffice y vips para miniaturas y metadatos.

Por qué importa el puerto 6888

Aria2 usa el puerto 6888 para las conexiones de pares BitTorrent. Al descargar torrents, otros pares necesitan alcanzar tu servidor en este puerto para compartir las piezas del archivo. Sin él:

  • Los enlaces magnet podrían no encontrar suficientes pares
  • Las velocidades de descarga serán más lentas
  • Algunos torrents ni siquiera arrancarán

El archivo compose mapea tanto TCP como UDP en el puerto 6888:

yaml
ports:
  - 5212:5212      # Web interface
  - 6888:6888      # Aria2 BitTorrent TCP
  - 6888:6888/udp  # Aria2 BitTorrent UDP

Configuración del firewall

Si estás en un VPS, abre el puerto 6888 en tu firewall. En Ubuntu con UFW:

bash
sudo ufw allow 6888/tcp
sudo ufw allow 6888/udp

Para servidores domésticos detrás de un router, reenvía el puerto 6888 a la IP local de tu servidor. Este es uno de los pocos puertos que este stack necesita abiertos: mantén todo lo demás cerrado.

Activa las descargas remotas

El Aria2 integrado se ejecuta automáticamente con el contenedor de Cloudreve. Solo necesitas activarlo en los ajustes de administración:

  1. Ve a Dashboard > Nodes
  2. Haz clic en el nodo por defecto (o crea uno)
  3. Marca Remote Download en la sección Enabled Features
  4. Configura el descargador:
    • Downloader Type: Aria2
    • RPC Server Address: http://localhost:6800
    • RPC Authorization Token: déjalo vacío (el Aria2 integrado no tiene token por defecto)
    • Temporary Download Directory: déjalo vacío para usar el valor por defecto (/cloudreve/data/temp)
  5. Guarda los ajustes del nodo

El Aria2 incluido arranca con --enable-rpc en el puerto loopback 6800 y sin secreto. Eso está bien dentro del contenedor porque nada más puede alcanzar ese puerto. No publiques el 6800 al host.

Actívalo para grupos de usuarios

Por defecto, las descargas remotas están desactivadas para los usuarios. Actívalas para tu grupo de usuarios:

  1. Ve a Dashboard > User Groups
  2. Edita el grupo al que quieras permitir descargas
  3. Marca Remote Download en la sección de permisos
  4. Guarda el grupo

Crear tareas de descarga

Una vez activado, los usuarios pueden crear tareas de descarga remota desde la interfaz web:

  1. Haz clic en el botón + del explorador de archivos
  2. Selecciona Remote Download
  3. Pega una URL, un enlace magnet o sube un archivo .torrent
  4. Elige la carpeta de destino
  5. Haz clic en Create

La descarga se ejecuta en segundo plano. El progreso se muestra en el panel de descargas remotas. Al completarse, los archivos aparecen en la carpeta elegida.

Opciones de configuración de Aria2

Puedes pasar opciones adicionales a Aria2 a través de los ajustes del nodo. En el campo Downloader Task Parameters, añade JSON:

json
{
  "max-download-limit": "10M",
  "max-concurrent-downloads": 3,
  "bt-tracker": [
    "udp://tracker.opentrackr.org:1337/announce",
    "udp://tracker.openbittorrent.com:6969/announce"
  ],
  "seed-ratio": 1.0,
  "seed-time": 60
}

Esto limita la velocidad de descarga a 10 MB/s, permite 3 descargas concurrentes, añade servidores tracker para un mejor descubrimiento de pares, y deja de sembrar tras alcanzar un ratio 1:1 o 60 minutos.

Usar qBittorrent en lugar de Aria2

Si prefieres qBittorrent para las descargas de torrents, ejecútalo como un contenedor separado y apunta Cloudreve a su Web UI. qBittorrent maneja los torrents mejor que Aria2 para semillas de larga duración, pero no puede descargar URL HTTP/FTP normales. Cloudreve admite qBittorrent 4.4 o más nuevo, solo enlaces magnet y torrent, y la ruta de descarga debe ser una ubicación del sistema de archivos que Cloudreve también pueda ver.

Añade qBittorrent a tu archivo compose:

yaml
  qbittorrent:
    image: linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1000
      - PGID=1000
      - WEBUI_PORT=8080
    volumes:
      - qbit_config:/config
      - backend_data:/downloads
    ports:
      - 8080:8080
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped

Luego configura el nodo para usar qBittorrent:

  • Downloader Type: qBittorrent
  • Web UI Address: http://qbittorrent:8080
  • Username/Password: defínelos en los ajustes de la WebUI de qBittorrent en el primer arranque. El qBittorrent moderno ya no incluye la vieja contraseña por defecto adminadmin; genera una contraseña temporal en los logs del contenedor, así que revisa docker logs qbittorrent y cámbiala inmediatamente.

El volumen compartido backend_data permite que qBittorrent descargue directamente al almacenamiento de Cloudreve.

Copia de seguridad y actualización de Cloudreve

Trátalo como cualquier otro servicio con base de datos. La base de datos contiene las cuentas de usuario, los enlaces compartidos y las referencias a cada blob. El volumen backend_data contiene los blobs y conf.ini. Pierde cualquiera de los dos y estás en problemas.

Qué respaldar:

  • Volcado de PostgreSQL: la pieza crítica. Usuarios, enlaces compartidos y metadatos de archivos viven aquí
  • Volumen backend_data: blobs de archivos más la configuración. Sáltalo solo si cada política de almacenamiento apunta a S3/R2/B2 fuera de la máquina
  • Las notas de versión entre tu versión actual y la nueva: léelas antes de cada actualización

Volcado de la base de datos:

bash
docker exec cloudreve-db pg_dump -U cloudreve cloudreve | gzip > cloudreve-db-$(date +%F).sql.gz

Copia del volumen (ruta del volumen con nombre en el host):

bash
sudo rsync -a /var/lib/docker/volumes/cloudreve_backend_data/ /backups/cloudreve-backend_data/

Si usas un bind mount, respalda ese directorio en su lugar. Para copias de seguridad automatizadas y versionadas del volumen, Zerobyte: automatización de backups Restic autoalojada encaja bien. Para sacar el volcado de la base de datos fuera de la máquina, sigo el mismo patrón que en copias de seguridad de bases de datos fuera de la máquina hacia Cloudflare R2: misma idea, distinto servicio.

Ejecuta ambos semanalmente y siempre antes de una actualización. Una línea de cron es suficiente:

bash
0 3 * * 0 docker exec cloudreve-db pg_dump -U cloudreve cloudreve | gzip > /backups/cloudreve-db-$(date +\%F).sql.gz

Actualizar:

Haz siempre pg_dump antes de actualizar

La actualización a 4.13.0 invalidó cada sesión y cada enlace de descarga firmado ?sign= existente. No es un bug, es la corrección de un problema criptográfico. No quieres descubrirlo sin una copia de seguridad y un mensaje preparado para tus usuarios.

bash
cd /opt/stacks/cloudreve
docker exec cloudreve-db pg_dump -U cloudreve cloudreve | gzip > db-backup-$(date +%F).sql.gz
docker compose pull && docker compose down && docker compose up -d

Tras el reinicio, inicia sesión y haz una prueba de humo: navega por los archivos, abre un enlace compartido, sube algo pequeño. Si fijaste v4, sigues la línea 4.x automáticamente. Si fijaste 4.19.1, tú decides cuándo moverte.

No subas postgres:17 a 18 en el mismo movimiento que una actualización de Cloudreve. Problema distinto, fin de semana distinto.

Trabajar con Cloudreve

La interfaz web maneja la mayoría de las operaciones con archivos:

  • Subir - Arrastra archivos a la página o haz clic en el botón de subida. Los archivos grandes se suben en fragmentos y se reanudan si se interrumpen.
  • Carpetas - Crea carpetas para organizar los archivos. Clic derecho para opciones.
  • Compartir - Clic derecho en un archivo o carpeta, selecciona Compartir y configura el enlace. Define una contraseña o caducidad si hace falta.
  • Vistas previas - Haz clic en los archivos para previsualizarlos. Cloudreve maneja imágenes, vídeos, audio, PDF y archivos de código.
  • Edición de fotos - Clic derecho en una imagen y ábrela con Photopea para ediciones rápidas sin salir del navegador.
  • Papelera de reciclaje - 4.18.0 añadió una papelera de reciclaje que se vacía con un clic. Los blobs eliminados son recolectados automáticamente por el programador de colas.

Para la integración con el escritorio, activa WebDAV en los ajustes de tu usuario y monta la unidad en tu ordenador. Windows, macOS y Linux admiten WebDAV de forma nativa. Ya hay un cliente de sincronización de escritorio, pero es solo para Pro y Windows 10 1903+; WebDAV sigue siendo la vía gratuita para todos los demás.

Solución de problemas

Los contenedores no arrancan

Abre los logs:

bash
docker logs cloudreve-backend
docker logs cloudreve-db

Problemas comunes: PostgreSQL no está listo cuando Cloudreve intenta conectar (simplemente reinicia el stack), las variables de entorno están mal escritas, o el puerto 5212 ya está en uso por otra cosa.

No se puede acceder a Cloudreve a través de Cloudflare Tunnel

Primero confirma que funciona localmente:

bash
curl http://localhost:5212

Si eso funciona pero el túnel no:

  • Comprueba que el contenedor del túnel está en ejecución: docker ps | grep cloudflared
  • Verifica la configuración del hostname en el panel de Cloudflare One (Networks > Tunnels)
  • Asegúrate de que la URL en la configuración del hostname coincide con el nombre de tu contenedor o la IP
Errores de conexión a la base de datos

Si los logs muestran fallos de conexión a PostgreSQL:

  1. Comprueba que el contenedor cloudreve-db está en ejecución
  2. Verifica que las variables de entorno coinciden entre el archivo .env y compose.yaml
  3. Reinicia todo el stack: docker compose down && docker compose up -d
Errores de permisos en bind mounts

Si usas un bind mount en lugar de volúmenes con nombre y ves errores de permisos:

bash
# Check what user ID Cloudreve runs as
docker exec cloudreve-backend id

# Set ownership on your host folder
sudo chown -R 1000:1000 /mnt/storage/cloudreve

Ajusta el ID de usuario según lo que el contenedor realmente use. Si quieres que el contenedor se ejecute como un usuario no-root dedicado, consulta añadir un usuario no-root a un contenedor Docker.

La subida falla con 413 / fallan las subidas grandes

413 Request Entity Too Large detrás de Cloudflare significa que alcanzaste el límite de 100 MB por petición. Activa la subida en fragmentos en la política de almacenamiento con un tamaño de fragmento por debajo de 100 MB (consulta la sección «Subir archivos grandes a través de Cloudflare Tunnel»). Si nginx también está en el camino, sube client_max_body_size por encima de tu tamaño de fragmento.

Los enlaces de descarga apuntan al hostname incorrecto

A tu lista de URL del sitio le falta una entrada, o Cloudreve está sirviendo URL de blobs cacheadas. Corrige la lista en Settings > Site Information, luego ejecuta Filesystem > Clear Blob URL Cache. Comprueba también que los usuarios acceden por el mismo esquema que configuraste: cambiar entre http:// y https:// rompe los enlaces firmados. El desfase del reloj del servidor también los rompe; mantén NTP activado.

UI rota tras actualizar / assets obsoletos

/sw.js, /index.html y /manifest.json no deben ser cacheados. Detrás de Cloudflare, los archivos .js son cacheables por defecto, que es como el Service Worker fija una UI antigua tras un salto de versión. Añade una Cache Rule en la zona para omitir la caché de /sw.js (o de todo el hostname de Cloudreve), luego haz un hard-refresh.

Los registros de eventos muestran IPs del proxy en lugar de clientes reales

Añade CR_CONF_System.ProxyHeader=X-Forwarded-For al entorno del servicio cloudreve en el compose y reinicia el stack. Hazlo solo cuando todo el tráfico pase por un proxy de confianza como cloudflared: si el puerto 5212 es alcanzable directamente, los clientes pueden falsificar la cabecera.

Las descargas de torrents van lentas o no arrancan

BitTorrent necesita que el puerto 6888 sea alcanzable desde internet:

  1. Comprueba que el puerto está mapeado en tu archivo compose
  2. Abre el puerto 6888 en el firewall de tu servidor
  3. Si estás detrás de NAT, reenvía el puerto 6888 a tu servidor
  4. Añade más trackers en la configuración de Aria2 para encontrar pares

Puedes probar si el puerto está abierto:

bash
# From another machine
nc -zv your-server-ip 6888
Los archivos de descargas remotas no aparecen

Cuando una descarga termina, Cloudreve mueve los archivos del directorio temporal a tu almacenamiento. Si los archivos no aparecen:

  1. Revisa el panel de descargas remotas en busca de errores
  2. Verifica que Cloudreve tiene permisos de escritura en el directorio de almacenamiento
  3. Mira los logs: docker logs cloudreve-backend | grep -i download

El directorio temporal y el directorio de almacenamiento deben ser accesibles para el proceso de Cloudreve.

Resumen final

Cloudreve te da un sistema de almacenamiento en la nube autoalojado que corre en tu propio hardware. Combinado con Cloudflare Tunnels, puedes acceder a tus archivos desde cualquier lugar sin exponer tu red doméstica directamente a internet.

La configuración con PostgreSQL y Redis maneja el crecimiento mejor que SQLite. Añade las descargas remotas de Aria2 para traer archivos desde cualquier lugar y tenerlos esperando en tu almacenamiento en la nube. Para un servidor doméstico o un equipo pequeño, la edición Community gratuita cubre todo lo que la mayoría necesita.

Esta guía ahora cubre la línea 4.19.x: etiquetas de imagen fijadas, subidas en fragmentos para el límite de 100 MB de Cloudflare, búsqueda de texto completo y una rutina de copias de seguridad y actualización. Si desplegaste desde la versión original de enero de 2026, actualiza hoy: CVE-2026-25726 no es algo que quieras dejar en un túnel público.

Guías relacionadas que pueden interesarte:

Actualizado para Cloudreve 4.19.