Discourse no sirve páginas

Tengo algunos problemas al ejecutar Discourse después de la instalación.

Según la siguiente página, una vez que he ejecutado el script discourse-setup, debería poder navegar a la URL configurada. Al parecer, también debo ejecutar lo siguiente:
./launcher start app

No estoy seguro de si es un error en la documentación o si estoy haciendo algo mal. También noto que, después de ejecutar el comando anterior, tengo las siguientes observaciones:

  1. Puedo cargar una página web al navegar a la URL configurada.
  2. Se carga la página ‘Welcome to Nginx’ en lugar de la página ‘Congratulations, you installed Discourse!’.
  3. Después de un breve periodo (por ejemplo, medio minuto), la página ‘Welcome to Nginx’ deja de cargarse.
  4. Ejecuto ./launcher stop app seguido de ./launcher start app, y noto que puedo cargar la página ‘Welcome to Nginx’, pero nuevamente deja de cargarse después de un breve periodo.

Esto está instalado en una nueva máquina virtual dedicada sin Nginx ejecutándose en la máquina, por lo que la página ‘Welcome to Nginx’ proviene del contenedor que ejecuta Discourse.

Ninguna de esas cosas es esperada. ¿Suena como si tuvieras otro nginx ejecutándose, quizás? ¿Hay algo más ejecutándose en la VM?

1 me gusta

No es posible porque es una instalación mínima de CentOS. Lo verifiqué ejecutando el siguiente comando y no hay nada escuchando en los puertos 80 o 443 sin el contenedor en ejecución.
lsof -i TCP

1 me gusta

Mi mejor suposición es que hay algún problema con CentOS y discourse-setup. Lo más sencillo sería probar con Ubuntu. De lo contrario, tendrás que prestar atención a lo que hace el script y tratar de depurar el problema.

Si has seguido la siguiente guía de instalación, recomendada por alguien que no debe ser mencionado :smiley:

No deberías tener ningún problema.

https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md

1 me gusta

Suspiro. En realidad lo intenté, pero encontré que tanto el instalador de la 19 como el de la 20 LTS se cerraban a mitad de proceso. Ambos indicaban que no podían autoconfigurar la interfaz. Si la dejo desactivada, el instalador funciona bien, pero si configuro la IP manualmente, se cierran.

Si desactivo la interfaz para poder continuar con la instalación, no puedo instalar las herramientas de red para obtener ifconfig, incluso si monto la ISO y la uso como fuente. Así que estoy un poco atascado.

Hola @titus

¿Qué ves cuando ejecutas:

docker ps

?

¿Estás diciendo que el instalador de Ubuntu no funciona?

¿O estás intentando usar Discourse con un número de IP en lugar de un nombre de dominio?

1 me gusta

No estoy utilizando una dirección IP para la instalación de Discourse. Estoy usando un nombre de dominio válido que es resoluble en DNS público.

Lo que quiero decir es que el instalador de Ubuntu siempre se bloquea cada vez que intento ejecutarlo arrancando desde la imagen ISO de Ubuntu durante la creación de la máquina. Esto ocurre tanto con Ubuntu Server 19.10 como con 20.04 LTS, y en ambos casos el instalador reporta que no puede configurar la interfaz de red. Si lo dejo tal cual, la instalación se completa correctamente, pero no tengo forma de activar la interfaz para hacer nada. Sí logré ejecutar con éxito lo siguiente:
ip address add <ip>/<mascara> dev <interfaz>

Pero luego no puedo activarla ejecutando lo siguiente:
ifup <interfaz>

Luego monté la ISO como un dispositivo de bucle y la configuré como repositorio, e intenté ejecutar lo siguiente, pero dice que no se encuentra en la ISO:
apt install net-tools

Si intento configurar la interfaz manualmente con los detalles de red durante la instalación, ambas versiones se bloquean.

Para que conste, esto lo estoy haciendo en ESXi 7.0 y estoy usando las siguientes ISOs:
ubuntu-20.04-live-server-amd64.iso
ubuntu-19.10-live-server-amd64.iso

Esto mostraría que el contenedor de Discourse está en ejecución. Cada vez que hago lo siguiente:

  1. ./launcher start app
  2. Verifico en el navegador y veo la página ‘Welcome to Nginx’, pero luego desaparece después de unos treinta segundos.
  3. Ejecuto docker ps para confirmar que el contenedor de Discourse está en ejecución.
  4. Ejecuto ./launcher stop app y luego ./launcher start app.
  5. Verifico en el navegador y veo la página ‘Welcome to Nginx’, pero luego desaparece después de unos treinta segundos.
  6. Ejecuto docker ps para confirmar que el contenedor de Discourse está en ejecución.

También noto que cuando ejecuto los siguientes comandos, no puedo ver que Nginx esté en ejecución, pero podría ser porque ya se haya detenido para el momento en que los ejecuto.
./launcher enter app
systemctl status nginx

@titusc

¿Has intentado reconstruir la aplicación?

/var/discourse/launcher rebuild app

Normalmente, dependiendo de cuándo se inicie completamente tu contenedor, puede tomar tiempo (según las especificaciones de tu sistema) hasta que esté totalmente operativo.

Incluso en nuestra máquina Linux de 64 GB con 8 núcleos de CPU, esperamos alrededor de un minuto completo antes de cambiar al nuevo contenedor.

1 me gusta

¿Probaste la 18.04?

Parece ser un problema ambiental, aunque no podemos ofrecer soporte para hipervisores ni distribuciones de Linux aquí. Una de las razones por las que se recomienda DigitalOcean es la consistencia del sistema operativo que se instala encima. Si quieres crear una máquina virtual desde cero, tendrás que resolver eso con antelación.

Una vez que tengas un sistema operativo funcional, podemos ayudarte a instalar la parte de Discourse.

Hola @DBHacker, sí, hice lo siguiente en secuencia:
./launcher rebuild app
./launcher start app

Esto es después de darme cuenta de que lo siguiente solo llega hasta la parte de reconstrucción del launcher:
./discourse-setup

@Stephen, sí, necesito resolver primero los problemas con la instalación de Ubuntu. Para ser honesto, no soy muy fanático de Ubuntu y he estado usando CentOS / RH durante los últimos 15 años. Lo que sí me gustaría preguntar es: ¿esperan algo específico que debamos configurar para CentOS / RH?

El script discourse-setup se ha probado y validado en Ubuntu.

Es posible que tengas que realizar algunos o todos los pasos manualmente en otra distribución. Echa un vistazo al contenido del archivo para hacerte una idea de lo que hace.

Hola @titusc

Lo siento por los problemas que estás teniendo.

Por si acaso, no necesitas ejecutar:

./launcher start app

después de ejecutar:

./launcher rebuild app

porque cuando reconstruyes la aplicación con el script del lanzador (ver abajo), ese script reinicia el contenedor antes de salir.

Aquí tienes una parte relevante del código del lanzador:

  rebuild)
      if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
        echo "Asegurando que el lanzador esté actualizado"

        git remote update

        LOCAL=$(git rev-parse HEAD)
        REMOTE=$(git rev-parse @{u})
        BASE=$(git merge-base HEAD @{u})

        if [ $LOCAL = $REMOTE ]; then
          echo "El lanzador está actualizado"

        elif [ $LOCAL = $BASE ]; then
          echo "Actualizando el lanzador..."
          git pull || (echo 'falló la actualización' && exit 1)

          echo "Lanzador actualizado, reiniciando..."
          exec "$0" "${SAVED_ARGV[@]}"

        elif [ $REMOTE = $BASE ]; then
          echo "Tu versión del lanzador está por delante de origin"

        else
          echo "El lanzador tiene fuentes divergentes; esto solo se espera en modo Dev"
        fi

      fi

      set_existing_container

      if [ ! -z $existing ]
        then
          echo "Deteniendo el contenedor antiguo"
          (
            set -x
            $docker_path stop -t 60 $config
          )
      fi

      run_bootstrap

      if [ ! -z $existing ]
        then
          echo "Eliminando el contenedor antiguo"
          (
            set -x
            $docker_path rm $config
          )
      fi

      run_start
      exit 0
      ;;

Puedes ver en el script que el método rebuild intenta iniciar el contenedor antes de salir.

Espero que esto te ayude.

@neounix tienes razón. Voy a volver a probarlo y verificarlo. Ojalá eso haya sido la causa. No estoy seguro de cuál es el comportamiento si inicia el contenedor y luego lo vuelvo a iniciar ejecutando ./launcher start app.

Estimado @titusc,

Disculpa no responder con más detalle, pero tengo que irme en un largo viaje por carretera.

Muchas personas que cometen errores al construir, reconstruir imágenes y contenedores de Docker suelen tener problemas.

Podrías considerar limpiar (podar) tus imágenes de Docker “acumuladas” y los contenedores no utilizados en algún momento.

Por ejemplo (de memoria, rápidamente):

docker ps -a
docker images
docker system prune -a

Deberías detener todos los contenedores “huérfanos”, eliminarlos y borrar todas las imágenes antiguas de Docker.

Tengo que irme…

Espero que esto te ayude (HTH).

1 me gusta

@neounix coincido en revisar las imágenes de Docker. De hecho, ya lo hice, pero permíteme mostrártelo con más detalle. Como puedes ver a continuación, Discourse se compiló correctamente y comenzó a ejecutarse en un contenedor Docker. Hacia el final, puedes ver que Nginx se ejecutaba en el contenedor, pero se detuvo después de solo unos 5 segundos.

Antes de que comience todo

[root@uat discourse]# pwd
/var/discourse
[root@uat discourse]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@uat discourse]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@uat discourse]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
discourse/base      2.0.20200724-1815   6ba1506bf822        9 días atrás          2.38GB
centos              latest              831691599b88        6 semanas atrás         215MB
alpine              latest              a24bb4013296        2 meses atrás        5.57MB

Confirmar que no hay servidor HTTP ejecutándose en el host

[root@uat discourse]# systemctl status nginx
Unit nginx.service could not be found.
[root@uat discourse]# lsof -i TCP
COMMAND  PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd    1    root  181u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
systemd    1    root  183u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1070     rpc    4u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1070     rpc    6u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
sshd    1234    root    5u  IPv4   26444      0t0  TCP *:ssh (LISTEN)
sshd    1234    root    7u  IPv6   26446      0t0  TCP *:ssh (LISTEN)
cupsd   1240    root    9u  IPv6   27746      0t0  TCP localhost:ipp (LISTEN)
cupsd   1240    root   10u  IPv4   27747      0t0  TCP localhost:ipp (LISTEN)
dnsmasq 2094 dnsmasq    6u  IPv4   37419      0t0  TCP uat:domain (LISTEN)
sshd    7102    root    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
sshd    7156    tech    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)

Reconstruir Discourse

[root@uat discourse]# ./launcher rebuild app
Asegurando que el lanzador esté actualizado
Obteniendo origen
El lanzador está actualizado
cd /pups && git pull && /pups/bin/pups --stdin
Ya está actualizado.
......................................................................
I, [2020-08-03T06:54:22.114365 #1]  INFO -- : > echo "Inicio de comandos personalizados"
I, [2020-08-03T06:54:22.116739 #1]  INFO -- : Inicio de comandos personalizados

I, [2020-08-03T06:54:22.116996 #1]  INFO -- : > echo "Fin de comandos personalizados"
I, [2020-08-03T06:54:22.119862 #1]  INFO -- : Fin de comandos personalizados

I, [2020-08-03T06:54:22.119983 #1]  INFO -- : Terminando procesos asíncronos
I, [2020-08-03T06:54:22.120021 #1]  INFO -- : Enviando INT a HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/12/bin/postmaster -D /etc/postgresql/12/main pid: 49
I, [2020-08-03T06:54:22.120086 #1]  INFO -- : Enviando TERM a exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 166
166:signal-handler (1596437662) Received SIGTERM scheduling shutdown...
2020-08-03 06:54:22.120 UTC [49] LOG:  received fast shutdown request
2020-08-03 06:54:22.121 UTC [49] LOG:  aborting any active transactions
2020-08-03 06:54:22.128 UTC [49] LOG:  background worker "logical replication launcher" (PID 58) exited with exit code 1
2020-08-03 06:54:22.128 UTC [53] LOG:  shutting down
2020-08-03 06:54:22.154 UTC [49] LOG:  database system is shut down
166:M 03 Aug 2020 06:54:22.176 # User requested shutdown...
166:M 03 Aug 2020 06:54:22.176 * Saving the final RDB snapshot before exiting.
166:M 03 Aug 2020 06:54:22.184 * DB saved on disk
166:M 03 Aug 2020 06:54:22.184 # Redis is now ready to exit, bye bye...
sha256:7b8e9281c49ba3dc37e0743a765cddc13ab73aae5486bd30722c696c2e1443b1
ce327c6e37246e63331f03b07d64f4882efa68e88cb1516c6343a9dddbbd59df

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e DISCOURSE_HOSTNAME=uat.xxxxxx.com -e DISCOURSE_DEVELOPER_EMAILS=support@xxxxxx.com -e DISCOURSE_SMTP_ADDRESS=smtp-relay.xxxxxx.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=support@xxxxxx.com -e DISCOURSE_SMTP_PASSWORD=support@xxxxxx.com -e LETSENCRYPT_ACCOUNT_EMAIL=me@example.com -h uat-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:fe:39:ba:65:e1 local_discourse/app /sbin/boot
44c604ccbda4bfb4d48722e1cbbf70e3b067531acda41175f6bdaaa013cc6d18

Confirmar que la imagen se construyó y que Docker está ejecutándose

[root@uat discourse]# docker container ls -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                      NAMES
44c604ccbda4        local_discourse/app   "/sbin/boot"        7 minutos atrás       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app
[root@uat discourse]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                      NAMES
44c604ccbda4        local_discourse/app   "/sbin/boot"        7 minutos atrás       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app
[root@uat discourse]# docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              7b8e9281c49b        8 minutos atrás       2.66GB
discourse/base        2.0.20200724-1815   6ba1506bf822        9 días atrás          2.38GB
centos                latest              831691599b88        6 semanas atrás         215MB
alpine                latest              a24bb4013296        2 meses atrás        5.57MB

Confirmar que nada sigue ejecutándose en el host y que Docker está escuchando en los puertos 80 y 443

[root@uat discourse]# systemctl status nginx
Unit nginx.service could not be found.
[root@uat discourse]#
[root@uat discourse]# lsof -i TCP
COMMAND     PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd       1    root  181u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
systemd       1    root  183u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
rpcbind    1070     rpc    4u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
rpcbind    1070     rpc    6u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
sshd       1234    root    5u  IPv4   26444      0t0  TCP *:ssh (LISTEN)
sshd       1234    root    7u  IPv6   26446      0t0  TCP *:ssh (LISTEN)
cupsd      1240    root    9u  IPv6   27746      0t0  TCP localhost:ipp (LISTEN)
cupsd      1240    root   10u  IPv4   27747      0t0  TCP localhost:ipp (LISTEN)
dnsmasq    2094 dnsmasq    6u  IPv4   37419      0t0  TCP uat:domain (LISTEN)
sshd       7102    root    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
sshd       7156    tech    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
docker-pr 12991    root    4u  IPv6 2242261      0t0  TCP *:https (LISTEN)
docker-pr 13003    root    4u  IPv6 2242288      0t0  TCP *:http (LISTEN)

Reiniciar Docker y verificar Nginx después de que Nginx se haya detenido

[root@uat discourse]# ./launcher stop app
+ /usr/bin/docker stop -t 10 app
app
[root@uat discourse]# ./launcher start app; ./launcher enter app

iniciando contenedor existente
+ /usr/bin/docker start app
app
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:47 AM UTC
root        34     1  0 07:29 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
www-data    36    34  0 07:29 ?        00:00:00 nginx: worker process
www-data    37    34  0 07:29 ?        00:00:00 nginx: worker process
root      1091   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:50 AM UTC
root        34     1  0 07:29 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
www-data    36    34  0 07:29 ?        00:00:00 nginx: worker process
www-data    37    34  0 07:29 ?        00:00:00 nginx: worker process
root      1854   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:52 AM UTC
root      2043  2038  0 07:29 ?        00:00:00 runsv nginx
root      2080   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse#
1 me gusta

Hola @titusc

Gracias por el excelente artículo y la información exhaustiva de resolución de problemas. Muy bien hecho.

¿Has revisado los archivos de registro de nginx en la aplicación para buscar pistas?

Algo está roto en tu configuración. Mi suposición es que lo que está fallando e impide la instalación de Ubuntu también está interfiriendo con CentOS.

Necesitas solucionar eso antes de instalar Discourse (o probablemente, cualquier otra cosa).