Erro durante a reconstrução: registry.yarnpkg.com ESOCKETTIMEDOUT

Estou executando uma instância auto-hospedada do Discourse em https://forum.embeetle.com.

Ontem, a atualização de um clique do navegador falhou, então fiz login no servidor e tentei ./launcher rebuild app.

Isso também falhou, com o seguinte erro:

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)

Depois disso, o comando parece travar (nada acontece por pelo menos 10 minutos), então eu o interrompi e tentei novamente. Mesmo resultado.

Não há problema de rede: de dentro do contêiner docker (./launcher enter app), executar wget https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz retorna com sucesso em menos de 0,1 segundos.

Verifiquei este problema semelhante: Error during the update ESOCKETTIMEDOUT registry.yarnpkg.com - #4 by jericson A sugestão lá é aumentar o tempo limite editando /var/discourse/templates/web.template.yml.

Infelizmente, esse caminho não existe na minha instalação (de dentro do contêiner docker, não há /var/discourse; há uma pasta var/www/discourse que é o diretório de trabalho padrão ao entrar no aplicativo, mas que não tem uma subpasta templates; procurei por web.template.yml, mas não consegui encontrá-la em lugar nenhum.

Também não estou muito confiante de que aumentar o tempo limite resolveria o problema, dada a rápida download de https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz.

Acabei restaurando um backup de alguns dias atrás, com uma versão mais antiga do discourse, e copiando a versão mais recente de discourse/shared para ele. Isso funciona, então o fórum está funcionando novamente.

Há algo errado com a versão mais recente no branch principal? Na verdade, tentei executar ./launcher rebuild app novamente, e ele falha novamente da mesma maneira, então tive que restaurar o fórum do backup novamente.

1 curtida

Acredito que o problema não seja obter os pacotes individuais, mas o tempo total que leva para instalá-los. Se você não tiver memória suficiente, pode ter o problema mesmo que a velocidade da sua rede esteja boa. A instância E2.Micro com a qual tive o problema tem apenas 1 GB de memória.

Para que valha a pena, acabei de atualizar o Discourse em um Droplet de 4 GB e não vi nenhum problema em particular.

Estou usando um VPS com 32 GB de RAM, atualmente 24 GB livres; portanto, a memória não deve ser um problema.

1 curtida

Você pode tentar

 ./launcher start app

para colocar o contêiner antigo em funcionamento novamente.
Isso não resolve o problema, mas deve colocar seu site no ar novamente. Você não deve precisar restaurar a partir de um backup.

/var/discourse fica fora do contêiner, não dentro. Esse modelo é o que constrói as coisas dentro do contêiner, então vale a pena tentar.

Além disso, com tanta RAM quanto você tem, eu mudaria para uma configuração de 2 contêineres para que você possa inicializar sem tirar seu site do ar.

1 curtida

Infelizmente, simplesmente executar

./launcher start app

não traz o fórum de volta.

De qualquer forma, fiz mais experimentos. Especificamente, tentei executar manualmente o comando yarn com falha na imagem do docker:

./launcher enter app
cd /var/www/discourse
su discourse
yarn install --frozen-lockfile
... falha com o mesmo timeout ...
yarn config set network-timeout 600000 -g
yarn install --frozen-lockfile
... succeeds ...

Isso confirma que aumentar o timeout resolve o problema.

A questão restante, então, é como aumentar o timeout também durante ./launcher rebuild app.

O arquivo web.template.yml está de fato localizado em discourse/containers fora da imagem do docker. Eu não o encontrei inicialmente, porque minha instalação do Discourse está em um local não padrão, não em /var/discourse.

A correção mencionada na postagem referenciada acima se refere à linha 159, mas isso não parece mais correto, provavelmente devido a atualizações. Existem, no entanto, estas linhas por volta da linha 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'

A postagem sugere inserir uma nova seção para definir o timeout, mas não fornece instruções específicas sobre como fazer isso. Não sou muito familiarizado com yaml, pups e yarn ou como eles são usados no Discourse, então não quis adivinhar. Em vez disso, tentei esta alteração na seção original:

  - 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'

O comando ./launcher rebuild app agora leva muito tempo (mais de duas horas!, muito mais tempo do que costumava levar). A boa notícia é que o fórum está de volta online! Ótimo, obrigado pela ajuda.

Existe uma maneira de aumentar o timeout adicionando um comando a containers/app.yml? Isso seria conveniente, pois manteria todas as minhas personalizações juntas em um único arquivo.

Usar uma configuração de 2 contêineres parece uma ótima ideia; eu não estava ciente de que isso era possível. Acho que você está se referindo a isto: Move from standalone container to separate web and data containers; vou tentar. Qualquer conselho adicional é bem-vindo.

Quando executo uma atualização da minha instância do Discourse pelo navegador, ela também executa ./launcher rebuild app? Ela tira o fórum do ar temporariamente? Até agora, eu tinha a impressão de que o fórum permanecia online durante a maior parte do processo, mas não tenho certeza. Essas coisas nunca foram claras para mim e eu nunca tive tempo de realmente descobri-las. Quaisquer respostas ou indicações para mais informações são bem-vindas.

1 curtida