Reiniciei a VM; agora a página `/admin/upgrade` falha ao carregar, requisições JS falham, algumas imagens de avatar retornam 404

Informações de contexto: o site é lot.almost-dead.net, versão 2.8.0.beta4, hospedado no Google Cloud/Compute; segui o guia oficial baseado em Docker para configurá-lo. (Tenho proficiência em tecnologias de front-end para navegadores e compreendo os princípios gerais de hospedagem em nuvem, mas estou familiarizado com AWS e não com o Google.)

Causa preliminar: parei a instância da VM e depois a reiniciei (tentando ajustar as variáveis de ambiente expostas ao Discourse).

Quando a VM voltou e o site ficou no ar, notei que os ativos de JS estavam com tempo esgotado, assim como alguns avatares de usuários. No painel de administração, a área de Saúde da Comunidade não carrega; o spinner continua girando e, nas Ferramentas de Desenvolvedor do Chrome, a aba Rede mostra que as solicitações /message-bus/.../poll estão todas falhando. A página de Atualização (/admin/upgrade) falha quase imediatamente e o Chrome exibe o código de erro ERR_FAILED. Ao navegar pelos tópicos, vejo solicitações POST falhando com ERR_CONNECTION_REFUSED e solicitações GET iniciadas por JS falhando com ERR_FAILED. (Isso é a partir de um navegador com cookies de login configurados para minha conta de administrador.)

Carregar o site a partir de uma nova instância do navegador mostra o erro ERR_CONNECTION_REFUSED do Chrome.

O que tentei:

  • reconstrução no lado do servidor — sudo ./launcher rebuild app parece ter sucesso, mas não há mudança no comportamento do site
    • também tentei comentar os plugins e reconstruir, ainda sem mudança
  • modo seguro — solicitar /safe-mode resulta imediatamente na página de erro ERR_FAILED do Chrome

Alguma sugestão?

Você já tentou

apt-get update
apt-get upgrade

e depois uma reconstrução?

Tentei agora, parece ser o mesmo que antes.

Não, seu site não voltou a funcionar, está completamente fora do ar. Você está vendo parcialmente o cache. Para alguém que nunca visitou seu site, ele não responde de forma alguma. Isso provavelmente é algo no nível de rede/firewall, ou o nginx não está iniciando/crashing.

Certo, isso faz sentido.

Assim que executo sudo ./launcher enter app, parece que o nginx está rodando…

root@adn-prod-app:/var/www/discourse# ps aux | grep nginx
root       548  0.0  0.0   2156    64 ?        Ss   07:04   0:00 runsv nginx
root       558  0.0  0.1  55236  2524 ?        S    07:04   0:00 nginx: master process /usr/sbin/nginx
www-data   567  0.0  0.2  55996  5068 ?        S    07:04   0:00 nginx: worker process
www-data   568  0.0  0.0  55996  1628 ?        S    07:04   0:00 nginx: worker process
www-data   569  0.0  0.0  55792  1680 ?        S    07:04   0:00 nginx: cache manager process
root     23179  0.0  0.0   6140   884 pts/1    S+   21:23   0:00 grep nginx

Não estou familiarizado o suficiente com o Google Cloud para saber o que procurar nas configurações de rede/firewall deles… Notei que a Instância da VM tem as tags “http-server” e “https-server” e que o sistema de firewall deles parece usar essas tags para aplicar as regras integradas “default-allow-http” e “default-allow-https” às instâncias com essas tags. Isso parece correto para mim, e o nslookup mostra que o subdomínio que estou usando está resolvendo para o endereço IP externo listado na interface do Google, no entanto, o mundo exterior ainda não consegue acessar a instância.

Em /var/discourse/shared/standalone/log/rails/production.log, vejo erros relacionados à conexão com o Redis; há como corrigir isso?

Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL) subscribe failed, reconnecting in 1 second. Call stack /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:384:in `rescue in establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:365:in `establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:117:in `block in connect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:330:in `with_reconnect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:116:in `connect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:403:in `ensure_connected'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:255:in `block in process'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:342:in `logging'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:254:in `process'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:148:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.3/lib/mini_profiler/profiling_methods.rb:85 :in `block in profile_method'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis.rb:959:in `block in get'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis.rb:70:in `block in synchronize'
/usr/local/lib/ruby/2.7.0/monitor.rb:202:in `synchronize'
/usr/local/lib/ruby/2.7.0/monitor.rb:202:in `mon_synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis.rb:70:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis.rb:958:in `get'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.6/lib/message_bus/backends/redis.rb:361:in `process_global_backlog'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.6/lib/message_bus/backends/redis.rb:269:in `block in global_subscribe'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.6/lib/message_bus/backends/redis.rb:282:in `global_subscribe'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.6/lib/message_bus.rb:781:in `global_subscribe_thread'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.6/lib/message_bus.rb:729:in `block in new_subscriber_thread'
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
Creating scope :open. Overwriting existing method Poll.open.

Olá,
é um palpite, mas da última vez que vi um erro do Redis, ele estava de alguma forma relacionado (bem, digamos que no mesmo tópico) aos certificados SSL (ausentes?).
Talvez ./launcher logs app possa ajudar?

Ah, há alguns avisos do nginx aqui, seguidos por esta mensagem que parece estar faltando um identificador: Reload error for :

$ sudo ./launcher logs app
run-parts: executando /etc/runit/1.d/00-ensure-links
run-parts: executando /etc/runit/1.d/00-fix-var-logs
run-parts: executando /etc/runit/1.d/01-cleanup-web-pids
run-parts: executando /etc/runit/1.d/anacron
run-parts: executando /etc/runit/1.d/cleanup-pids
Limpeza de arquivos PID obsoletos
run-parts: executando /etc/runit/1.d/copy-env
run-parts: executando /etc/runit/1.d/letsencrypt
[Ter 14 Set 2021 10:44:41 PM UTC] Domínios não alterados.
[Ter 14 Set 2021 10:44:41 PM UTC] Ignorado, Próximo horário de renovação: Ter Out  5 00:05:09 UTC 2021
[Ter 14 Set 2021 10:44:41 PM UTC] Adicione '--force' para forçar a renovação.
[Ter 14 Set 2021 10:44:42 PM UTC] Instalando chave em: /shared/ssl/lot.almost-dead.net.key
[Ter 14 Set 2021 10:44:42 PM UTC] Instalando cadeia completa em: /shared/ssl/lot.almost-dead.net.cer
[Ter 14 Set 2021 10:44:42 PM UTC] Executando comando de recarregamento: sv reload nginx
aviso: nginx: não foi possível abrir supervise/ok: arquivo não existe
[Ter 14 Set 2021 10:44:42 PM UTC] Erro de recarregamento para :
[Ter 14 Set 2021 10:44:42 PM UTC] Domínios não alterados.
[Ter 14 Set 2021 10:44:42 PM UTC] Ignorado, Próximo horário de renovação: Seg Out  4 00:06:04 UTC 2021
[Ter 14 Set 2021 10:44:42 PM UTC] Adicione '--force' para forçar a renovação.
[Ter 14 Set 2021 10:44:43 PM UTC] Instalando chave em: /shared/ssl/lot.almost-dead.net_ecc.key
[Ter 14 Set 2021 10:44:43 PM UTC] Instalando cadeia completa em: /shared/ssl/lot.almost-dead.net_ecc.cer
[Ter 14 Set 2021 10:44:43 PM UTC] Executando comando de recarregamento: sv reload nginx
aviso: nginx: não foi possível abrir supervise/ok: arquivo não existe
[Ter 14 Set 2021 10:44:43 PM UTC] Erro de recarregamento para :
runsvdir iniciado, PID é 546
ok: run: redis: (pid 554) 0s
ok: run: postgres: (pid 560) 0s
chgrp: grupo inválido: 'syslog'
PID do supervisor: 558 PID do unicorn: 579
Desligando
run-parts: executando /etc/runit/3.d/01-nginx
ok: down: nginx: 1s, normalmente up
run-parts: executando /etc/runit/3.d/02-unicorn
(558) saindo
ok: down: unicorn: 0s, normalmente up
run-parts: executando /etc/runit/3.d/10-redis
ok: down: redis: 0s, normalmente up
run-parts: executando /etc/runit/3.d/99-postgres
ok: down: postgres: 0s, normalmente up
ok: down: nginx: 3s, normalmente up
ok: down: postgres: 1s, normalmente up
ok: down: redis: 2s, normalmente up
ok: down: cron: 0s, normalmente up
ok: down: unicorn: 2s, normalmente up
ok: down: rsyslog: 0s, normalmente up
run-parts: executando /etc/runit/1.d/00-ensure-links
run-parts: executando /etc/runit/1.d/00-fix-var-logs
run-parts: executando /etc/runit/1.d/01-cleanup-web-pids
run-parts: executando /etc/runit/1.d/anacron
run-parts: executando /etc/runit/1.d/cleanup-pids
Limpeza de arquivos PID obsoletos
run-parts: executando /etc/runit/1.d/copy-env
run-parts: executando /etc/runit/1.d/letsencrypt
[Ter 14 Set 2021 10:54:00 PM UTC] Domínios não alterados.
[Ter 14 Set 2021 10:54:00 PM UTC] Ignorado, Próximo horário de renovação: Ter Out  5 00:05:09 UTC 2021
[Ter 14 Set 2021 10:54:00 PM UTC] Adicione '--force' para forçar a renovação.
[Ter 14 Set 2021 10:54:00 PM UTC] Instalando chave em: /shared/ssl/lot.almost-dead.net.key
[Ter 14 Set 2021 10:54:01 PM UTC] Instalando cadeia completa em: /shared/ssl/lot.almost-dead.net.cer
[Ter 14 Set 2021 10:54:01 PM UTC] Executando comando de recarregamento: sv reload nginx
falha: nginx: runsv não está em execução
[Ter 14 Set 2021 10:54:01 PM UTC] Erro de recarregamento para :
[Ter 14 Set 2021 10:54:01 PM UTC] Domínios não alterados.
[Ter 14 Set 2021 10:54:01 PM UTC] Ignorado, Próximo horário de renovação: Seg Out  4 00:06:04 UTC 2021
[Ter 14 Set 2021 10:54:01 PM UTC] Adicione '--force' para forçar a renovação.
[Ter 14 Set 2021 10:54:01 PM UTC] Instalando chave em: /shared/ssl/lot.almost-dead.net_ecc.key
[Ter 14 Set 2021 10:54:01 PM UTC] Instalando cadeia completa em: /shared/ssl/lot.almost-dead.net_ecc.cer
[Ter 14 Set 2021 10:54:01 PM UTC] Executando comando de recarregamento: sv reload nginx
falha: nginx: runsv não está em execução
[Ter 14 Set 2021 10:54:01 PM UTC] Erro de recarregamento para :
runsvdir iniciado, PID é 539
ok: run: redis: (pid 549) 0s
ok: run: postgres: (pid 555) 0s
chgrp: grupo inválido: 'syslog'
PID do supervisor: 551 PID do unicorn: 579
$

Não sei o motivo, mas será que eles podem estar faltando?

Eu os vejo dentro do aplicativo…

root@adn-prod-app:/var/www/discourse# ls -l /shared/ssl/
total 24
-rw-r--r-- 1 root root 5950 Sep 14 22:54 lot.almost-dead.net.cer
-rw-r--r-- 1 root root 5329 Sep 14 22:54 lot.almost-dead.net_ecc.cer
-rw------- 1 root root  302 Sep 14 22:54 lot.almost-dead.net_ecc.key
-rw------- 1 root root 3243 Sep 14 22:54 lot.almost-dead.net.key

:facepalm: Parece que meu problema era que a VM voltou com um endereço IP diferente, e eu precisava modificar meu registro A para apontar para o novo endereço.

O site voltou ao ar, obrigado por ouvir!