Hola, estoy intentando incrustar comentarios de Discourse en mi sitio web siguiendo la guía de incrustación, pero he dado con un muro ![]()
Síntomas
Lo he probado en Firefox y Chrome. En ambos casos, carga el iframe de Discourse con el mensaje “Cargando discusión…”, pero se queda colgado allí, con errores de JavaScript recurrentes en la consola de desarrollador.
En Firefox, obtengo un error sobre X-Frame-Options:
Se encontró un encabezado X-Frame-Options inválido al cargar “https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927”: “ALLOWALL” no es una directiva válida.
Seguido de un error DOMException en embed-application.js:7:
Uncaught DOMException: Se especificó una cadena inválida o ilegal
Estos dos errores se repiten cada 30 segundos aproximadamente. No hay solicitudes fallidas en la pestaña de red.
En Chrome, no obtengo el error de X-Frame-Options. Después de unos segundos, obtengo un error sobre que el origen de destino no coincide con el origen de la ventana receptora:
Error al ejecutar 'postMessage' en 'DOMWindow': El origen de destino proporcionado ('https://discourse.29th.local') no coincide con el origen de la ventana receptora ('https://personnel.29th.local').
He visto muchos temas en meta sobre este error y he probado todos los pasos de solución de problemas, sin éxito.
Mi configuración
Seguí la guía de configuración de Discourse para Mac con una pequeña excepción: en lugar de instalar postgres, redis y mailcatcher globalmente en mi portátil, los tengo ejecutándose en contenedores Docker, con los puertos expuestos públicamente. Discourse no tiene idea de que se están ejecutando en contenedores Docker en lugar de en hardware físico. Rails/Discourse está instalado globalmente y no se está ejecutando en un contenedor Docker.
Por separado, mi aplicación web personalizada se está ejecutando en una pila de Docker Compose. Parte de esa pila incluye un servidor nginx que enruta personnel.29th.local al contenedor upstream correspondiente y discourse.29th.local a host.docker.internal:3000 (ese es el nombre de host mágico que los contenedores Docker pueden usar para alcanzar el localhost del host).
(Como menciono más abajo, eliminé la capa de nginx de la ecuación y terminé con el mismo error)
Una posible trampa aquí es que mi aplicación web es una aplicación de una sola página (SPA) en JavaScript. La página donde se incrustan los comentarios de Discourse es https://personnel.29th.local/#enlistments/1234 y no hay renderizado del lado del servidor. Si eso fuera un problema, esperaría un error con el rastreador, momento en el cual me conformaría con que Discourse simplemente enlazara a mi aplicación en lugar de rastrearla. Pero los errores que muestra no parecen relacionarse con fallos de rastreo.
Solución de problemas
He establecido el host incrustable en Admin > Personalizar > Incrustación en personnel.29th.local. Al principio, el código de ejemplo de incrustación mostraba http://localhost:3000/ para discourseUrl, así que inicié rails console y ejecuté:
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
Y activé “forzar https” en el panel de administración. Esto corrigió la URL en el código de ejemplo de incrustación.
También agregué https://personnel.29th.local como dominio CORS en la sección cors origins de la configuración.
Ahora estoy iniciando Discourse con el siguiente comando:
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
También intenté desactivar la Política de Seguridad de Contenido (CSP) en el panel de configuración.
He revisado https://discourse.29th.local/logs/ pero no he visto errores ni nada sobre Sidekiq.
En cuanto a Sidekiq, tengo un mensaje en el panel de administración sobre actualizaciones:
No se ha realizado una comprobación de actualizaciones. Asegúrese de que Sidekiq se esté ejecutando.
Así que ejecuté Sidekiq.redis { |r| puts r.flushall } en la consola de Rails y obtuve OK, reinicié el servidor de Rails y no hubo cambios en el mensaje ni en el problema general. He revisado la caché de Redis y no veo nada relacionado con esta página.
También intenté simplificar las cosas eliminando la capa de nginx de la ecuación: restableciendo SiteSetting.force_hostname y SiteSetting.port a nil, desactivando el forzado de https, accediendo a mi aplicación web y a Discourse a través de localhost, y agregando mi aplicación web a los hosts incrustables y nombres de host CORS de Discourse (http://localhost:8080), pero obtuve el mismo error, solo que con diferentes hosts:
Error al ejecutar 'postMessage' en 'DOMWindow': El origen de destino proporcionado ('http://localhost:3000') no coincide con el origen de la ventana receptora ('http://localhost:8080').
Estoy ejecutando la versión 2.6.0.beta6 ( 60bc38e6a8 ), que obtuve clonando la rama master según la guía de configuración de Discourse para Mac hace un par de semanas y ejecutando git pull origin master hoy.
También he eliminado el directorio tmp y reiniciado el servidor.
También he salido a caminar, gritado en una almohada y llorado debajo de mi escritorio.
Espero que esto cubra todas las bases. ¡Espero que alguien pueda ayudar!
