CMS Content Sync
Módulo de sincronización de contenido de nivel empresarial que permite el intercambio bidireccional de contenido entre múltiples sitios Drupal a través de un servicio centralizado Sync Core.
cms_content_sync
Install
composer require 'drupal/cms_content_sync:^3.0'
Overview
CMS Content Sync es un módulo integral para Drupal 10/11 que proporciona capacidades sofisticadas de sincronización de contenido entre múltiples instalaciones de Drupal. Utiliza un servicio centralizado Sync Core para gestionar y orquestar la distribución de contenido, permitiendo a las organizaciones mantener contenido consistente en toda su infraestructura multisitio.
El módulo admite operaciones bidireccionales de push y pull, permitiendo que los sitios publiquen contenido hacia y reciban contenido desde un repositorio central. El contenido puede sincronizarse automáticamente, manualmente o como dependencias cuando se envía contenido relacionado. El sistema rastrea el estado de las entidades entre sitios, gestiona conflictos de contenido y admite flujos de trabajo de traducción.
Las capacidades clave incluyen soporte para más de 20 tipos de entidad (nodes, media, taxonomy terms, menu links, paragraphs, blocks y más), más de 19 manejadores de campo para diferentes tipos de campo, integración con REST API para operaciones remotas, procesamiento por lotes para sincronización a gran escala e interfaces de administración completas para configuración y monitoreo.
Features
- Sincronización bidireccional de contenido (push/pull) entre múltiples sitios Drupal utilizando un servicio centralizado Sync Core
- Sistema de gestión de flujos que permite control granular sobre qué tipos de contenido, bundles y campos se sincronizan
- Organización de contenido basada en pools que permite la agrupación de contenido y control de acceso entre sitios
- Soporte para más de 10 tipos de entidad incluyendo nodes, media, taxonomy terms, menu links, paragraphs, blocks, files, config pages, entity queues y group content
- 19 manejadores de campo que admiten campos de texto, referencias de entidad, paragraphs, archivos, imágenes, layout builder, estado de moderación, enlaces, rutas, webforms y más
- Seguimiento del estado de entidades en tiempo real con historial de sincronización, marcas de tiempo y detección de fallos
- Endpoints REST API para comunicación con sitios remotos e integración con Sync Core
- Procesamiento por lotes para operaciones de push/pull a gran escala evitando tiempos de espera agotados
- Soporte de traducción con sincronización consciente del idioma y manejo independiente de traducciones
- Protección contra sobrescritura de contenido permitiendo modificaciones locales mientras se preservan las relaciones de sincronización
- Panel de pull manual para descubrimiento de contenido e importación selectiva desde sitios remotos
- Panel de monitoreo de salud para seguimiento del estado de sincronización, fallos y problemas de configuración
- Comandos Drush para exportación de configuración, push, pull y gestión de estado basados en CLI
- Herramientas de migración para transición desde Acquia Content Hub
- Soporte para entornos privados para desarrollo local y sitios no accesibles públicamente
- Integración con DraggableViews para ordenamiento sincronizado de contenido
- Capacidades de sincronización cruzada permitiendo que el contenido fluya entre sitios bidireccionalmente
Use Cases
Distribución de contenido multi-sitio
Un equipo editorial central crea contenido en un sitio Drupal principal y lo envía a múltiples sitios regionales o específicos de marca. Cada sitio regional recibe automáticamente nuevo contenido, actualizaciones y eliminaciones mientras mantiene personalizaciones locales a través de la función de anulación.
Flujo de trabajo de preparación de contenido
El contenido se crea y edita en un entorno de staging, luego se envía a producción cuando es aprobado. El sitio de staging envía contenido mientras el sitio de producción lo recibe, asegurando un despliegue controlado de contenido con soporte completo de traducción.
Repositorio de contenido desacoplado
Múltiples aplicaciones frontend (web, móvil, kiosco) obtienen contenido de un repositorio Drupal central. El repositorio envía contenido a un Sync Core que luego lo distribuye a las aplicaciones consumidoras, habilitando una verdadera arquitectura headless.
Red de franquicias/distribuidores
Un sitio corporativo mantiene contenido central (productos, políticas, activos de marca) que se distribuye automáticamente a cientos de sitios de franquicias. Los sitios locales pueden agregar su propio contenido mientras reciben actualizaciones corporativas, con control de acceso basado en pools.
Colaboración editorial entre sitios
Múltiples equipos editoriales en diferentes sitios pueden enviar contenido a pools compartidos, habilitando la reutilización de contenido entre sitios. Cada sitio mantiene control sobre qué contenido recibe a través de la configuración de flow.
Migración y consolidación de contenido
El contenido heredado de múltiples sitios Drupal antiguos se importa a una nueva plataforma central. El submódulo de migración ayuda en la transición desde Acquia Content Hub, y el mapeo de Entity asegura que las relaciones de contenido se preserven.
Tips
- Siempre exportar la configuración después de hacer cambios en el flow usando la UI o el comando 'drush cse'
- Usar el panel de Health (submódulo cms_content_sync_health) para monitorear el estado de sincronización e identificar fallos
- Para entornos de desarrollo detrás de firewalls, habilitar el submódulo private_environment para usar sondeo de solicitudes
- Al copiar flows de sitios remotos, usar las opciones de transformación para ajustar la configuración de push/pull según el rol de su sitio
- Las versiones de Entity type se calculan automáticamente - si ve incompatibilidades de versión, usar el submódulo developer para identificar diferencias en Fields
- Usar organización basada en pools para controlar qué sitios reciben qué tipos de contenido
- La casilla 'Override' en el contenido permite modificaciones locales mientras mantiene el seguimiento de la relación de sincronización
- Para sincronizaciones iniciales grandes, usar comandos Drush con la opción --type para procesar en lotes
- La funcionalidad de vista previa para el panel de pull requiere habilitarla en configuración y re-exportar los flows
- Configurar cuidadosamente las opciones de eliminación - las eliminaciones enviadas eliminarán contenido de los sitios receptores
Technical Details
Admin Pages 10
/admin/config/services/cms_content_sync/site
Registra y configura tu sitio con el servicio Sync Core. Visualiza el estado del sitio, UUID y detalles de conexión.
/admin/config/services/cms_content_sync/syndication
Panel React integrado que muestra el progreso de sindicación en tiempo real, el estado del contenido en los sitios y las operaciones de sincronización.
/admin/config/services/cms_content_sync/pool
Gestiona los pools de contenido - agrupaciones lógicas de contenido que controlan el alcance y acceso de la sincronización.
/admin/config/services/cms_content_sync/pool/add
Crea un nuevo pool de contenido para organizar el contenido sincronizado.
/admin/config/services/cms_content_sync/flow
Gestiona los flujos de sincronización que definen qué tipos de contenido y campos se sincronizan y cómo.
/admin/config/services/cms_content_sync/flow/add
Crea un nuevo flujo de sincronización definiendo qué contenido se sincroniza y cómo.
/admin/config/services/cms_content_sync/settings
Configura los ajustes globales para la sincronización de contenido incluyendo autenticación, URL base y registro de eventos.
/admin/config/services/cms_content_sync/compatibility
Visualiza la matriz de soporte de tipos de Entity y Field mostrando qué tipos pueden ser sincronizados.
/admin/config/services/cms_content_sync/flow/copy/remote
Asistente de múltiples pasos para copiar la configuración de flujo desde otro sitio conectado.
/admin/cms-content-sync/publish-multiple-changes/confirm/{entities}
Diálogo de confirmación para enviar las entidades seleccionadas a otros sitios con opciones de traducción y prioridad.
Permissions 9
Hooks 6
hook_cms_content_sync_entity_handler_info_alter
Modificar las definiciones de plugins de manejadores de entidades
hook_cms_content_sync_field_handler_info_alter
Modificar las definiciones de plugins de manejadores de campos
hook_cms_content_sync_before_entity_push
Se invoca antes de enviar una entidad, permitiendo modificaciones o cancelación
hook_cms_content_sync_after_entity_push
Se invoca después de que una entidad se envía exitosamente
hook_cms_content_sync_before_entity_pull
Se invoca antes de recibir una entidad, permitiendo modificaciones o denegación
hook_cms_content_sync_after_entity_pull
Se invoca después de que una entidad se recibe exitosamente
Drush Commands 6
drush cms_content_sync:configuration-export
Exporta toda la configuración de pools y flows al servicio Sync Core
drush cms_content_sync:pull
Obtiene entidades desde Sync Core para un flow específico
drush cms_content_sync:push
Envía entidades al Sync Core para un flow específico
drush cms_content_sync:reset-status-entities
Restablece el estado de sincronización para todas las entidades en un pool, limpiando las marcas de tiempo de push/pull
drush cms_content_sync:check-entity-flags
Verifica las banderas de sincronización para una entidad específica por UUID
drush cms_content_sync:register
Registra este sitio con el servicio backend de Content Sync
Troubleshooting 7
1. Verificar que el flow esté activo y exportado (buscar advertencia 'Export required'). 2. Asegurar que el Entity type/bundle esté configurado para push en el flow. 3. Verificar que al menos un pool esté configurado como 'Force' o 'Allow'. 4. Verificar que el sitio esté registrado con el Sync Core. 5. Ejecutar 'drush cse' para exportar la configuración. 6. Revisar los logs de watchdog en busca de errores.
1. Verificar que el flow tenga pull configurado para el Entity type. 2. Comprobar que la configuración del pool permita pull desde el pool de origen. 3. Asegurar que la versión del Entity type del sitio receptor coincida con la del origen. 4. Verificar si hay campos requeridos faltantes. 5. Revisar el panel de Health para fallos de pull.
Las versiones de Entity type se calculan a partir de la configuración de Field. Cuando los Fields difieren entre sitios, las versiones no coincidirán. Habilitar el submódulo developer para ver las diferencias específicas. Ya sea agregar los Fields faltantes a ambos sitios o configurar el flow para ignorar los Fields incompatibles.
1. Asegurar que las File Entity estén configuradas en el flow (ya sea directamente o como dependencias). 2. Verificar que el manejador de archivos esté seleccionado para los Fields de archivo/imagen. 3. Verificar que el sitio de destino pueda escribir en el directorio de archivos. 4. Para archivos privados, asegurar que la autenticación esté configurada correctamente.
1. Verificar que ambos sitios tengan los mismos idiomas habilitados. 2. Revisar la configuración del flow para el manejo de traducciones. 3. Para manejo independiente de traducciones, cada traducción se envía por separado. 4. Asegurar que el idioma predeterminado exista en ambos sitios.
Al enviar contenido con Fields de referencia no traducidos que contienen nuevas Entity embebidas, todas las traducciones pueden enviarse. Esto asegura que el contenido embebido esté disponible en todos los idiomas. El diálogo de confirmación explica este comportamiento.
1. Usar comandos Drush (cs-push, cs-pull) en lugar de la UI para operaciones masivas. 2. Habilitar el procesamiento por lotes. 3. Considerar filtrar por Entity type o bundle. 4. Verificar el estado del Sync Core para acumulación en la cola. 5. Habilitar el registro extendido temporalmente para identificar cuellos de botella.
Security Notes 8
- CMS Content Sync usa almacenamiento cifrado (Real AES) para credenciales de autenticación - asegurar que la clave de cifrado esté correctamente configurada y protegida
- Los endpoints REST están protegidos por el sistema de permisos de Drupal - revisar cuidadosamente las asignaciones de Role para permisos REST
- El Role dedicado 'cms_content_sync' solo debe asignarse al usuario del sistema, no a usuarios humanos
- El tipo de autenticación Basic Auth puede exponer credenciales si no se usa sobre HTTPS - siempre usar HTTPS en producción
- Al usar entornos privados con sondeo de solicitudes, tener en cuenta que las solicitudes se originan desde el servicio Sync Core
- La configuración 'allow local deletion of import' debe considerarse cuidadosamente - habilitarla permite a los usuarios eliminar contenido que provino de otros sitios
- Las opciones de registro extendido capturan datos completos de Entity en watchdog - deshabilitar después de depurar para evitar almacenar contenido sensible en logs
- Los tokens de registro de sitio expiran después de 5 minutos - no almacenarlos ni compartirlos