生产网站前端出现故障 -- Ember/Test 错误

我的 discourse 实例前端在升级后完全空白且无法加载。这不是个好兆头,我有点恐慌,因为用户们很不满意。后端似乎还在运行。

这发生在今天最新的升级之后,在一个运行容器的 Digital Ocean droplet 上。我使用了 launcher 来重建应用程序。

任何帮助都将深表感谢。

控制台错误显示:

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
3 个赞

所有的 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)()

1 个赞

哎……原来是个插件……不确定是哪个,但在一番摸索后,我怀疑可能是个问题……移除了 cakeday、signatures、data explorer、discourse-video-upload 和 encryption。稍后我会逐个引入它们,看看能否找出罪魁祸首。但目前,应用程序已恢复运行,我不会再碰它了。

糟糕的体验。现在感觉很内疚……将来升级时可能应该有一个暂存克隆过程。吸取教训了。或者至少我会在升级前始终进行快照,以便在失败时进行恢复。

3 个赞

问题是 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

如您所见,我将 Discourse encrypt 插件放在最后,以防 cdgit checkout 命令会影响后续命令(我认为它们不会)。

是的,这是最后一个绝对可以正常工作的版本的提交哈希。

我的网站现在又正常工作了。Discourse Encrypt 再次显示绿色的勾号。

6 个赞

@TomSSL 感谢您对这个问题的详细分析。

@sam 我明天会提交全栈工程师职位的申请。我想,既然我在追赶那些有问题的插件,不如加入团队,直接处理插件问题 :slight_smile:

我本来想直接给你发私信,但这个实例不允许。

3 个赞

请看 Current Openings | Discourse - Civilized Discussion :slight_smile:

1 个赞

请不要长时间保留此配置——您的实例将无法接收 Encrypt 插件的未来更新。这很可能会在未来导致问题。

我们已注意到签名验证问题,并正在修复中 并且已推送修复程序

但是,这个 Ember.Test 错误是出乎意料的。@Mycobee 您能确认您正在运行哪个版本的 Discourse 吗?您是如何运行更新的?是通过 /admin/upgrade UI 吗?

4 个赞

是的,这至关重要,我忘了提(当时我写这个的时候已经是凌晨 4 点了,我刚把事情弄好,想进来看看是否有人遇到同样的问题)。这只是一个临时的修复方法,用来让事情重新运行起来。 谢谢提醒 @david

我在今天凌晨 00:00 UTC(十个半小时前)更新所有内容时,这个修复程序对我不起作用。我当时只更新了我的实例,因为我看到签名验证已经修复了。然后我不得不进行上述的临时修复。我的常规更新有没有可能因为某种原因没有获取到最新的代码?

2 个赞

[quote=“TomSSL, post:8, topic:221704”]
我今天早上 00:00 UTC 更新了所有内容,但这个修复对我不起作用
[/quote]你仍然看到签名验证 :x: 问题?还是遇到了 Ember.Test 问题?

另外,我刚和团队确认过,我们似乎已经找到了 Ember.Test 问题的原因,并且很快就会有修复。一旦可用,我们会在此处更新。

2 个赞

我遇到了一个空白首页的问题,不得不禁用所有插件(在安全模式下)才能让网站加载。我通常在周一的UTC时间9:00左右进行每周更新,这次是额外的更新来修复签名验证问题。不过……当然,也一并处理了很多其他更改。在此期间,版本也已更新到 2.9.0beta3

正如你可能已经看到(但也许有些人还没看到),这是 Discourse Encrypt 的 diff,对比了我现在运行的版本和截至此消息的最新版本。

另外,实际上花了将近凌晨4点才修复好。在凌晨2点前不久一切都还好,但我之后不得不告诉人们发生了什么(我们的大多数用户在美国)。

2 个赞

此问题应通过 Discourse core 中的此提交得到修复:

因此,一旦您将 Discourse 更新到最新版本,就可以安全地将 discourse-encrypt 更新到最新版本。

5 个赞

这确实奏效了,升级现在没有问题了。

3 个赞

@david 我升级到了 2.9.0.beta3,这导致了问题。

关于升级过程,我通常通过 /admin/upgrade UI 进行。这次情况不同。

我只通过升级 UI 升级了 docker-manager。之后,我不得不处理其他事情,几个小时后才访问 /admin/upgrade 路径来完成升级过程。

我看到一个文本页面,告诉我需要去主机,切换到 /var/discourse 目录,git pull 并使用 ./launcher 重建应用程序……所以我照做了,然后混乱就开始了。

虽然压力很大,但我在这个论坛上发现有关未捕获的 TypeError 与插件有关的信息,所以我从 app.yml 插件中删除了所有非必需的插件,并重建了容器。这时,ember 应用又开始工作了。

1 个赞

此主题已在 2 天后自动关闭。不再允许回复。