Hallo, ich versuche, Discourse-Kommentare auf meiner Website einzubetten, und folge dabei dem Einbettungsguide, aber ich bin an eine Wand gelaufen ![]()
Symptome
Ich habe es in Firefox und Chrome versucht. In beiden Fällen wird das Discourse-iFrame „Discussion wird geladen…“ geladen, bleibt aber hängen, wobei im Entwickler-Tool wiederholt JavaScript-Fehler auftreten.
In Firefox erhalte ich einen Fehler bezüglich X-Frame-Options:
Bei dem Laden von „https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927“ wurde ein ungültiger X-Frame-Options-Header gefunden: „ALLOWALL“ ist keine gültige Direktive.
Danach folgt ein DOMException-Fehler in embed-application.js:7:
Uncaught DOMException: Es wurde eine ungültige oder illegale Zeichenfolge angegeben
Diese beiden Fehler wiederholen sich alle ca. 30 Sekunden. Im Network-Tab gibt es keine fehlgeschlagenen Anfragen.
In Chrome bekomme ich keinen X-Frame-Options-Fehler. Nach einigen Sekunden erhalte ich einen Fehler, dass die angegebene Ziel-Quelle nicht mit der Quelle des Empfänger-Fensters übereinstimmt:
Ausführung von 'postMessage' auf 'DOMWindow' fehlgeschlagen: Die angegebene Ziel-Quelle ('https://discourse.29th.local') stimmt nicht mit der Quelle des Empfänger-Fensters ('https://personnel.29th.local') überein.
Ich habe bereits viele Themen auf Meta zu diesem Fehler gesehen und alle Fehlerbehebungsschritte ausprobiert, leider ohne Erfolg.
Meine Einrichtung
Ich habe mich an den Einrichtungsleitfaden für Discourse auf dem Mac gehalten, mit einer kleinen Ausnahme: Anstatt PostgreSQL, Redis und Mailcatcher global auf meinem Laptop zu installieren, lasse ich sie in Docker-Containern laufen, wobei die Ports öffentlich freigegeben sind. Discourse hat keine Ahnung, dass sie in Docker-Containern und nicht auf der physischen Hardware laufen. Rails/Discourse ist global installiert und läuft nicht in einem Docker-Container.
Völlig separat läuft meine benutzerdefinierte Webanwendung in einem Docker-Compose-Stack. Ein Teil dieses Stacks ist ein Nginx-Server, der personnel.29th.local an den entsprechenden Upstream-Container und discourse.29th.local an host.docker.internal:3000 weiterleitet (das ist der magische Hostname, den Docker-Container verwenden können, um auf das localhost des Hosts zuzugreifen).
(Wie unten erwähnt, habe ich die Nginx-Schicht aus der Gleichung entfernt und landete beim selben Fehler)
Ein möglicher Stolperstein hier ist, dass meine Webanwendung eine JavaScript-Single-Page-App ist. Die Seite, auf der Discourse-Kommentare eingebettet werden, lautet https://personnel.29th.local/#enlistments/1234, und es gibt kein serverseitiges Rendering. Wenn das ein Problem wäre, würde ich einen Fehler beim Crawler erwarten, woraufhin ich mich damit zufriedengeben würde, dass Discourse einfach einen Link zu meiner App setzt, anstatt sie zu crawlen. Aber die angezeigten Fehler scheinen sich nicht auf Crawling-Fehler zu beziehen.
Fehlerbehebung
Ich habe die einbettbare Host-Adresse unter Admin > Anpassen > Einbettung auf personnel.29th.local gesetzt. Zunächst zeigte der Beispiel-Einbettungscode http://localhost:3000/ für die discourseUrl an, also habe ich rails console gestartet und folgendes ausgeführt:
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
Und im Admin-Dashboard „HTTPS erzwingen“ aktiviert. Damit wurde die URL im Beispiel-Einbettungscode korrigiert.
Ich habe zudem https://personnel.29th.local als CORS-Domain im Abschnitt cors origins der Einstellungen hinzugefügt.
Jetzt starte ich Discourse mit folgendem Befehl:
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
Ich habe auch versucht, die Content Security Policy im Einstellungs-Dashboard zu deaktivieren.
Ich habe unter https://discourse.29th.local/logs/ nachgeschaut, aber keine Fehler und nichts bezüglich Sidekiq gefunden.
Was Sidekiq angeht, habe ich eine Meldung im Admin-Dashboard zu Updates:
Ein Check auf Updates wurde nicht durchgeführt. Stellen Sie sicher, dass Sidekiq läuft.
Also habe ich Sidekiq.redis { |r| puts r.flushall } in der Rails-Konsole ausgeführt und OK erhalten, den Rails-Server neu gestartet, aber weder die Meldung noch das Gesamtproblem haben sich geändert. Ich habe im Redis-Cache herumgesucht und nichts zu dieser Seite gefunden.
Ich habe zudem versucht, die Sache zu vereinfachen, indem ich die Nginx-Schicht aus der Gleichung genommen habe: SiteSetting.force_hostname und SiteSetting.port wieder auf nil gesetzt, „HTTPS erzwingen“ deaktiviert, meine Webanwendung und Discourse über localhost aufgerufen und meine Webanwendung zu den einbettbaren Hosts und CORS-Hostnamen von Discourse hinzugefügt (http://localhost:8080). Doch ich bekam denselben Fehler, nur mit anderen Hosts:
Ausführung von 'postMessage' auf 'DOMWindow' fehlgeschlagen: Die angegebene Ziel-Quelle ('http://localhost:3000') stimmt nicht mit der Quelle des Empfänger-Fensters ('http://localhost:8080') überein.
Ich verwende die Version 2.6.0.beta6 ( 60bc38e6a8 ), die ich vor ein paar Wochen durch Klonen des master-Branches gemäß dem Discourse-for-Mac-Einrichtungsleitfaden erhalten und heute mit git pull origin master aktualisiert habe.
Ich habe zudem das tmp-Verzeichnis gelöscht und den Server neu gestartet.
Ich bin auch spazieren gegangen, habe in ein Kissen geschrien und unter meinem Schreibtisch geweint.
Hoffentlich habe ich hiermit alle Möglichkeiten abgedeckt. Ich hoffe, jemand kann mir helfen!
