こんにちは、埋め込みガイド に従って、Web サイトに Discourse コメントを埋め込もうとしているのですが、行き詰まってしまいました ![]()
症状
Firefox と Chrome の両方で試しました。どちらの場合も、「Loading Discussion…」という Discourse の iframe が読み込まれますが、そこで停止し、開発者コンソールに繰り返し JavaScript エラーが表示されます。
Firefox では、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.
その後、embed-application.js:7 で DOMException エラーが発生します:
Uncaught DOMException: An invalid or illegal string was specified
これらの 2 つのエラーは約 30 秒ごとに繰り返されます。ネットワークタブには失敗したリクエストはありません。
Chrome では X-Frame-Options エラーは発生しませんが、数秒後に「ターゲットオリジンが受信ウィンドウのオリジンと一致しない」というエラーが発生します:
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').
メタ(meta)ではこのエラーに関するトピックを多数見かけ、すべてのトラブルシューティング手順を試しましたが、効果はありませんでした。
私の環境設定
Mac での Discourse 設定ガイド に従いましたが、少し例外があります。Postgres、Redis、Mailcatcher をラップトップにグローバルにインストールする代わりに、これらを Docker コンテナで実行し、ポートを外部に公開しています。Discourse は、これらが Docker コンテナではなくベアメタル上で実行されているとは知りません。Rails/Discourse はグローバルにインストールされており、Docker コンテナ内では実行されていません。
完全に別のことですが、カスタム Web アプリケーションは Docker Compose スタック内で実行されています。そのスタックの一部には nginx サーバーが含まれており、personnel.29th.local を適切なアップストリームコンテナへ、discourse.29th.local を host.docker.internal:3000(Docker コンテナからホストの localhost に到達するために使用できるマジックホスト名)へルーティングします。
(後述しますが、nginx レイヤーを除外しても同じエラーが発生しました)
ここで考えられる落とし穴は、私の Web アプリが JavaScript のシングルページアプリケーション(SPA)であることです。Discourse コメントが埋め込まれているページは https://personnel.29th.local/#enlistments/1234 で、サーバーサイドレンダリングは行われていません。これが問題であれば、クローラーに関連するエラーが発生すると予想されます。その場合は、Discourse が私のアプリをクローリングするのではなく、単にリンクを貼るだけでも構いません。しかし、表示されているエラーはクローリングの失敗とは関係ないように見えます。
トラブルシューティング
管理 > カスタマイズ > 埋め込み で埋め込み可能なホストを personnel.29th.local に設定しました。最初は、サンプルの埋め込みコードの discourseUrl が http://localhost:3000/ として表示されていたため、rails console を起動して以下を実行しました:
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
さらに、管理ダッシュボードで「HTTPS を強制する」をオンにしました。これでサンプルの埋め込みコード内の URL が修正されました。
また、設定の cors origins セクションに https://personnel.29th.local を CORS ドメインとして追加しました。
現在は、以下のコマンドで Discourse を起動しています:
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
さらに、設定ダッシュボードでコンテンツセキュリティポリシー(CSP)を無効にする試みもしました。
https://discourse.29th.local/logs/ を確認しましたが、エラーや Sidekiq に関する記述は見当たりませんでした。
Sidekiq についてですが、管理ダッシュボードに更新に関するメッセージが表示されています:
A check for updates has not been performed. Ensure sidekiq is running.
そこで、rails console で Sidekiq.redis { |r| puts r.flushall } を実行し、OK が返ってきたため、rails サーバーを再起動しましたが、メッセージも全体の状況も変わりませんでした。Redis キャッシュをいろいろ探しましたが、このページに関する記述は見つかりませんでした。
また、nginx レイヤーを除外して状況を単純化しようと試みました:SiteSetting.force_hostname と SiteSetting.port を nil に戻し、HTTPS 強制をオフにし、Web アプリと Discourse に localhost でアクセスし、Web アプリを Discourse の埋め込み可能なホストと CORS ホスト名(http://localhost:8080)に追加しましたが、ホスト名が異なるだけで同じエラーが発生しました:
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('http://localhost:3000') does not match the recipient window's origin ('http://localhost:8080').
使用しているバージョンは 2.6.0.beta6 ( 60bc38e6a8 ) です。これは、Discourse for Mac 設定ガイドに従って数週間前に master ブランチをクローンし、今日 git pull origin master を実行して取得したものです。
また、tmp ディレクトリを削除してサーバーを再起動しました。
散歩に行き、枕に向かって叫び、机の下で泣いてみました。
これで網羅できているはずです。誰か助けてください!
