No se acepta ninguna conexión en http / https después de una instalación limpia en Ubuntu 22.04 LTS

No es mi primera instalación de Discourse, pero he logrado quedarme atascado después de tres intentos de realizar una instalación estándar en un droplet de Digital Ocean (1GB NVMe SSD Premium AMD) usando Ubuntu 22.04 LTS. Seguí la guía y proporcioné un correo electrónico para LetsEncrypt, como he hecho muchas veces antes. Después de que la instalación de Discourse no apareciera en el navegador (ya sea a través del registro A o la IP directa del droplet), confirmé que la instalación rechaza las conexiones en los puertos HTTP y HTTPS, y desde entonces he estado dándole vueltas sin encontrar solución.

Lo único extraño que noté durante la instalación fue que Docker no estaba instalado por defecto en el droplet de Digital Ocean y me pidió que lo instalara después de detectar que el clonado de git del contenedor de Discourse lo requería. Aparte de eso, procedí con normalidad y probé tanto Docker como la instalación de Discourse.

Buenas noticias: Discourse ejecuta correctamente la prueba de entregabilidad del correo electrónico, lo que implica que la instalación está presente y funcionando, y Docker parece estar funcionando bien (después de ejecutar “docker run -it --rm hello-world”). También hice ping a github.com y obtuve respuestas, por lo que no parece ser un problema de firewall o conectividad.

Problema: conexiones rechazadas
Sin embargo, al ejecutar “curl -v localhost:8080” devuelve:

*   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

curl -v localhost devuelve:

*   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

Aquí está mi archivo app.yml y los resultados de ejecutar discourse-doctor:

app.yml
 ## ¿Cuántas solicitudes web simultáneas se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente durante el arranque según los CPUs detectados, o puedes sobrescribirlo
  UNICORN_WORKERS: 2

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Obligatorio. Discourse no funcionará con una dirección IP desnuda.
  DISCOURSE_HOSTNAME: community.example.io

  ## Descomenta si quieres que el contenedor se inicie con el mismo
  ## nombre de host (opción -h) que se especificó arriba (predeterminado "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que serán administradores y desarrolladores
  ## en el registro inicial, ejemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'example@example.com'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # Se requieren la dirección, el nombre de usuario y la contraseña de SMTP
  # ¡ADVERTENCIA: el carácter '#' en la contraseña de SMTP puede 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, predeterminado true)
  DISCOURSE_SMTP_DOMAIN: community.example.io
  DISCOURSE_NOTIFICATION_EMAIL: noreply@community.example.io

  ## Si agregaste la plantilla de Lets Encrypt, descomenta abajo para obtener un certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: example@example.com

  ## La dirección del CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para más detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## La clave de dirección IP de geolocalización de MaxMind para la búsqueda de direcciones IP
  ## consulta https://meta.discourse.org/t/-/137387/23 para más detalles
  DISCOURSE_MAXMIND_LICENSE_KEY: XXXXX

## El contenedor de Docker es sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Obligatorio. Discourse no funcionará con una dirección IP desnuda.
  DISCOURSE_HOSTNAME: community.example.io

  ## Descomenta si quieres que el contenedor se inicie con el mismo
  ## nombre de host (opción -h) que se especificó arriba (predeterminado "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que serán administradores y desarrolladores
  ## en el registro inicial, ejemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'example@example.com'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # Se requieren la dirección, el nombre de usuario y la contraseña de SMTP
  # ¡ADVERTENCIA: el carácter '#' en la contraseña de SMTP puede 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, predeterminado true)
  DISCOURSE_SMTP_DOMAIN: community.example.io
  DISCOURSE_NOTIFICATION_EMAIL: noreply@community.example.io

  ## Si agregaste la plantilla de Lets Encrypt, descomenta abajo para obtener un certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: example@example.com

  ## La dirección del CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para más detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## La clave de dirección IP de geolocalización de MaxMind para la búsqueda de direcciones IP
  ## consulta https://meta.discourse.org/t/-/137387/23 para más detalles
  DISCOURSE_MAXMIND_LICENSE_KEY: XXXXXX

## El contenedor de Docker es sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log
resultados de discourse-doctor
Se encontró containers/app.yml

==================== CONFIGURACIÓN 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

==================== INFORMACIÓN DE DOCKER ====================
VERSIÓN DE DOCKER: Docker version 20.10.21, build baeda1f

PROCESOS DE 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

El contenedor de Discourse app está en ejecución


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

No se detectaron plugins no oficiales.

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

========================================
Versión de Discourse en community.example.io: NO ENCONTRADA
Versión de Discourse en localhost: NO ENCONTRADA


==================== INFORMACIÓN DE MEMORIA ====================
RAM (MB): 1016

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

==================== COMPROBACIÓN DE ESPACIO EN DISCO ====================
---------- Espacio en disco del SO ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G  8.2G   16G  34% /

==================== INFORMACIÓN DE DISCO ====================
Disk /dev/loop0: 63.22 MiB, 66293760 bytes, 129480 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disk /dev/loop1: 102.98 MiB, 107986944 bytes, 210912 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disk /dev/loop2: 47.98 MiB, 50315264 bytes, 98272 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disk /dev/vda: 25 GiB, 26843545600 bytes, 52428800 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
Tipo de etiqueta de disco: gpt
Identificador de disco: 728BDF97-580D-4B6F-9462-7E2540D5378B

Dispositivo      Inicio       Fin   Sectores  Tamaño Tipo
/dev/vda1  227328 52428766 52201439 24.9G Sistema de archivos Linux
/dev/vda14   2048    10239     8192    4M Arranque BIOS
/dev/vda15  10240   227327   217088  106M Sistema EFI

Las entradas de la tabla de particiones no están en orden del disco.


Disk /dev/vdb: 466 KiB, 477184 bytes, 932 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes

==================== FIN DE LA INFORMACIÓN DE DISCO ====================

==================== PRUEBA DE CORREO ====================
Para una prueba robusta, obtén una dirección de http://www.mail-tester.com/
O simplemente envía un mensaje de prueba a ti mismo.
¿Dirección de correo electrónico para la prueba de correo? ('n' para omitir) [example@example.com  ]:
Enviando correo a example@example.com  . . .
Probando el envío a example@example.com usando smtp.mailgun.org:587, nombre de usuario:no-reply@example.io con autenticación simple.
Conexión al servidor SMTP exitosa.
Enviando a example@example.com. . .
Correo aceptado por el servidor SMTP.
Message-ID: e3455d15-eb48-48bf-9859-a30f1acc765c@community.example.io

Si no recibes el mensaje, revisa tu carpeta de SPAM
o vuelve a probar usando un servicio como http://www.mail-tester.com/.

Si el mensaje no se entrega, no es un problema de Discourse.
Revisa los registros del servidor SMTP para el Message-ID anterior para ver por qué
falló la entrega del mensaje.
Reemplazando: SMTP_PASSWORD
Reemplazando: LETSENCRYPT_ACCOUNT_EMAIL
Reemplazando: DEVELOPER_EMAILS
Reemplazando: DISCOURSE_DB_PASSWORD
Reemplazando: Enviando correo a

==================== ¡LISTO! ====================

También ejecuté ./launcher enter app en el directorio de Discourse + el comando top para verificar que nginx, redis, postmaster y ruby estuvieran todos en ejecución. No veo nginx en la lista

launcher enter app --> resultados de 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

Revisé el archivo 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(>
....

De acuerdo, basándome en el archivo error.log dentro de var/discourse/shared/standalone/log/var-log/nginx, decidí editar las plantillas SSL en app.yml:

## Descomenta estas dos líneas si deseas añadir Let's Encrypt (https)
##  - "templates/web.ssl.template.yml"
## - "templates/web.letsencrypt.ssl.template.yml"

Luego ejecuté ./launcher stop app y ./launcher rebuild app, lo que ahora ejecuta con éxito la compilación de Discourse a través de http y muestra “¡felicidades, has instalado Discourse!” en el navegador.

Un paso adelante, pero no parece que pueda hacer que SSL funcione. Aún no he expirado mis certificados LE, el DNS se ve bien y esta es una instalación nueva con especificaciones de servidor muy estándar.

¿Alguna idea de por qué la instalación no me permite habilitar SSL a través de Let’s Encrypt?

Mi suposición es que tu DNS es incorrecto, o lo fue, y lo intentaste tantas veces que te limitaron la velocidad. Las soluciones fáciles son esperar una semana o elegir un nombre de subdominio diferente.

Como no compartes tu nombre de host, no podemos ayudarte a saber si el DNS está funcionando.

Gracias por la respuesta @pfaffman. http:// funciona bien, pero ssl falla al habilitar Let’s Encrypt. Aunque configuré LE a través de una instalación nueva, leí el tutorial de configuración de LE y no vi ninguna mención de modificaciones de DNS.

¿Qué necesito específicamente del lado del DNS para que LE/SSL funcione?

Aquí hay una captura de pantalla de mi configuración de DNS:

(DKIM/SPF se ha validado y el correo de Discourse funciona bien, solo para que lo sepas)

Nuevamente, supongo que intentaste muchas veces solicitar una dirección a Let’s Encrypt y falló por alguna razón, y ahora no puedes volver a intentarlo en una semana. Si tengo razón, entonces espera una semana o usa un nombre diferente.

Hay una manera de obtener el error de ellos, pero no recuerdo cómo encontrarlo en mi teléfono.

Entendido. Después de la marca de siete días a principios de la próxima semana, volveré a habilitar ssl en app.yml + reconstruiré y te informaré.