Nenhuma conexão aceita em http / https após instalação limpa no Ubuntu 22.04 LTS

Não foi minha primeira instalação do Discourse, mas consegui ficar travado após três tentativas de fazer uma instalação padrão em uma droplet Digital Ocean (1GB NVMe SSD Premium AMD) usando Ubuntu 22.04 LTS. Segui o guia e forneci um e-mail para o LetsEncrypt, como já fiz muitas vezes antes. Após a instalação do Discourse não aparecer no navegador (seja via registro A ou pelo IP direto da droplet), confirmei que a instalação recusa conexões nas portas HTTP e HTTPS e tenho me dado cabeçadas desde então.

A única coisa estranha que notei durante a instalação foi que o Docker não veio instalado por padrão na droplet da Digital Ocean e o sistema me pediu para instalá-lo após detectar que o clone do repositório do container do Discourse exigia isso. Fora isso, prossegui normalmente e testei tanto o Docker quanto a instalação do Discourse.

Boas notícias — O Discourse executa com sucesso o teste de entrega de e-mail, o que implica que a instalação está lá e em execução, e o Docker parece estar funcionando bem (após executar “docker run -it --rm hello-world”). Também fiz ping no github.com e obtive respostas, então não parece ser um problema de firewall ou conectividade.

Problema: conexões recusadas
No entanto, executar “curl -v localhost:8080” retorna:

*   Trying 127.0.0.1:8080...
* connect to 127.0.0.1 port 8080 failed: Connection refused
*   Trying ::1:8080...
* connect to ::1 port 8080 failed: Connection refused
* Failed to connect to localhost port 8080 after 1 ms: Connection refused
* Closing connection 0

Já “curl -v localhost” retorna:

*   Trying 127.0.0.1:80...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.81.0
> Accept: */*
>
* Empty reply from server
* Closing connection 0
curl: (52) Empty reply from server

Aqui está meu app.yml e os resultados da execução do discourse-doctor:

app.yml
 ## Quantas requisições web simultâneas são suportadas? Depende de memória e núcleos de CPU.
  ## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode sobrescrever
  UNICORN_WORKERS: 2

  ## TODO: O nome de domínio ao qual esta instância do Discourse responderá
  ## Obrigatório. O Discourse não funcionará com um número IP puro.
  DISCOURSE_HOSTNAME: community.example.io

  ## Descomente se quiser que o container seja iniciado com o mesmo
  ## hostname (-h option) especificado acima (padrão "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de e-mails separados por vírgula que serão definidos como admin e developer
  ## no cadastro inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'example@example.com'

  ## TODO: O servidor SMTP usado para validar novas contas e enviar notificações
  # ENDEREÇO SMTP, nome de usuário e senha são obrigatórios
  # AVISO: o caractere '#' na senha SMTP pode causar problemas!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: no-reply@example.io
  DISCOURSE_SMTP_PASSWORD: "XXXXXX"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)
  DISCOURSE_SMTP_DOMAIN: community.example.io
  DISCOURSE_NOTIFICATION_EMAIL: noreply@community.example.io

  ## Se você adicionou o template do Lets Encrypt, descomente abaixo para obter um certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: example@example.com

  ## O endereço do CDN http ou https para esta instância do Discourse (configurado para buscar)
  ## veja https://meta.discourse.org/t/14857 para detalhes
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## A chave de licença do Maxmind para busca de endereço IP
  ## veja https://meta.discourse.org/t/-/137387/23 para detalhes
  DISCOURSE_MAXMIND_LICENSE_KEY: XXXXX

## O container Docker é sem estado; todos os dados são armazenados em /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:

  ## TODO: O nome de domínio ao qual esta instância do Discourse responderá
  ## Obrigatório. O Discourse não funcionará com um número IP puro.
  DISCOURSE_HOSTNAME: community.example.io

  ## Descomente se quiser que o container seja iniciado com o mesmo
  ## hostname (-h option) especificado acima (padrão "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de e-mails separados por vírgula que serão definidos como admin e developer
  ## no cadastro inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'example@example.com'

  ## TODO: O servidor SMTP usado para validar novas contas e enviar notificações
  # ENDEREÇO SMTP, nome de usuário e senha são obrigatórios
  # AVISO: o caractere '#' na senha SMTP pode causar problemas!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: no-reply@example.io
  DISCOURSE_SMTP_PASSWORD: "XXXXXXXX"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)
  DISCOURSE_SMTP_DOMAIN: community.example.io
  DISCOURSE_NOTIFICATION_EMAIL: noreply@community.example.io

  ## Se você adicionou o template do Lets Encrypt, descomente abaixo para obter um certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: example@example.com

  ## O endereço do CDN http ou https para esta instância do Discourse (configurado para buscar)
  ## veja https://meta.discourse.org/t/14857 para detalhes
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## A chave de licença do Maxmind para busca de endereço IP
  ## veja https://meta.discourse.org/t/-/137387/23 para detalhes
  DISCOURSE_MAXMIND_LICENSE_KEY: XXXXXX

## O container Docker é sem estado; todos os dados são armazenados em /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log
resultados do discourse-doctor
Arquivo containers/app.yml encontrado

==================== CONFIGURAÇÕES YML ====================
DISCOURSE_HOSTNAME=community.example.io
SMTP_ADDRESS=smtp.mailgun.org
DEVELOPER_EMAILS=example@example.com
SMTP_PASSWORD=XXXXXXXX
SMTP_PORT=587
SMTP_USER_NAME=no-reply@example.io
LETSENCRYPT_ACCOUNT_EMAIL=example@example.com

==================== INFORMAÇÕES DO DOCKER ====================
VERSAO DO DOCKER: Docker version 20.10.21, build baeda1f

PROCESSOS DO DOCKER (docker ps -a)

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                                                      NAMES
e1d88ff15b5b   local_discourse/app   "/sbin/boot"   18 minutos atrás   Up 18 minutos   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

e1d88ff15b5b   local_discourse/app   "/sbin/boot"   18 minutos atrás   Up 18 minutos   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

Container do Discourse app está em execução


==================== PLUGINS ====================
          - git clone https://github.com/discourse/docker_manager.git

Nenhum plugin não oficial detectado.

Veja https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb para a lista oficial.

========================================
Versão do Discourse em community.example.io: NÃO ENCONTRADA
Versão do Discourse em localhost: NÃO ENCONTRADA


==================== INFORMAÇÕES DE MEMÓRIA ====================
RAM (MB): 1016

               total        used        free      shared  buff/cache   available
Mem:             969         687          61          21         220         110
Swap:           2047         241        1806

==================== VERIFICAÇÃO DE ESPAÇO EM DISCO ====================
---------- Espaço em disco do SO ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G  8.2G   16G  34% /

==================== INFORMAÇÕES DO DISCO ====================
Disco /dev/loop0: 63.22 MiB, 66293760 bytes, 129480 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de I/O (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop1: 102.98 MiB, 107986944 bytes, 210912 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de I/O (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop2: 47.98 MiB, 50315264 bytes, 98272 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de I/O (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/vda: 25 GiB, 26843545600 bytes, 52428800 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de I/O (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de tabela de disco: gpt
Identificador do disco: 728BDF97-580D-4B6F-9462-7E2540D5378B

Device      Start      End  Sectors  Size Type
/dev/vda1  227328 52428766 52201439 24.9G Linux filesystem
/dev/vda14   2048    10239     8192    4M BIOS boot
/dev/vda15  10240   227327   217088  106M EFI System

As entradas da tabela de partições não estão em ordem no disco.


Disco /dev/vdb: 466 KiB, 477184 bytes, 932 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de I/O (mínimo/ótimo): 512 bytes / 512 bytes

==================== FIM DAS INFORMAÇÕES DO DISCO ====================

==================== TESTE DE E-MAIL ====================
Para um teste robusto, obtenha um endereço em http://www.mail-tester.com/
Ou apenas envie uma mensagem de teste para você mesmo.
Endereço de e-mail para o teste de e-mail? ('n' para pular) [example@example.com  ]:
Enviando e-mail para example@example.com  . . .
Testando envio para example@example.com usando smtp.mailgun.org:587, usuário:no-reply@example.io com autenticação simples.
Conexão com o servidor SMTP bem-sucedida.
Enviando para example@example.com. . .
E-mail aceito pelo servidor SMTP.
Message-ID: e3455d15-eb48-48bf-9859-a30f1acc765c@community.example.io

Se você não receber a mensagem, verifique sua pasta de SPAM
ou teste novamente usando um serviço como http://www.mail-tester.com/.

Se a mensagem não for entregue, o problema não é com o Discourse.
Verifique os logs do servidor SMTP para o Message-ID acima para ver por que ela
falhou ao ser entregue.
Substituindo: SMTP_PASSWORD
Substituindo: LETSENCRYPT_ACCOUNT_EMAIL
Substituindo: DEVELOPER_EMAILS
Substituindo: DISCOURSE_DB_PASSWORD
Substituindo: Enviando e-mail para

==================== CONCLUÍDO! ====================

Também executei ./launcher enter app no diretório do Discourse + o comando top para verificar se nginx, redis, postmaster e ruby estão todos em execução. Não vejo o nginx na lista

launcher enter app --> resultados do top
Tasks:  31 total,   1 running,  30 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.3 us,  2.3 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.3 st
MiB Mem :    969.4 total,     72.4 free,    659.0 used,    238.0 buff/cache
MiB Swap:   2048.0 total,   1667.2 free,    380.8 used.    141.1 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   4528 discour+  25   5  951480 289404   3096 S   0.3  29.2   4:21.14 ruby
      1 root      20   0    6772      0      0 S   0.0   0.0   0:00.02 boot
   4428 root      20   0    2340     24      0 S   0.0   0.0   0:01.14 runsvdir
   4429 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4430 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4431 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4432 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4433 root      20   0    2188    280    256 S   0.0   0.0   1:28.21 runsv
   4434 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4435 root      20   0    2336      0      0 S   0.0   0.0   0:00.05 svlogd
   4436 redis     20   0   58072   2900   1624 S   0.0   0.3   3:17.52 redis-server
   4438 root      20   0    2336      0      0 S   0.0   0.0   0:00.00 svlogd
   4439 discour+  20   0   15256   1128    912 S   0.0   0.1   0:25.85 unicorn_launche
   4441 root      20   0    6620    488    384 S   0.0   0.0   0:00.21 cron
   4442 postgres  20   0  213172   5220   4776 S   0.0   0.5   0:02.75 postmaster
   4445 root      20   0  151068    132      0 S   0.0   0.0   0:00.06 rsyslogd
   4458 postgres  20   0  213392  10404   9896 S   0.0   1.0   0:00.78 postmaster
   4459 postgres  20   0  213172   5004   4604 S   0.0   0.5   0:01.50 postmaster
   4460 postgres  20   0  213172   4956   4588 S   0.0   0.5   0:27.50 postmaster
   4461 postgres  20   0  213840   2264   1652 S   0.0   0.2   0:01.98 postmaster
   4462 postgres  20   0   68200    788      0 S   0.0   0.1   0:05.01 postmaster
   4463 postgres  20   0  213724   1164    700 S   0.0   0.1   0:00.05 postmaster
   4464 discour+  20   0  457692 171868   1364 S   0.0  17.3   0:22.71 ruby
   4503 postgres  20   0  220116  11116  10812 S   0.0   1.1   0:01.51 postmaster
   4538 discour+  20   0  768724 169816   1032 S   0.0  17.1   0:08.27 ruby
   4549 discour+  20   0  768724 169948   1220 S   0.0  17.1   0:08.55 ruby
   4580 postgres  20   0  219408  10580  10460 S   0.0   1.1   0:00.13 postmaster
 134464 postgres  20   0  217332  21388  17444 S   0.0   2.2   0:00.24 postmaster
 137350 root      20   0    7036   3468   2972 S   0.0   0.3   0:00.02 bash
 137382 root      20   0   10108   3756   3080 R   0.0   0.4   0:00.08 top
 137609 discour+  20   0   13760   2004   1732 S   0.0   0.2   0:00.00 sleep

Dê uma olhada no error.log dentro de var/discourse/shared/standalone/log/var-log/nginx:

2022/12/12 07:55:26 [emerg] 5040#5040: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
2022/12/12 07:55:27 [emerg] 5042#5042: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
2022/12/12 07:55:28 [emerg] 5044#5044: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
2022/12/12 07:55:29 [emerg] 5046#5046: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
....

Ok, com base no arquivo error.log dentro de var/discourse/shared/standalone/log/var-log/nginx, decidi remover os templates ssl em app.yml:

## Descomente estas duas linhas se desejar adicionar Let's Encrypt (https)
##  - "templates/web.ssl.template.yml"
## - "templates/web.letsencrypt.ssl.template.yml"

Em seguida, executei ./launcher stop app e ./launcher rebuild app, que agora executam com sucesso a compilação do discourse via http e exibem “Congratulations, you installed Discourse!” no navegador.

Um passo à frente, mas não consigo fazer o ssl funcionar. Ainda não expirei meus certificados LE, o DNS parece bom e esta é uma instalação nova com especificações de servidor muito genéricas.

Alguma ideia de por que a instalação não me permite ativar o ssl via Let’s Encrypt?

Minha suposição é que seu DNS está errado, ou esteve errado, e você tentou tantas vezes que foi limitado. As soluções fáceis são esperar uma semana ou escolher um nome de subdomínio diferente.

Como você não compartilha seu nome de host, não podemos ajudar a saber se o DNS está funcionando.

Obrigado pela resposta @pfaffman. O http:// está funcionando bem, mas o SSL falha ao ativar o Let’s Encrypt. Mesmo configurando o LE através de uma instalação limpa, li o tutorial de configuração do LE e não vi menção a modificações de DNS.

O que especificamente preciso do lado do DNS para permitir que o LE/SSL funcione?

Aqui está uma captura de tela da minha configuração de DNS:

(DKIM/SPF foram validados e o e-mail do Discourse está funcionando bem, só para informar)

Novamente, minha suposição é que você tentou muitas vezes solicitar um endereço do Let’s Encrypt e falhou por algum motivo, e agora você não pode tentar novamente por uma semana. Se eu estiver certo, então espere uma semana ou use um nome diferente.

Existe uma maneira de obter o erro deles, mas não me lembro de encontrá-lo no meu telefone.

Entendido. Após a marca de sete dias no início da próxima semana, reativarei o SSL em app.yml + reconstruirei e reportarei.