안녕하세요, 임베딩 가이드를 따라 제 웹사이트에 Discourse 댓글을 임베드하려고 시도하고 있는데, 벽에 부딪혔습니다. ![]()
증상
Firefox와 Chrome에서 모두 시도해 보았습니다. 두 브라우저 모두에서 "Discussion 로딩 중…"이라는 Discourse iframe이 로드되지만 거기서 멈추며, 개발자 콘솔에 반복적인 JavaScript 오류가 발생합니다.
Firefox에서는 X-Frame-Options에 대한 오류가 발생합니다:
“https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927” 로딩 시 잘못된 X-Frame-Options 헤더가 발견되었습니다: “ALLOWALL”은 유효한 지시문이 아닙니다.
그 다음 embed-application.js:7에서 DOMException 오류가 발생합니다:
Uncaught DOMException: An invalid or illegal string was specified
이 두 오류는 약 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').
메타 사이트에서 이 오류에 대한 많은 주제들을 확인했고, 모든 문제 해결 단계를 시도해 보았지만 실패했습니다.
제 환경 구성
macOS용 Discourse 설치 가이드를 따랐지만, 하나의 예외가 있습니다: 노트북에 postgres, redis, mailcatcher를 전역으로 설치하는 대신, 포트가 공개적으로 노출된 Docker 컨테이너에서 실행하고 있습니다. Discourse는 이것이 베어 메탈이 아니라 Docker 컨테이너에서 실행된다는 것을 알지 못합니다. Rails/Discourse는 전역으로 설치되어 있으며, Docker 컨테이너에서 실행되지 않습니다.
완전히 별개로, 제 맞춤형 웹 애플리케이션은 Docker Compose 스택에서 실행되고 있습니다. 그 스택의 일부인 nginx 서버는 personnel.29th.local을 적절한 업스트림 컨테이너로 라우팅하고, discourse.29th.local을 host.docker.internal:3000으로 라우팅합니다(이것은 Docker 컨테이너가 호스트의 localhost에 도달할 수 있도록 하는 마법 같은 호스트명입니다).
(아래에서 언급하듯이, 방정식에서 nginx 레이어를 제거했는데도 동일한 오류가 발생했습니다.)
여기서 하나의 함정은 제 웹 앱이 JavaScript 싱글 페이지 애플리케이션이라는 점입니다. 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
그리고 관리자 대시보드에서 "force 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
또한 설정 대시보드에서 Content Security Policy를 비활성화해 보기도 했습니다.
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로 되돌리고, force https를 끄고, localhost를 통해 웹 앱과 Discourse에 접근하며, 웹 앱을 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').
저는 며칠 전 macOS용 Discourse 설치 가이드에 따라 master 브랜치를 클론하고 오늘 git pull origin master를 실행하여 가져온 2.6.0.beta6 ( 60bc38e6a8 ) 버전을 실행하고 있습니다.
또한 tmp 디렉토리를 삭제하고 서버를 재시작했습니다.
또한 산책도 하고, 베개에 소리도 질렀고, 책상 아래에서 울기도 했습니다.
모든 측면을 커버하고 있기를 바랍니다. 누군가 도움을 줄 수 있기를 바랍니다!
