Alerta de seguridad — CVE de elusión de 2FA de mayo de 2026
En mayo de 2026 se divulgaron dos vulnerabilidades críticas de elusión de la autenticación de doble factor en Nextcloud:
CVE-2026-45690 (puntuación CVSS 5.9, divulgada el 15 de mayo de 2026): un atacante con usuario y contraseña puede eludir el 2FA usando HTTP Basic Auth.
CVE-2026-45691 (puntuación CVSS 5.9, divulgada el 13 de mayo de 2026): misma clase, explotable mediante un token DAV Bearer — WebDAV usado por los clientes de sincronización.
Ambas CVE están corregidas en Nextcloud 32.0.9 y 33.0.3. Las ramas 34.x y superiores no están afectadas.
NC 34.0.0 — Apps recomendadas ausentes en el primer arranque
Nextcloud 34.0.0 introduce una regresión en el asistente de instalación: las apps recomendadas (Notes, Calendar, Contacts) no se ofrecen durante la configuración inicial.
Verificar si sus apps están presentes:
docker compose exec -u www-data app php occ app:list | grep -E 'calendar|contacts|notes'Instalar manualmente:
docker compose exec -u www-data app php occ app:install calendar
docker compose exec -u www-data app php occ app:install contacts
docker compose exec -u www-data app php occ app:install notesRecomendación: arrancar directamente en 34.0.2 o superior. Fuentes: issues GitHub #61313 y #61611.
NC 34.0.0 — Restricción duplicada en PostgreSQL y explosión de CPU
En instancias con PostgreSQL, una migración interrumpida de NC 34.0.0 puede dejar una restricción duplicada en oc_filecache_extended que provoca una explosión de CPU y RAM.
Corrección:
docker compose exec -u www-data app php occ files:cleanup
docker compose exec -u www-data app php occ db:add-missing-indices
docker compose exec -u www-data app php occ db:add-missing-columnsFuente: issue GitHub #61597. Si persisten los errores, actualice directamente a 34.0.2.
Requisitos previos y dimensionamiento
Configuración recomendada: VPS con 2 GB de RAM (4 GB para más de 5 usuarios activos), SSD obligatorio, 20 GB mínimo de almacenamiento, Ubuntu 22.04 o Debian 12, Docker Engine ≥ 24, dominio con certificado TLS, puertos 80 y 443 abiertos.
Instalación de Nextcloud con Docker Compose
Paso 1 — Crear la estructura del proyecto
Cree
/opt/nextcloud/docker-compose.ymlcon MariaDB 10.11, Redis 7-alpine y Nextcloudnextcloud:34.0.4-apache.Paso 2 — Crear el archivo de entorno
cat > /opt/nextcloud/.env << 'EOF' MYSQL_ROOT_PASSWORD=contraseña_root_fuerte MYSQL_PASSWORD=contraseña_nextcloud_fuerte REDIS_PASSWORD=contraseña_redis_fuerte NEXTCLOUD_ADMIN_USER=admin NEXTCLOUD_ADMIN_PASSWORD=contraseña_admin_fuerte NEXTCLOUD_DOMAIN=cloud.sudominio.com EOFPaso 3 — Arrancar los contenedores
docker compose up -d docker compose logs -f appEl primer arranque tarda de 2 a 4 minutos. Espere el mensaje
Nextcloud was successfully installed.Paso 4 — Configurar Nginx con TLS
Instale Nginx y Certbot, cree el sitio Nextcloud con
client_max_body_size 10G;y las cabeceras de proxy, luego ejecutecertbot --nginx -d cloud.sudominio.com.Paso 5 — Configurar la URL de confianza en Nextcloud
docker compose exec -u www-data app php occ config:system:set trusted_domains 0 \ --value=cloud.sudominio.com docker compose exec -u www-data app php occ config:system:set overwrite.cli.url \ --value=https://cloud.sudominio.com
Comprobar si su instancia es vulnerable a las CVE de 2FA
Comprobar la versión actual:
docker compose exec -u www-data app php occ statusVersiones vulnerables: todas las 32.x < 32.0.9 y 33.x < 33.0.3. Las ramas 34.x y superiores no están afectadas por estas CVE.
Actualizar a la versión corregida (rama 32 → 32.0.9, rama 33 → 33.0.3):
# Rama 32:
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:32.0.9-apache|g' docker-compose.yml
# Rama 33:
# sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:33.0.3-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgradeOptimizar el rendimiento con Redis y OPcache
Nextcloud sin Redis es lento. Redis cumple dos funciones críticas: caché de sesiones y bloqueo distribuido para evitar conflictos en sincronizaciones simultáneas.
Verificar que Redis está conectado:
docker compose exec -u www-data app php occ config:system:get redisLos 5 errores más frecuentes en una instancia Nextcloud
1. Redis no configurado — interfaz lenta y conflictos de sincronización.
2. overwrite.cli.url apuntando a http:// — enlaces de compartición inseguros.
3. trusted_domains mal configurado — error 'untrusted domain'.
4. Tamaño de subida limitado a 2 MB — añada client_max_body_size 10G en Nginx.
5. Actualizaciones de seguridad pendientes — configure notificaciones de actualización.
Verificar la eficacia de Redis con occ
docker compose exec -u www-data app php occ status
docker compose exec -u www-data app php occ check
docker compose exec -u www-data app php occ config:system:get redisEl comando occ check lista todos los problemas de configuración detectados. Es el primer diagnóstico que debe ejecutar en cualquier instancia Nextcloud existente.
Subidas de más de 40 GB tras Cloudflare: el ensamblado perdido
Nextcloud no envía un archivo grande de una vez: el cliente lo divide en fragmentos (chunks), depositados en una carpeta temporal, y luego pide al servidor que los ensamble con una petición final MOVE …/.file.
La issue nextcloud/server #65408, abierta el 12 de octubre de 2026 sobre Nextcloud 35, muestra lo que falla: un archivo de unos 43 GB subido mediante un enlace público, todos los fragmentos aceptados (201) y después un ensamblado de unos 17 minutos. Cloudflare corta una respuesta que supera su tiempo de lectura (125 segundos por defecto según su documentación, unos 100 segundos medidos por el autor a través de Cloudflare Tunnel) y devuelve un 524.
El punto de entrada de los enlaces públicos, publicremote.php, no llama a ignore_user_abort(true), a diferencia de remote.php: PHP interrumpe el ensamblado al cerrarse la conexión y después el navegador borra los fragmentos con una petición DELETE. Los archivos de 4 a 5 GB todavía pasan. A 22 de octubre de 2026, la issue sigue abierta, sin corrección publicada.
Los límites que hay que alinear, del CDN a PHP
- Cuerpo de petición en Cloudflare — 100 MB por petición en Free y Pro, 200 MB en Business, hasta 5 GB en Enterprise; por encima, respuesta
413. Cada fragmento debe quedar por debajo. - Tamaño de los fragmentos —
files.chunked_upload.max_sizevale 104857600 bytes (100 MiB) por defecto, algo más que 100 MB: baje a 50 MiB en Free o Pro. - Tiempo del CDN — 125 segundos, ampliable hasta 6.000 segundos solo en Enterprise: es el límite que supera el ensamblado.
- nginx —
proxy_request_buffering offtransmite el cuerpo a medida que llega en lugar de leerlo entero;proxy_read_timeoutvale 60 segundos por defecto. - PHP — la documentación de Nextcloud propone
max_execution_timeymax_input_timeen 3600;ignore_user_abort = Ondeja terminar el ensamblado tras el corte del proxy.
Configurar Nextcloud para subidas muy grandes
Sacar las subidas pesadas del proxy
Cloudflare recomienda un subdominio sin proxy (solo DNS) para las peticiones de más de 125 segundos. Cree
upload.your-domain.comen solo DNS, añádalo condocker compose exec -u www-data app php occ config:system:set trusted_domains 1 --value=upload.your-domain.comy despuéscertbot --nginx -d upload.your-domain.com. Este nombre expone la IP del servidor: resérvelo para las transferencias pesadas.Reducir los fragmentos
docker compose exec -u www-data app php occ config:system:set files.chunked_upload.max_size --type int --value 52428800fija 50 MiB (valor en bytes).Ajustar nginx
En
location /, añadaproxy_request_buffering off;yproxy_send_timeout 3600s;, conserveproxy_read_timeout 3600s;y despuésnginx -t && systemctl reload nginx.Ajustar PHP
Cree
/opt/nextcloud/php-uploads.iniconignore_user_abort = On,max_execution_time = 3600ymax_input_time = 3600, móntelo en el servicioapp:- ./php-uploads.ini:/usr/local/etc/php/conf.d/zz-uploads.ini:roy despuésdocker compose up -d app.Comprobar y probar
docker compose exec app php -i | grep ignore_user_abortdebe mostrarignore_user_abort => On => On. Suba después un archivo de varios gigabytes por el subdominio y sigadocker compose logs -f app.Elegir qué pasa por Cloudflare
El dominio principal puede seguir con proxy y solo el subdominio de transferencias pesadas pasa a solo DNS: consulte nuestra guía sobre el proxy de Cloudflare.
Diagnóstico de subidas grandes: los mensajes reales
Error 524: a timeout occurred — la respuesta al MOVE …/.file final no llegó dentro del tiempo de Cloudflare. Solución: el subdominio sin proxy.
413 Request entity too large — un fragmento supera el techo del plan de Cloudflare o client_max_body_size. Solución: reducir files.chunked_upload.max_size.
Could not open file: web-file-upload-<id>/75 … file doesn't seem to exist — recogido en la issue #65408: el ensamblado seguía mientras el navegador ya había borrado los fragmentos. El autor bloquea la petición DELETE en /public.php/dav/uploads/; la tarea UploadCleanup purga después los fragmentos abandonados al cabo de 24 horas. Con nginx, el equivalente es un bloque location ^~ /public.php/dav/uploads/ que contiene if ($request_method = DELETE) { return 403; } y el mismo proxy_pass. Solución no oficial, que debe retirarse en cuanto haya corrección.
504 Gateway Time-out durante el MOVE — es nginx quien abandona: la documentación de Nextcloud cita fastcgi_read_timeout en PHP-FPM, aquí proxy_read_timeout.
Copias de seguridad de Nextcloud — datos, base y configuración
Nextcloud almacena sus datos en tres lugares — los tres deben estar respaldados:
1. La base de datos MariaDB: metadatos de archivos, usuarios, recursos compartidos.
2. El volumen nextcloud: código PHP, apps instaladas y config/config.php.
3. Los archivos de los usuarios.
docker compose exec -u www-data app php occ maintenance:mode --on
# MariaDB 10.x:
docker compose exec -T db mysqldump -u nextcloud -p${MYSQL_PASSWORD} nextcloud | gzip > /opt/nextcloud/backups/db-$(date +%Y%m%d).sql.gz
# MariaDB 11+: use mariadb-dump en su lugar
docker compose exec -u www-data app php occ maintenance:mode --offCopia de seguridad con MariaDB 11 — mariadb-dump reemplaza a mysqldump
Desde MariaDB 11.0, los binarios mysqldump y mysql han sido eliminados de la imagen Docker oficial. Solo están disponibles mariadb-dump y mariadb. Los scripts que aún usen mysqldump con mariadb:11.x fallarán en silencio.
Verificar la versión de MariaDB:
docker compose exec db mariadb --versionScript de copia de seguridad compatible con MariaDB 11+:
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR=/opt/nextcloud/backups
mkdir -p $BACKUP_DIR
docker compose exec -u www-data app php occ maintenance:mode --on
# mariadb-dump reemplaza a mysqldump en MariaDB 11+
docker compose exec -T db \
mariadb-dump -u nextcloud -p${MYSQL_PASSWORD} nextcloud \
| gzip > $BACKUP_DIR/db-$DATE.sql.gz
if gzip -t $BACKUP_DIR/db-$DATE.sql.gz 2>/dev/null; then
echo "Copia OK: $BACKUP_DIR/db-$DATE.sql.gz"
else
echo "ERROR: archivo corrupto o vacío"
docker compose exec -u www-data app php occ maintenance:mode --off
exit 1
fi
docker compose cp app:/var/www/html/config/config.php $BACKUP_DIR/config-$DATE.php
docker compose exec -u www-data app php occ maintenance:mode --offRestauración:
gunzip -c $BACKUP_DIR/db-$DATE.sql.gz | \
docker compose exec -T db mariadb -u nextcloud -p${MYSQL_PASSWORD} nextcloudNota: si permanece en mariadb:10.11 (EOL febrero 2028), ambos mysqldump y mariadb-dump funcionan.
Próximos pasos — ir más lejos con su instancia
Una vez instalado y asegurado Nextcloud:
Activar Talk (videoconferencia): instale la aplicación Nextcloud Talk desde la interfaz de administración.
Activar OnlyOffice o Collabora Online: estas aplicaciones necesitan su propio contenedor Docker.
Monitorización: configure alertas en Administración → Monitorización.
Office 2021 al final de su vida útil: activar la coedición con Collabora Online u OnlyOffice
Microsoft Office 2021 alcanzó su fin de vida el 13 de octubre de 2026: ya no se publicarán parches de seguridad. Para equipos que coeditain archivos .docx, .xlsx y .pptx dentro de Nextcloud, dos suites ofimáticas de código abierto cubren esta necesidad directamente desde la interfaz web.
Collabora Online es la versión en línea de LibreOffice, distribuida bajo licencia AGPL. Se integra en Nextcloud mediante la app *Nextcloud Office* y se ejecuta en un contenedor separado basado en collabora/code:latest, comunicándose con Nextcloud por WebSocket.
OnlyOffice Document Server ofrece una interfaz más cercana a Microsoft Office — menús de cinta familiares para usuarios de Windows. También es AGPL y se integra mediante la app *ONLYOFFICE* del Nextcloud App Store.
Instalación desde el Nextcloud App Store:
# Collabora Online
docker compose exec -u www-data app php occ app:install richdocuments
# OnlyOffice
docker compose exec -u www-data app php occ app:install onlyofficeDespliegue Docker separado — ejemplo de Collabora Online:
Añada este servicio a su docker-compose.yml:
collabora:
image: collabora/code:latest
restart: unless-stopped
environment:
domain: cloud\.sudominio\.com
username: admin
password: ${COLLABORA_PASSWORD}
extra_params: --o:ssl.enable=false --o:ssl.termination=true
ports:
- '127.0.0.1:9980:9980'
cap_add:
- MKNODLuego configure la URL del servidor Collabora en Nextcloud (Administración → Oficina → URL del servidor Collabora Online: https://office.sudominio.com).
Huella de memoria: Collabora Online añade aproximadamente +300 MB de RAM por proceso activo (un proceso por documento abierto simultáneamente). OnlyOffice es algo más exigente: +400 MB por instancia activa. En un VPS de 2 GB, limite el uso simultáneo a 2–3 documentos o amplíe a 4 GB.
Formatos compatibles: ambas apps leen y escriben formatos Microsoft Office (.docx, .xlsx, .pptx) y formatos OpenDocument (.odt, .ods, .odp).
Collabora Online o OnlyOffice: ¿cuál elegir?
Desplace la tabla
| Criterio | Collabora Online | OnlyOffice Docs |
|---|---|---|
| Interfaz de usuario | Familiar de LibreOffice — curva de adaptación para equipos Windows | Cinta idéntica a Microsoft Office — adopción inmediata |
| Compatibilidad .docx/.xlsx/.pptx | Buena; .odt/.ods excelente | Muy fiel a los originales de Microsoft |
| RAM estimada | ~300 MB/proceso activo | ~400 MB/instancia activa |
| SSO/SAML Nextcloud | Integración nativa | Configuración adicional requerida |
| Conexiones simultáneas | Según la edición (CODE o empresarial) | Limitadas (edición comunitaria) |
| Comunidad | LibreOffice muy activa, actualizaciones frecuentes | Sólida, orientada a compatibilidad Microsoft |
¿Qué editor elegir?
Para un equipo mixto Linux/Windows que trabaja principalmente con archivos Microsoft Office, OnlyOffice reduce la fricción de adopción. Para un equipo ya en LibreOffice o con restricciones de memoria ajustadas, Collabora Online es la elección natural. Ambas apps son compatibles con Nextcloud 35.
Office 2021: qué termina y diagnóstico de Collabora
Según la página de ciclo de vida de Microsoft, Office 2021 (Hogar y Empresas, Hogar y Estudiantes, Profesional, versiones Mac incluidas) y Office LTSC 2021 para Windows ya no reciben correcciones desde el 13 de octubre de 2026; solo Office LTSC 2021 para Mac pasa al soporte extendido.
Al activar Collabora, «Could not establish connection to the Collabora Online server.» (Administración → Office) significa que Nextcloud no alcanza la URL declarada. Pruebe desde el contenedor: docker compose exec app curl -sI https://office.your-domain.com/hosting/discovery. Para reconfigurar y diagnosticar: docker compose exec -u www-data app php occ richdocuments:activate-config --wopi-url=https://office.your-domain.com; una respuesta Failed to fetch discovery endpoint from … apunta a la red o a TLS. El aviso «You have not configured the allow-list for WOPI requests» desaparece al declarar la IP del servidor Collabora en la lista de autorización WOPI. Comparativa detallada: Collabora Online u OnlyOffice.
Actualizar Nextcloud en producción
Ejecute siempre las actualizaciones en modo mantenimiento:
docker compose exec -u www-data app php occ maintenance:mode --on
# MariaDB 10.x:
docker compose exec -T db mysqldump -u nextcloud -p${MYSQL_PASSWORD} nextcloud \
| gzip > /opt/nextcloud/backups/pre-update-db.sql.gz
# MariaDB 11+: use mariadb-dump
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:34.0.4-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgrade
docker compose exec -u www-data app php occ maintenance:mode --offPHP 8.3: migración y requisitos previos de Nextcloud 35
Nextcloud 35 hace que PHP 8.3 sea obligatorio — PHP 8.2 ya no es compatible. Si usa una instalación nativa o una imagen Docker bloqueada en PHP 8.2, debe migrar PHP antes de actualizar a NC 35.
Verificar la versión de PHP:
# En Docker
docker compose exec app php --versionEn Docker — la imagen nextcloud:35.x-apache ya incluye PHP 8.3+. Solo actualice el tag:
image: nextcloud:35.0.0-apacheExtensiones PHP requeridas por Nextcloud 35: gd/imagick, redis, intl, bcmath, gmp, zip, opcache.
Verificar extensiones faltantes:
docker compose exec -u www-data app php occ checkNextcloud 35: ruta de actualización y versiones de PHP compatibles
Nextcloud 35.0.0 se publicó el 15 de septiembre de 2026 (Hub 26 Summer). Requiere PHP 8.3 como mínimo obligatorio (PHP 8.2 abandonado). PHP 8.4 y 8.5 también son compatibles (8.5 recomendado).
Ancle siempre a un tag explícito:
image: nextcloud:35.0.0-apacheRuta secuencial obligatoria: v33 → v34 → v35
# Paso 1: actualización a NC 34
docker compose exec -u www-data app php occ maintenance:mode --on
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:34.0.4-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgrade
docker compose exec -u www-data app php occ maintenance:mode --off
# Paso 2: actualización a NC 35
docker compose exec -u www-data app php occ maintenance:mode --on
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:35.0.0-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgrade
docker compose exec -u www-data app php occ maintenance:mode --offConsulte la matriz de compatibilidad en apps.nextcloud.com.
Comprobar la compatibilidad de las apps antes de actualizar a Nextcloud 35
Antes de actualizar a NC 35, lance la verificación de compatibilidad integrada:
docker exec -u www-data <nombre_del_contenedor> php occ app:check-platform-compatibilityTras la actualización, ejecute siempre occ check:
docker compose exec -u www-data app php occ checkRecognize v7 — Depurar el error silencioso 'sh: exec: line 1'
La aplicación Recognize (reconocimiento de imágenes y caras) puede fallar en silencio con:
Classifier process output: sh: exec: line 1: recognize/bin/node: not foundEste error no aparece en la interfaz de administración — solo en los logs del contenedor.
Diagnóstico:
docker compose logs app | grep -i recognize
docker compose exec app sh -c "ls -la /var/www/html/apps/recognize/bin/"
docker compose exec app uname -mCorrección en x86_64:
docker compose exec -u www-data app php occ config:app:set recognize \
tensorflow.gpu_enabled --value=false
docker compose exec -u www-data app php occ config:app:set recognize \
node_binary --value=""
docker compose exec -u www-data app php occ recognize:classifyEn ARM64: active el modo WASM en los ajustes de la app (Administración → Recognize → Use WASM backend).