リビルド中にエラー: 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インスタンスには、メモリが1GBしかありません。

参考までに、4GBのDropletでDiscourseを更新しましたが、特に問題は見られませんでした。

VPSで32GBのRAMを使用しており、現在24GBが空いているため、メモリに問題はないはずです。

「いいね!」 1

試してみてください

 ./launcher start app

古いコンテナを再び稼働させるために。
これで問題は解決しませんが、サイトは復旧するはずです。バックアップから復元する必要はないはずです。

/var/discourse はコンテナの外側にあり、内側ではありません。そのテンプレートはコンテナ内のものを構築するためのものなので、試す価値はあります。

また、RAMが十分にあるのであれば、サイトを停止せずにブートストラップできるように、2コンテナ構成に切り替えることをお勧めします。

「いいね!」 1

残念ながら、単に次を実行しても、フォーラムは復旧しません。

./launcher start app

いずれにせよ、さらに実験を行いました。具体的には、失敗した yarn コマンドを Docker イメージ内で手動で実行してみました。

./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 &amp;&amp; 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 &amp;&amp; yarn install --frozen-lockfile &amp;&amp; yarn cache clean'

./launcher rebuild app コマンドは、今では非常に長い時間(2 時間以上!、以前よりもはるかに長いです)がかかります。良いニュースは、フォーラムがオンラインに戻ったことです!素晴らしい、助けてくれてありがとう。

コマンドを containers/app.yml に追加することで、タイムアウトを増やす方法はありますか?すべてのカスタム設定を 1 つのファイルにまとめることができるので、それは便利でしょう。

2 コンテナ セットアップを使用することは素晴らしいアイデアのように思えます。これが可能であることを知りませんでした。おそらく、これを参照しているのでしょう: Move from standalone container to separate web and data containers; 試してみます。追加のアドバイスがあれば歓迎します。

ブラウザから Discourse インスタンスのアップデートを実行すると、./launcher rebuild app も実行されますか?フォーラムは一時的にダウンしますか?これまで、プロセスのほとんどの間フォーラムはオンラインのままであるという印象を持っていましたが、確信はありません。これらのことは私には決して明確ではなく、本当に理解する時間がありませんでした。回答や追加情報へのポインタを歓迎します。

「いいね!」 1