프로덕션 사이트 프론트엔드 중단 -- Ember/Test 오류

새로운 업그레이드 이후 내 디스코urs 인스턴스의 프론트엔드가 완전히 비어 있고 로드되지 않습니다. 이건 좋은 상황이 아니며, 사용자들이 불만을 제기하고 있어 조금 당황스럽습니다. 백엔드는 정상적으로 작동하는 것 같습니다.

오늘 최신 업그레이드 후 디지털 오션 드롭렛에서 컨테이너를 실행하면서 이 문제가 발생했습니다. 런처를 사용하여 앱을 다시 빌드했습니다.

어떤 도움이라도 깊이 감사하겠습니다.

콘솔 오류는 다음과 같습니다:

app.js:31 
Uncaught TypeError: Cannot read properties of undefined (reading 'registerAsyncHelper')    at s.callback (vendor-suffix.js:58:1)
    at s.exports (loader.js:106:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at requireModule (loader.js:27:1)
    at n._prepareInitializer (app.js:24:1)
    at app.js:81:1
    at Array.forEach (<anonymous>)
    at n.start (app.js:73:1)
    at HTMLDocument.<anonymous> (start-app.js:4:1)
    at discourse-boot.js:30:1
    at discourse-boot.js:31:1

모든 HTML은 정상적으로 로드되고 있지만, Ember 앱의 일부가 작동하지 않는 것 같습니다…

에러가 발생하는 코드를 살펴보니, Ember.Application.extend이 어떤 이유로 인해 오류를 던지는 것 같습니다.

  var Discourse = Ember.Application.extend({
    rootElement: "#main",
    customEvents: {
      paste: "paste"
    },
    Resolver: (0, _resolver.buildResolver)("discourse"),
    _prepareInitializer: function _prepareInitializer(moduleName) {
      var themeId = moduleThemeId(moduleName);
      var module = null;

      try {
        module = requirejs(moduleName, null, null, true);

        if (!module) {
          throw new Error(moduleName + " must export an initializer.");
        }
      } catch (error) {
        if (!themeId || (0, _environment.isTesting)()) {
          throw error;
        }

문제의 원인은 이 조건문인 것 같습니다: !themeId || (0, _environment.isTesting)()

으으… 플러그인이었네… 정확히 어떤 플러그인인지는 모르겠지만, 여기저기 살펴본 끝에 그게 문제일 것 같다는 의심을 하게 됐어… cakeday, signatures, data explorer, discourse-video-upload, encryption을 제거했어. 나중에 하나씩 다시 도입해서 문제의 원인을 찾아볼 거야. 하지만 지금은 앱이 다시 정상 작동 중이라 건드리지 않을 거야.

정말 끔찍한 경험이었어. 지금은 좀 죄책감이 느껴져… 앞으로 이런 업그레이드 전에 스테이징 클론 과정을 마련해야 할 것 같아. 교훈을 얻었지. 아니면 적어도 업그레이드 전에 항상 스냅샷을 찍어두면 실패 시 복구가 가능하겠지.

문제는 Discourse encrypt 플러그인입니다. yml 파일에서 해당 플러그인을 가장 마지막 순서로 배치하고, 처음 문제가 발생하기 직전 커밋(서명 검증이 전날에 깨진 상태)을 선택하면 해결할 수 있습니다. 방법은 다음과 같습니다:

  - git clone https://github.com/discourse/docker-manager.git
  ... 그 외 다른 플러그인 ...
  - git clone https://github.com/discourse/discourse-encrypt.git
  - cd discourse-encrypt && git checkout 12639de

보시는 바와 같이, cd와 git checkout 명령이 후속 명령에 영향을 줄 수 있을까 봐(그렇지 않다고 생각하지만) Discourse encrypt 플러그인을 가장 마지막에 배치했습니다.

그리고 네, 해당 커밋 해시는 확실히 정상적으로 작동하는 마지막 버전입니다.

제 사이트는 이제 다시 정상적으로 작동하고 있으며, Discourse Encrypt에도 다시 녹색 체크 표시가 나타났습니다.

@TomSSL 이 문제를 잘 정리해 주셔서 감사합니다

@sam 내일 풀스택 엔지니어 직위에 지원할 생각입니다. 깨진 플러그인을 추격하는 동안, 팀에 합류해서 플러그인 개발도 해볼까 합니다 :slight_smile:

사실 DM을 보내려 했는데, 이 인스턴스에서는 안 되네요.

Current Openings | Discourse - Civilized Discussion 를 확인해 보세요 :slight_smile:

이 설정을 장시간 그대로 두지 마세요. 그러면 인스턴스가 Encrypt 플러그인의 향후 업데이트를 받지 못하게 됩니다. 이는 향후 문제가 발생할 가능성이 매우 높습니다.

서명 검증 문제를 인지하고 있으며, 수정 작업을 진행 중이었습니다 수정 사항을 적용했습니다.

그러나 이 Ember.Test 오류는 예상치 못한 것입니다. @Mycobee 님, 현재 사용 중인 Discourse 버전을 확인해 주실 수 있나요? 업데이트는 어떻게 실행하셨나요? /admin/upgrade UI를 통해 실행하셨나요?

네, 이는 매우 중요하며 제가 언급을 잊었습니다(이 글을 쓸 때 제 시간으로 새벽 4시 가까이 되었고, 마침 모든 것이 다시 작동하기 시작해서 다른 사람들도 같은 문제를 겪고 있는지 확인하려고 이곳을 방문했었습니다). 이것은 모든 것을 다시 작동시키기 위한 임시 조치일 뿐입니다. @david 님, 상기해 주셔서 감사합니다.

오늘 오전 00:00 UTC(10시간 반 전)에 모든 것을 업데이트했을 때 저에게는 그 수정 사항이 작동하지 않았습니다. 서명 검증이 수정되었다는 것을 보고 그때 인스턴스를 업데이트했습니다. 그런 다음 위에서 설명한 임시 조치를 취해야 했습니다. 제가 평소 하던 업데이트 과정에서 어떤 이유로 인해 최신 코드가 반영되지 않은 것이 가능한가요?

여전히 서명 검증 :x: 문제를 겪고 계셨나요? 아니면 Ember.Test 문제에 부딪히셨나요?

또한, 방금 팀과 확인해 본 결과 Ember.Test 문제를 식별했으며, 곧 수정 사항을 내놓을 예정입니다. 준비가 되는 대로 여기에 업데이트하겠습니다.

첫 페이지가 백색으로 표시되어 사이트를 로드하려면 모든 플러그인(안전 모드에서)을 비활성화해야 했습니다. 저는 보통 월요일 9:00 UTC에 정기 업데이트를 수행하며, 이번에는 서명 검증 문제를 해결하기 위한 추가 업데이트였습니다. 그러나… 물론 그 기간 동안 다른 변경 사항들도 꽤 많이 반영되었습니다. 또한 해당 기간 동안 버전이 2.9.0beta3으로 업데이트되었습니다.

이미 보셨을 수도 있지만(아마 누군가는 아직 보지 못했을 수도 있습니다), 현재 실행 중인 버전과 이 메시지가 작성된 시점의 최신 버전 간의 Discourse Encrypt diff를 공유합니다.

또한, 실제로 새벽 4시 가까이까지 걸린 것은 아닙니다. 새벽 2시 조금 전까지만 해도 모든 것이 정상이었지만, 이후에는 무슨 일이 있었는지 사람들에게 알려야 했기 때문입니다(저희 사용자 대부분이 미국에 거주하고 있습니다).

이 문제는 Discourse 코어에서 이 커밋으로 수정되었습니다:

따라서 Discourse를 최신 버전으로 업데이트한 후에는 discourse-encrypt를 최신 버전으로 업데이트해도 안전합니다.

그렇습니다, 이제 업그레이드가 문제없이 진행됩니다.

@david 2.9.0.beta3로 업그레이드했는데, 이로 인해 문제가 발생했습니다.

업그레이드 과정에 관해서, 저는 보통 /admin/upgrade UI를 통해 이 작업을 수행합니다. 이번 경우는 달랐습니다.

저는 업그레이드 UI에서 docker-manager만 업그레이드했습니다. 그 후 다른 일들을 처리해야 했고, 몇 시간 후 업그레이드 과정을 완료하기 위해 /admin/upgrade 경로에 다시 방문했습니다.

그러면 호스트로 이동하여 /var/discourse 디렉터리로 변경하고, git pull을 실행한 후 ./launcher로 앱을 다시 빌드하라는 텍스트 페이지가 나타났습니다. 그래서 그렇게 했는데, 이후로 혼란이 시작되었습니다.

스트레스와 긴장감이 최고조에 달했을 때, 포럼에서 잡히지 않는 TypeError가 플러그인과 관련이 있다는 것을 발견하여, app.yml의 플러그인에서 비필수적인 것들을 모두 제거하고 컨테이너를 다시 빌드했습니다. 그 시점에서 Ember 앱이 다시 작동하기 시작했습니다.