Discourse 댓글이 "로딩 중..."에 멈춤

안녕하세요,

지난 며칠 동안 저희 Discourse에서 “View Full Post” 버튼을 클릭하면 “Loading…” 상태로 계속 남아 있는 것을 확인했습니다:

또한, 저희 Drupal 웹사이트 내 임베드에서 새로운 Discourse 댓글이 표시되지 않고 있습니다. 아래에 있는 JavaScript 임베드 지침을 수년 동안 성공적으로 사용해 왔습니다:

그러나 최근 이 기능이 작동하지 않는 것 같습니다. 마지막으로 정상적으로 작동한 게시글은 이번 달 1일경인 것으로 보입니다. 오래된 게시글은 Discourse와 임베드 모듈 모두에서 정상적으로 표시되지만, 최근의 새로운 게시물에서는 Discourse 블록이 “Loading…” 텍스트에서 멈춰 있습니다.

저희 Discourse Drupal 모듈은 다음 코드에서 로드됩니다:

<div id="discourse-comments">
 <script type="text/javascript">
            var discourseUrl = "https://discourse.sitename.com/",
            discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

            (function() {
              var d = document.createElement("script"); d.type = "text/javascript"; d.async = true;
              d.src = discourseUrl + "javascripts/embed.js";
              (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(d);
            })();
          </script>
 </div>

“javascripts/embed.js” 파일이 여전히 동일한 경로에 존재하는지 확인했습니다.
아래는 게시물 페이지에 표시되는 블록입니다. 최근에는 단순히 "Loading Discussion…"만 표시됩니다:
image

저희는 지난 수년 동안 Discourse 임베드나 설정에 어떠한 변경 사항도 넣지 않았습니다. 이 문제를 일으킬 수 있는 최근 Discourse 기능에 변경 사항이 있었나요? 이 문제를 해결하는 데 도움이 주시면 감사하겠습니다!

우리는 사이트에서 동일한 임베드 기능을 사용하고 있습니다. discourseUrl과 discouseEmbedUrl은 위에서 게시한 값이 아니라 포럼에 해당하는 URL일 것으로 추정합니다.

그렇지 않다면, 코드는 문제없는 것으로 보입니다. 최신 Discourse 베타에서는 임베드 기능이 정상적으로 작동한다는 것을 알고 있습니다. 지난 한 주 동안 많은 양의 임베드된 게시글을 확인했습니다. 게시글의 첫 부분만 임베드되고 ‘전체 게시글 보기’ 버튼이 작동하지 않는다는 점이 다소 이상합니다. 저희 쪽에서는 즉시 로드됩니다 :thinking:

콘솔에 오류가 있는지 확인해 보셨나요?

문제의 원인을 좁혀 보려면 embed_truncate 설정을 비활성화하여 전체 텍스트가 게시되는지 확인해 볼 수도 있습니다.

최근에 테마를 업그레이드하거나 변경한 적이 있나요? 아니면 정말로 수년간 업그레이드를 하지 않았다는 뜻인가요?

네, 맞습니다. 명확성을 위해 사이트명 플레이스홀더를 사용했습니다.
다행히도 Discourse 임베드 기능이 깨진 것이 아니라 우리 쪽 문제인 것 같아 안심이 됩니다.

Discourse 로그(discourse.sitename.com/logs)를 확인해 보니 아래와 같은 비추천(deprecation) 알림이 많이 표시되고 있습니다:

비추천 알림: SiteSetting.enable_personal_messages는 비추천되었습니다.

확실히 embed_truncate도 비활성화해 볼 수 있습니다. 다음으로 그 설정을 찾아보겠습니다. 하지만 해당 기능은 수년간 문제없이 작동해 왔기 때문에 왜 갑자기 깨지는지 모르겠습니다…

전체 게시글 보기 버튼을 클릭했을 때 개발자 도구 콘솔에서 오류가 표시되는지 확인해 보세요. 개발자 도구는 우클릭 후 "검사"를 선택하여 열 수 있습니다. 오류는 오른쪽에 빨간색으로 표시됩니다.

네, 임베드 기능이 고장 난 것은 절대 아닙니다. 제 사이트에서는 하루에 여러 번 발생하는 일입니다.

최신 베타 버전은 Discourse 3.1.0.beta4이고, 안정 버전은 3.0.3: Security and bug fix release 입니다.

저희 환경은 관리형으로 운영되고 있다고 생각합니다. 제가 직접 변경한 사항은 없지만, Discourse 대시보드에는 마지막 업데이트 날짜가 4월 18일로 표시되어 있습니다. 해당 날짜와 연결된 최신 공지사항을 확인해 보니, 버전이 3.0.3인 것 같습니다.

최신 Discourse 버전을 실행 중인지도 확인해 주세요. 안전 모드에서도 동일한 문제가 발생하는지 살펴보는 것도 도움이 될 수 있습니다.

좋은 판단이네요, 감사합니다! 방금 확인해보니 다음과 같은 오류가 나네요:

Uncaught DOMException: An invalid or illegal string was specified

postUp embed-application.js:6

onload embed-application.js:36

EventHandlerNonNull* embed-application.js:25

<anonymous> embed-application.js:66

[embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js:5](https://conversation.spectrummagazine.org/assets/embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js)

postUp embed-application.js:6

onload embed-application.js:36

(Async: EventHandlerNonNull)
<anonymous> embed-application.js:25

<anonymous> embed-application.js:66

최근에 코드나 다른 부분에 아무런 변경을 하지 않았는데 정말 이상합니다. 다만, 이번 달 2일에 보안을 강화하기 위해 Cloudflare을 사용했던 기억이 나네요. 스크립트를 차단할 수 있는 Cloudflare 측 설정을 확인해봐야 할 것 같습니다.

마지막으로 이 문제를 확인했을 때 개발자 도구 콘솔에서 CSP 오류를 봤었으니, 아마 Cloudflare 쪽에서 발생한 문제일 수도 있겠네요.

이것과 관련이 있을 것 같습니다.

우리 상위 사이트가 온라인 콘텐츠 정책과 보안 설정을 한 번 수정했을 때, 우리 임베드가 며칠 동안 차단된 적이 있습니다. 다만 효과는 달랐는데, 포럼에 게시하는 방향이 아니라 반대 방향으로의 임베드가 차단되었습니다.

오, 좋은 생각이에요! 이 문제를 해결하기 위해 어떤 보안 설정을 변경해야 했는지 혹시 알고 계세요?
제가 몇 가지 변경 사항을 적용해 두어서, 정확히 어떤 설정을 되돌려야 할지 모르겠거든요.

정말 모르겠어요. 사이트의 그 부분은 제가 관리하지 않거든요. 보안 정책 설정을 되돌리려고 호스팅 업체에 직접 연락해야 했어요.

네, 그 버튼을 클릭하는 것에 대해 뭔가 문제가 있는 것 같아요.

문제의 원인을 정확히 파악했습니다! 저희가 사용하는 매니지드 Discourse 지원팀에 문의했고, 해당 팀에서는 이전에 WAF의 차단 목록에 추가했던 IP 주소를 알려주었습니다. 그 IP 주소에서 유입된 트래픽량이 많아서 차단 목록에 추가했던 것이었습니다. 알고 보니 Discourse가 정상적으로 통신하려면 해당 IP 주소를 허용해야 했습니다. Discourse 측의 문제가 아니어서 정말 다행입니다!

네, 그 정도면 제가 겪었던 문제랑 비슷해 보이네요. 해결되셨다니 다행입니다 :slight_smile:

저도 같은 문제를 겪고 있는 것 같습니다. 브라우저 개발자 콘솔에 DOMException 오류가 발생하고 있습니다. 다만, 저는 Cloudflare를 사용하지 않습니다. Discourse iframe을 임베드한 제 블로그는 Netlify에 호스팅되어 있고, Discourse 자체는 Communiteq에 호스팅되어 있습니다.

처음에는 이 변경 사항이 문제를 일으키는 줄 알았습니다:

하지만 지금은 다른 원인일 수도 있다고 생각합니다. 도움이 주시면 감사하겠습니다.

Netlify 서버에서 보안 및/또는 네트워크 설정에 접근할 수 있나요? 최근 경험을 바탕으로, 제 상황이라면 보안 설정을 확인하여 IP 주소가 차단되었는지 살펴볼 것입니다. 또한 Communiteq 지원팀에도 다시 한번 확인해 보겠습니다. Netlify 서버가 Communiteq와 통신하여 Discourse 리소스를 표시하는 데 필요한 스크립트를 성공적으로 실행하는 데 필요한 IP 주소를 확인해 줄 수 있을 수 있습니다.

안녕하세요! 도움을 주시려고 해 주셔서 감사합니다!

Communiteq에 연락을 취했습니다.

Netlify 측에서 제가 할 수 있는 일이 무엇인지 잘 모르겠지만, 조사해 보겠습니다. 다만 문제가 거기에 있을 가능성은 낮다고 생각합니다. 제 이해가 맞다면, 그리고 제가 잘못 이해하고 있다면 알려 주십시오, 기술적으로 요청은 제 사이트 방문자의 브라우저에서 발신되는 것이기 때문입니다. 제가 이 동작 방식을 올바르게 이해하고 있다면, 이것은 사이트 방문자의 브라우저에서 실행되는 클라이언트 측 JavaScript입니다. Discourse는 요청에서 서버의 호스트 이름을 볼 수 있지만, IP 주소는 볼 수 없습니다. 제 블로그 서버는 포럼 서버와 통신하지 않습니다. 어쨌든 정적(static) 블로그 설치입니다. 클라이언트 측 JavaScript가 포함된 HTML일 뿐입니다. 스크립트를 사용하여 블로그 게시물 데이터를 Discourse로 보내고 포럼에서 콘텐츠를 iframe으로 로드합니다.

해당 문제는 최신 Discourse 버그인 것으로 확인되었습니다. Communiteq가 제 포럼 인스턴스에 패치를 적용하고 있습니다. 자세한 내용은 다음 링크에서 확인하세요:

이 문제는 다른 문제입니다.

이 토픽의 문제는 Discourse가 임베디드 사이트가 블로그 게시물 내용을 Discourse에 제공하기를 거부했기 때문에 “전체 게시물 보기” 기능을 사용할 수 없었던 것이었습니다.

@fabsh 님의 토픽의 문제는 Discourse의 (보다 최근의) 보안 패치에 포함된 문제의 결과입니다.

이 문제에 대한 조사가 일부 변경되었으므로 업데이트를 게시합니다. 3.0.4로 업데이트한 이후에도 문제가 지속되고 있으며, 새로 생성된 모든 게시물에서 내장된 Discourse 코드가 표시되는 문제가 발생합니다. 이 업데이트 이전에 생성된 게시물에는 문제가 없으므로 IP 주소 차단으로 인한 문제가 아닙니다.

가장 최근 버전의 Discourse에서 내장 코드로 게시물이 자동 생성되는 로직이 변경된 것으로 보입니다. 이제 새로운 코드는 canonical URL(정규 URL)을 요구합니다. 이전에 링크된 주제를 참고하세요:

그러나 이 변경으로 인해 제 사이트와 같은 사이트에서 내장 기능이 완전히 깨집니다. 이전에는 아래 코드에서 볼 수 있듯이 Drupal의 Node ID를 사용하여 내장 처리를 했습니다:

discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

이 새로운 Discourse 코드는 대신 canonical URL을 사용하도록 요구하며, 이는 누군가가 단순히 게시물 제목을 변경할 경우 중복된 토픽이 생성되는 결과를 초래합니다. Node ID는 변경되지 않기 때문에 Node ID를 사용했던 것입니다.

이 새로운 canonical URL을 선택 사항으로 만들 수 있을까요? 내장 코드를 canonical URL을 사용하도록 변경해 보았지만, 구버전 내장 코드를 사용하여 생성된 모든 게시물에서 로딩 문제가 다시 발생했습니다.

따라서 현재, 프로덕션 사이트에서 새로운 Discourse 코드가 실행되고 있는 상태에서 다음 두 옵션 중 하나에 막혀 있습니다:

  • Drupal에서 새로 생성된 게시물은 "로딩 중…"을 표시하지만 댓글 내장 블록이 절대 로드되지 않으며, Discourse 3.0.4 이전의 구버전 게시물은 정상적으로 로드됩니다.

또는

  • Drupal에서 새로 생성된 게시물은 댓글 내장 블록을 정상적으로 로드하지만, Discourse 3.0.4 이전의 모든 구버전 게시물은 "로딩 중…"을 표시하지만 댓글 내장 블록이 절대 로드되지 않습니다.

이 새로운 기능을 선택 사항으로 만들 방법이 있을까요? 이 두 옵션 중 하나를 선택해야 하는 상황은 저를 다소 패자-패자(lose-lose) 상황에 놓이게 합니다.