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(>
....
