Bonjour, j’essaie d’intégrer des commentaires Discourse sur mon site web, en suivant le guide d’intégration, mais je suis bloqué ![]()
Symptômes
J’ai testé avec Firefox et Chrome. Dans les deux cas, l’iframe Discourse affiche « Chargement de la discussion… » mais reste bloquée, avec des erreurs JavaScript récurrentes dans la console de développement.
Sous Firefox, j’obtiens une erreur concernant l’en-tête X-Frame-Options :
Invalid X-Frame-Options header was found when loading “https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927”: “ALLOWALL” is not a valid directive.
Suivie d’une erreur DOMException dans embed-application.js:7 :
Uncaught DOMException: An invalid or illegal string was specified
Ces deux erreurs se répètent toutes les 30 secondes environ. Aucune requête échouée n’apparaît dans l’onglet Réseau.
Sous Chrome, je n’obtiens pas l’erreur X-Frame-Options. Après quelques secondes, j’obtiens une erreur indiquant que l’origine cible ne correspond pas à l’origine de la fenêtre destinataire :
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://discourse.29th.local') does not match the recipient window's origin ('https://personnel.29th.local').
J’ai vu de nombreux sujets sur Meta concernant cette erreur et j’ai essayé toutes les étapes de dépannage, sans succès.
Ma configuration
J’ai suivi le guide d’installation de Discourse sur Mac avec une légère exception : au lieu d’installer postgres, redis et mailcatcher globalement sur mon ordinateur portable, je les exécute dans des conteneurs Docker avec les ports exposés publiquement. Discourse ignore qu’ils tournent dans des conteneurs Docker plutôt que directement sur le matériel. Rails/Discourse est installé globalement et ne s’exécute pas dans un conteneur Docker.
Tout à fait séparément, mon application web personnalisée s’exécute dans une stack Docker Compose. Cette stack comprend un serveur nginx qui route personnel.29th.local vers le conteneur amont approprié, et discourse.29th.local vers host.docker.internal:3000 (c’est le nom d’hôte magique que les conteneurs Docker peuvent utiliser pour atteindre le localhost de l’hôte).
(Comme je le mentionne ci-dessous, j’ai retiré la couche nginx de l’équation et obtenu la même erreur)
Un problème potentiel ici est que mon application web est une application monopage (SPA) JavaScript. La page où les commentaires Discourse sont intégrés est https://personnel.29th.local/#enlistments/1234 et il n’y a pas de rendu côté serveur. Si cela posait problème, je m’attendrais à une erreur avec le crawler, auquel cas je me contenterais que Discourse se contente de lier vers mon application plutôt que de la crawler. Mais les erreurs affichées ne semblent pas liées à des échecs de crawl.
Dépannage
J’ai défini l’hôte intégrable dans Admin > Personnaliser > Intégration sur personnel.29th.local. Au début, le code d’intégration d’exemple affichait http://localhost:3000/ pour discourseUrl, alors j’ai lancé rails console et exécuté :
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
J’ai ensuite activé « forcer https » dans le tableau de bord administrateur. Cela a corrigé l’URL dans le code d’intégration d’exemple.
J’ai également ajouté https://personnel.29th.local en tant que domaine CORS dans la section cors origins des paramètres.
Je lance désormais Discourse avec la commande suivante :
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
J’ai également essayé de désactiver la politique de sécurité du contenu (CSP) dans le tableau de bord des paramètres.
J’ai consulté https://discourse.29th.local/logs/ mais je n’ai vu aucune erreur, ni rien concernant Sidekiq.
Concernant Sidekiq, j’ai un message sur le tableau de bord administrateur concernant les mises à jour :
A check for updates has not been performed. Ensure sidekiq is running.
J’ai donc exécuté Sidekiq.redis { |r| puts r.flushall } dans la console Rails et obtenu OK, redémarré le serveur Rails, mais le message et le problème global n’ont pas changé. J’ai exploré le cache Redis et je n’ai rien trouvé concernant cette page.
J’ai également tenté de simplifier les choses en retirant la couche nginx de l’équation : en rétablissant SiteSetting.force_hostname et SiteSetting.port sur nil, en désactivant le forçage de https, en accédant à mon application web et à Discourse via localhost, et en ajoutant mon application web aux hôtes intégrables et aux noms d’hôtes CORS de Discourse (http://localhost:8080), mais j’ai obtenu la même erreur, avec simplement des hôtes différents :
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('http://localhost:3000') does not match the recipient window's origin ('http://localhost:8080').
J’exécute la version 2.6.0.beta6 ( 60bc38e6a8 ), obtenue en clonant la branche master conformément au guide d’installation de Discourse sur Mac il y a quelques semaines, et en exécutant git pull origin master aujourd’hui.
J’ai également supprimé le répertoire tmp et redémarré le serveur.
J’ai aussi fait une promenade, crié dans un oreiller et pleuré sous mon bureau.
J’espère que cela couvre tous les aspects. J’espère que quelqu’un pourra m’aider !
