Default Content Deploy
Una solución de despliegue de contenido para Drupal que permite a los equipos exportar e importar contenido de forma continua mediante archivos JSON sin necesidad de transferir bases de datos.
default_content_deploy
Install
composer require 'drupal/default_content_deploy:^2.1'
Overview
Default Content Deploy (DCD) proporciona una solución integral de despliegue de contenido para Drupal, permitiendo a los equipos de desarrollo exportar y desplegar todo el contenido del sitio a través de Git. Esto elimina la necesidad de transferir bases de datos entre entornos (local, staging, producción).
El módulo serializa entidades a archivos JSON utilizando el formato HAL (Hypertext Application Language) y las almacena en un directorio de contenido configurable. El contenido puede exportarse individualmente, por tipo de entidad, con todas sus referencias, o el sitio completo de una vez. Las importaciones comparan inteligentemente las marcas de tiempo para actualizar solo el contenido que ha cambiado.
DCD es particularmente valioso para flujos de trabajo CI/CD donde el contenido necesita desplegarse automáticamente junto con los cambios de código. Soporta importaciones incrementales, sobrescrituras forzadas, y puede manejar relaciones complejas de entidades incluyendo bloques de Layout Builder y medios incrustados en campos de texto.
Features
- Exportar entidades individuales, tipos de entidad o todo el contenido del sitio a archivos JSON
- Importar contenido con comparación inteligente basada en marcas de tiempo para evitar sobrescribir contenido más reciente
- Exportar entidades con todas sus referencias de forma recursiva (media, archivos, términos de taxonomía, usuarios, etc.)
- Soporte para bloques inline de Layout Builder y contenido de bloques referenciados
- Exportar dependencias incrustadas en campos de texto procesado (imágenes, media, entidades en contenido de CKEditor)
- Descargar contenido exportado como un archivo comprimido tar.gz a través de la interfaz de administración
- Subir e importar contenido desde archivos tar.gz
- Opción de sobrescritura forzada para revertir todo el contenido al estado definido en los archivos de exportación
- Comandos Drush para todas las operaciones permitiendo automatización CI/CD
- Procesamiento por lotes para grandes conjuntos de contenido con seguimiento de progreso
- Modo de importación incremental que omite contenido sin cambios basándose en marcas de tiempo
- Sistema de eventos para personalizar el comportamiento de exportación/importación mediante suscriptores de eventos
- Omitir tipos de entidad específicos de las operaciones de exportación/importación
- Eliminar contenido durante la importación (marcar entidades exportadas para eliminación)
- Opción de preservar IDs de entidad para escenarios de despliegue específicos
- Submódulo de integración con Search API para seguimiento y exportaciones incrementales
- Recolección de basura basada en cron para elementos de lotes huérfanos
Use Cases
Sincronización de contenido del equipo de desarrollo
Múltiples desarrolladores trabajando en un proyecto pueden exportar contenido al repositorio Git. Cada desarrollador exporta sus cambios con 'drush dcdes', hace commit de los archivos JSON, y otros importan con 'drush dcdi' después de hacer pull. Esto elimina la necesidad de compartir volcados de base de datos y asegura que los cambios de contenido estén versionados junto con el código.
Despliegue automatizado de contenido CI/CD
En un pipeline de despliegue continuo, el contenido puede desplegarse automáticamente junto con el código. El script de despliegue incluye: git pull, drush updb -y, drush cim -y, drush cr, drush dcdi -y. Esto asegura que los entornos de staging y producción tengan contenido consistente sin intervención manual.
Contenido predeterminado para instalación del sitio
Empaquetar contenido predeterminado con un perfil de instalación personalizado o módulo. Exportar el contenido inicial una vez, hacer commit en el repositorio, y tenerlo importado automáticamente en cada instalación nueva. Perfecto para sitios de demostración, kits de inicio o paquetes de distribución.
Flujo de trabajo de staging de contenido
Los editores de contenido crean contenido en un entorno de staging. Usando la interfaz de exportación o comandos Drush, el contenido se exporta a archivos. Después de la revisión, estos archivos se despliegan a producción vía Git, donde se importan. Esto proporciona un flujo de trabajo controlado de promoción de contenido.
Migración y copia de seguridad del sitio
Exportar todo el contenido del sitio con 'drush dcdes' antes de actualizaciones importantes o migraciones. Los archivos JSON sirven como una copia de seguridad portable que puede importarse en cualquier instalación de Drupal con configuración coincidente, independientemente de las diferencias de base de datos.
Sincronización incremental de contenido con Search API
Usando el submódulo de Search API, los cambios de contenido se rastrean automáticamente. Solo las entidades modificadas se exportan, haciéndolo eficiente para sitios con grandes cantidades de contenido. El backend de Search API maneja la complejidad de determinar qué necesita ser exportado.
Tips
- Colocar el directorio de contenido fuera del document root por seguridad (ej., ../content relativo a la raíz web)
- Usar la opción --verbose con comandos Drush para ver progreso detallado e información a nivel de entidad durante importación/exportación
- Para sitios grandes, usar la opción --changes-since para exportar solo contenido modificado recientemente
- Exportar usuarios primero cuando se configura un nuevo entorno para asegurar la sincronización de UUID para usuarios admin y anónimo
- La carpeta _thumbs contiene archivos de metadatos ligeros para escaneo más rápido en importación incremental
- Usar 'drush dcd-entity-list' para ver todos los tipos de entidad disponibles antes de exportar
- Hacer commit de los archivos de contenido exportado a Git con mensajes de commit significativos para trazabilidad
- Probar las importaciones en un entorno de staging antes de desplegar a producción
- El submódulo de Search API proporciona exportación automática al guardar entidades, ideal para flujos de trabajo de exportación continua de contenido
Technical Details
Admin Pages 3
/admin/config/development/dcd
Configurar ajustes globales para las operaciones de exportación e importación de contenido, incluyendo la ruta del directorio de contenido, tipos de entidad a omitir y opciones de serialización.
/admin/config/development/dcd/import
Importar contenido desde archivos JSON almacenados en el directorio de contenido o desde un archivo comprimido subido. Equivalente al comando drush dcdi.
/admin/config/development/dcd/export
Exportar contenido a archivos JSON en el directorio de contenido o descargar como un archivo comprimido. Equivalente a los comandos drush dcde/dcder/dcdes.
Permissions 2
Hooks 2
hook_hal_type_uri_alter
Altera el URI de tipo HAL durante la serialización. DCD usa esto para crear URIs portables en formato [ENTITY_TYPE]/[BUNDLE].
hook_hal_relation_uri_alter
Altera el URI de relación HAL durante la serialización. DCD usa esto para crear URIs portables en formato relation/[ENTITY_TYPE]/[BUNDLE]/[FIELD].
Drush Commands 9
drush default-content-deploy:export <entity_type>
Exporta una entidad individual o grupo de entidades sin referencias. Exporta entidades como archivos JSON al directorio de contenido.
drush default-content-deploy:export-with-references <entity_type>
Exporta entidades junto con todas sus entidades referenciadas de forma recursiva. Incluye media, archivos, términos de taxonomía, usuarios y otro contenido referenciado.
drush default-content-deploy:export-site
Exporta todo el contenido del sitio completo. Útil para copias de seguridad completas del sitio o configuración inicial de despliegue de contenido.
drush default-content-deploy:import
Importa contenido desde archivos JSON en el directorio de contenido. Crea nuevas entidades o actualiza las existentes basándose en coincidencia de UUID.
drush default-content-deploy:uuid-info <entity_type> <id>
Muestra el valor UUID de una entidad específica. Útil para identificar entidades para exportación.
drush default-content-deploy:entity-list
Muestra todos los tipos de entidad de contenido disponibles en el sitio. Útil para determinar argumentos entity_type válidos.
drush default-content-deploy:get-last-import-timestamp
Obtiene la última marca de tiempo de importación almacenada en state para una carpeta de contenido. Usado para seguimiento de importación incremental.
drush default-content-deploy:set-last-import-timestamp <timestamp>
Establece la última marca de tiempo de importación en state para una carpeta de contenido. Útil para restablecer el estado de importación incremental.
drush default-content-deploy:sync-thumbs
Sincroniza la carpeta thumbs (metadatos) desde el directorio de contenido. Crea archivos de metadatos optimizados para importaciones incrementales más rápidas.
Troubleshooting 7
Aplicar el patch de https://www.drupal.org/files/issues/2023-04-05/2904423-90.patch para solucionar el problema del módulo HAL con campos traducidos.
Aplicar el patch del core de https://www.drupal.org/project/drupal/issues/2329253 para preservar las marcas de tiempo de entidad. Drupal 11 incluye esta corrección de forma nativa.
Mover el directorio de contenido fuera del document root (recomendado) o añadir .htaccess (Apache) o reglas de ubicación nginx para denegar acceso a los archivos JSON en el directorio de contenido.
Usar 'drush dcder' en lugar de 'drush dcde' para exportar con referencias. Verificar que los tipos de entidad referenciados no estén listados en la configuración 'skip_entity_types'.
La importación compara marcas de tiempo y omite entidades donde el archivo es más antiguo que la base de datos. Usar la opción --force-override para importar independientemente de las marcas de tiempo.
Por diseño, DCD usa UUIDs para la identificación de entidades. Los IDs de entidad pueden cambiar durante la importación. Si preservar los IDs es crítico, usar la opción --preserve-ids (puede causar conflictos con entidades existentes).
El módulo better_normalizers es incompatible con DCD. Eliminarlo antes de usar Default Content Deploy.
Security Notes 5
- Los archivos JSON exportados pueden contener datos sensibles. Siempre colocar el directorio de contenido fuera del document root o protegerlo con configuración del servidor web.
- El permiso de importación permite sobrescribir cualquier contenido existente. Otorgar este permiso solo a administradores de confianza.
- Los hashes de contraseñas de usuario se incluyen en las exportaciones de entidades de usuario. Asegurar que el directorio de contenido no sea accesible públicamente.
- Al importar desde archivos comprimidos subidos, validar la fuente para prevenir la importación de contenido malicioso.
- El módulo opera con privilegios de administrador durante la importación/exportación para acceder a todos los datos de entidades.