Ошибка при пересборке: 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, и она снова не сработала тем же образом, поэтому мне пришлось снова восстановить форум из резервной копии.

Я считаю, что проблема не в загрузке отдельных пакетов, а во времени, необходимом для установки всех их. Если у вас недостаточно памяти, проблема может возникнуть даже при отличной скорости сети. У экземпляра E2.Micro, с которым у меня возникли проблемы, всего 1 ГБ памяти.

К слову, я только что обновил Discourse на Droplet с 4 ГБ памяти и не заметил никаких особых проблем.

Я использую VPS с 32 ГБ ОЗУ, из которых свободно 24 ГБ, так что с памятью проблем быть не должно.

Вы можете попробовать

 ./launcher start app

чтобы снова запустить старый контейнер.
Это не решит проблему, но должно вернуть ваш сайт в работу. Вам, вероятно, не понадобится восстанавливаться из резервной копии.

/var/discourse находится вне контейнера, а не внутри. Этот шаблон используется для создания содержимого внутри контейнера, поэтому стоит попробовать.

Кроме того, учитывая объем доступной у вас оперативной памяти, я бы рекомендовал перейти на двухконтейнерную конфигурацию, чтобы вы могли выполнить загрузку системы без остановки сайта.

К сожалению, простое выполнение

./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 && 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? Это было бы удобно, так как все мои настройки остались бы в одном файле.

Использование конфигурации с двумя контейнерами звучит как отличная идея; я не знал, что это возможно. Думаю, вы имеете в виду это: Move from standalone container to separate web and data containers; я попробую это реализовать. Любые дополнительные советы будут приняты с благодарностью.

Когда я обновляю свой экземпляр Discourse через браузер, выполняется ли также команда ./launcher rebuild app? При этом форум временно становится недоступным? До сих пор у меня сложилось впечатление, что форум остается онлайн в течение большей части процесса, но я не уверен. Эти моменты никогда не были для меня ясны, и у меня никогда не было времени, чтобы во всем разобраться. Любые ответы или ссылки на дополнительную информацию будут приняты с благодарностью.