重建期间错误:registry.yarnpkg.com ESOCKETTIMEDOUT

我正在运行 Discourse 的自托管实例,网址为 https://forum.embeetle.com

昨天,一键式浏览器升级失败,所以我登录到服务器并尝试了 ./launcher rebuild app

这也失败了,并出现以下错误:

I, [2024-08-01T20:46:09.837292 #1]  INFO -- : 
I, [2024-08-01T20:46:09.837631 #1]  INFO -- : 
> cd /var/www/discourse && su discourse -c 'yarn install --frozen-lockfile && yarn cache clean'
warning Resolution field "unset-value@2.0.1" is incompatible with requested version "unset-value@^1.0.0"
error Error: https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz: ESOCKETTIMEDOUT
    at ClientRequest.<anonymous> (/usr/share/yarn/lib/cli.js:142037:19)
    at Object.onceWrapper (node:events:631:28)
    at ClientRequest.emit (node:events:517:28)
    at TLSSocket.emitRequestTimeout (node:_http_client:847:9)
    at Object.onceWrapper (node:events:631:28)
    at TLSSocket.emit (node:events:529:35)
    at Socket._onTimeout (node:net:598:8)
    at listOnTimeout (node:internal/timers:569:17)
    at process.processTimers (node:internal/timers:512:7)

之后,命令似乎挂起(至少 10 分钟没有发生任何事情),所以我将其终止并重试。结果相同。

没有网络问题:从 Docker 容器内 (./launcher enter app),运行 wget https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz 在 0.1 秒内成功返回。

我检查了类似的帖子:Error during the update ESOCKETTIMEDOUT registry.yarnpkg.com - #4 by jericson 那里的建议是通过编辑 /var/discourse/templates/web.template.yml 来增加超时时间。

不幸的是,我的安装中不存在该路径(从 Docker 容器内部看,没有 /var/discourse;有一个 var/www/discourse 文件夹,这是进入应用程序时的默认工作目录,但其中没有 templates 子文件夹;我搜索了 web.template.yml,但到处都找不到它。

鉴于 https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz 的下载速度非常快,我也不太确定增加超时时间是否能解决问题。

我最终恢复了几天前的备份,其中包含一个较旧版本的 Discourse,然后将 discourse/shared 的最新版本复制到其中。这奏效了,论坛又可以正常运行了。

最新主分支版本有什么问题吗?我实际上又尝试运行了 ./launcher rebuild app,它仍然以同样的方式失败,所以我不得不再次从备份中恢复论坛。

1 个赞

我认为问题不在于获取单个软件包,而在于安装所有软件包的总时间。如果内存不足,即使网络速度正常,也可能出现问题。我遇到问题的 E2.Micro 实例只有 1 GB 内存。

就我所知,我刚刚在 4GB Droplet 上更新了 Discourse,没有遇到任何特别的问题。

我使用的是一台拥有 32GB RAM 的 VPS,目前有 24GB 可用;因此内存不应成为问题。

1 个赞

[quote=“Johan Cockx, post:1, topic:319714, username:ygramoel”]
我该怎么做才能让我的论坛重新运行起来?
[/quote]你可以尝试

 ./launcher start app

来让旧容器重新运行起来。
这并不能解决问题,但应该能让你的网站重新运行。你不需要从备份中恢复。

/var/discourse 在容器外面,而不是里面。那个模板是用来构建容器内东西的,所以值得一试。

另外,鉴于你有这么多内存,我建议切换到双容器设置,这样你就可以在不停机的情况下进行引导。

1 个赞

遗憾的是,仅仅运行

./launcher start app

并不能使论坛恢复运行。

无论如何,我进行了进一步的实验。具体来说,我尝试在 Docker 镜像中手动执行失败的 yarn 命令:

./launcher enter app
cd /var/www/discourse
su discourse
yarn install --frozen-lockfile
... 失败并出现相同的超时错误 ...
yarn config set network-timeout 600000 -g
yarn install --frozen-lockfile
... 成功 ...

这证实了增加超时时间可以解决问题。

那么剩下的问题是如何在 ./launcher rebuild app 期间也增加超时时间。

文件 web.template.yml 确实位于 discourse/containers 中,在 Docker 镜像之外。我最初没有找到它,因为我的 Discourse 安装在一个非标准的位置,而不是在 /var/discourse

上面引用的帖子中提到的修复是指第 159 行,但这似乎不再正确,可能是由于更新。然而,在第 188 行附近有这些行:

  - exec:
      cd: $home
      hook: yarn
      cmd:
        - |
          if [ "$version" != "tests-passed" ]; then
            rm -rf app/assets/javascripts/node_modules
          fi
        - su discourse -c 'yarn install --frozen-lockfile && yarn cache clean'

帖子建议插入一个新的部分来设置超时时间,但没有提供如何这样做的具体说明。我对 yaml、pups 和 yarn 或者它们在 Discourse 中的使用方式不太熟悉,所以不想猜测。相反,我尝试对原始部分进行了如下更改:

  - exec:
      cd: $home
      hook: yarn
      cmd:
        - |
          if [ "$version" != "tests-passed" ]; then
            rm -rf app/assets/javascripts/node_modules
          fi
        - su discourse -c 'yarn config set network-timeout 600000 -g && yarn install --frozen-lockfile && yarn cache clean'

现在 ./launcher rebuild app 命令花费的时间非常长(两个多小时!,比以前花费的时间长得多)。好消息是论坛已经恢复在线!太棒了,谢谢你的帮助。

有没有办法通过向 containers/app.yml 添加命令来增加超时时间?这会很方便,因为它会将我所有的自定义设置保存在一个文件中。

使用双容器设置听起来是个好主意;我不知道这是可能的。我想你指的是这个:https://meta.discourse.org/t/move-from-standalone-container-to-separate-web-and-data-containers/29413;我会尝试一下。任何额外的建议都欢迎。

当我在浏览器中更新我的 Discourse 实例时,它也会运行 ./launcher rebuild app 吗?它会暂时使论坛下线吗?到目前为止,我一直认为论坛在大部分过程中都保持在线,但我不确定。这些事情对我来说从来都不清楚,我也从未有时间真正弄清楚。任何答案或指向更多信息的链接都欢迎。

1 个赞