502 Mal puerta de enlace - nginx/1.14.0 (Ubuntu): No se puede encontrar la imagen localmente + Error de respuesta del daemon

Recientemente moví mi servidor Dell de una ubicación a otra. Su sistema operativo principal/Gestor de VM es Proxmox VE 5.3. Tengo una VM de Nginx que actúa como proxy inverso para varias otras VMs, una de las cuales es una VM de Discourse.

Después de configurar mi nuevo enrutador, logré que varias de mis VMs se conectaran a Internet (incluso sin necesidad de renovar los certificados SSL). Sin embargo, con Discourse, recibo 502 Bad Gateway - nginx/1.14.0 (Ubuntu) al intentar acceder a Discourse desde un navegador.

He recibido este error antes, pero generalmente uno de los siguientes métodos lo soluciona:

Reiniciar la VM de Discourse

Aún 502 Bad Gateway - nginx/1.14.0 (Ubuntu) en un navegador.

Borrar las cookies del navegador y probar con diferentes navegadores

Solo por si acaso fuera algo de mi lado… no. El mismo 502 Bad Gateway - nginx/1.14.0 (Ubuntu) en varios navegadores.

Limpieza de Discourse y verificación del espacio en disco

Inicialmente, al limpiar, eliminó aproximadamente 4 GB de datos. Me sorprendió mucho. ¿Quizás eso fue lo que causó el problema en primer lugar? De todos modos, ahora cuando intento limpiar Discourse:

> root@forum:/var/discourse# ./launcher cleanup
> ¡ADVERTENCIA! Esto eliminará todos los contenedores detenidos.
> ¿Estás seguro de que quieres continuar? [y/N] y
> Espacio recuperado total: 0B
> ¡ADVERTENCIA! Esto eliminará todas las imágenes sin al menos un contenedor asociado a ellas.
> ¿Estás seguro de que quieres continuar? [y/N] y
> Espacio recuperado total: 0B

También quiero reiterar que no me he quedado sin espacio en disco:

Git Pull

Está actualizado.

> root@forum:/var/discourse# git pull
> Ya está actualizado.

Reiniciar Discourse

Aquí es donde descubrí dos errores que estoy recibiendo:

> root@forum:/var/discourse# ./launcher restart app
>
> ADVERTENCIA: Estamos a punto de comenzar a descargar la imagen base de Discourse
> Este proceso puede tardar desde unos minutos hasta una hora, dependiendo de la velocidad de tu red
>
> Por favor, ten paciencia
>
> No se pudo encontrar la imagen 'discourse/base:2.0.20191013-2320' localmente
> /usr/bin/docker: Respuesta de error del daemon: Obtener https://registry-1.docker.io/v2/: net/http: solicitud cancelada mientras se esperaba la conexión (Client.Timeout superado mientras se esperaban las cabeceras).
> Consulta '/usr/bin/docker run --help'.
> Tu instalación de Docker no funciona correctamente
>
> Ver: `https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam`

Revisé el enlace sugerido. Recomienda hacer un Git Pull y Reconstruir Discourse (verás qué obtengo más abajo). También sugiere ejecutar un comando de Docker “Hello World”. Funciona (aunque parece tener algunos problemas?):

> root@forum:/var/discourse# docker run -it --rm hello-world
> No se pudo encontrar la imagen 'hello-world:latest' localmente
> latest: Descargando desde library/hello-world
> 1b930d010525: Descarga completada
> Resumen: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
> Estado: Imagen actualizada descargada para hello-world:latest
>
> ¡Hola desde Docker!
> Este mensaje indica que tu instalación parece funcionar correctamente.
>
> Para generar este mensaje, Docker realizó los siguientes pasos:
>  1. El cliente de Docker se comunicó con el daemon de Docker.
>  2. El daemon de Docker descargó la imagen "hello-world" desde Docker Hub.
>     (amd64)
>  3. El daemon de Docker creó un nuevo contenedor a partir de esa imagen que ejecuta el
>     ejecutable que produce la salida que estás leyendo actualmente.
>  4. El daemon de Docker transmitió esa salida al cliente de Docker, que la envió
>     a tu terminal.
>
> Para probar algo más ambicioso, puedes ejecutar un contenedor de Ubuntu con:
>  $ docker run -it ubuntu bash
>
> Comparte imágenes, automatiza flujos de trabajo y más con una ID de Docker gratuita:
>  https://hub.docker.com/
>
> Para más ejemplos e ideas, visita:
>  https://docs.docker.com/get-started/
>
> Error al redimensionar la terminal, usando el tamaño predeterminado

Bueno, luego intenté el Ubuntu Bash… y error:

> root@forum:/var/discourse# docker run -it ubuntu bash
> No se pudo encontrar la imagen 'ubuntu:latest' localmente
> docker: Respuesta de error del daemon: Obtener https://registry-1.docker.io/v2/library/ubuntu/manifests/latest: Obtener https://auth.docker.io/token?scope=repository%3Alibrary%2Fubuntu%3Apull&service=registry.docker.io: net/http: solicitud cancelada mientras se esperaba la conexión (Client.Timeout superado mientras se esperaban las cabeceras).
> Consulta 'docker run --help'.

Es hora de pasar a otros métodos que conozco:

Detener e iniciar Discourse

Recibiendo lo mismo que con el Reinicio:

> root@forum:/var/discourse# ./launcher stop app
>
> ADVERTENCIA: Estamos a punto de comenzar a descargar la imagen base de Discourse
> Este proceso puede tardar desde unos minutos hasta una hora, dependiendo de la velocidad de tu red
>
> Por favor, ten paciencia
>
> No se pudo encontrar la imagen 'discourse/base:2.0.20191013-2320' localmente
> /usr/bin/docker: Respuesta de error del daemon: Obtener https://registry-1.docker.io/v2/: net/http: solicitud cancelada mientras se esperaba la conexión (Client.Timeout superado mientras se esperaban las cabeceras).
> Consulta '/usr/bin/docker run --help'.
> Tu instalación de Docker no funciona correctamente
>
> Ver: `https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam`
>
> root@forum:/var/discourse# ./launcher start app
>
> ADVERTENCIA: Estamos a punto de comenzar a descargar la imagen base de Discourse
> Este proceso puede tardar desde unos minutos hasta una hora, dependiendo de la velocidad de tu red
>
> Por favor, ten paciencia
>
> No se pudo encontrar la imagen 'discourse/base:2.0.20191013-2320' localmente
> /usr/bin/docker: Respuesta de error del daemon: Obtener https://registry-1.docker.io/v2/discourse/base/manifests/2.0.20191013-2320: Obtener https://auth.docker.io/token?scope=repository%3Adiscourse%2Fbase%3Apull&service=registry.docker.io: net/http: solicitud cancelada mientras se esperaba la conexión (Client.Timeout superado mientras se esperaban las cabeceras).
> Consulta '/usr/bin/docker run --help'.
> Tu instalación de Docker no funciona correctamente
>
> Ver: `https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam`

Reconstruir Discourse

Y recibiendo los mismos dos errores de nuevo.

> root@forum:/var/discourse# ./launcher rebuild app
>
> ADVERTENCIA: Estamos a punto de comenzar a descargar la imagen base de Discourse
> Este proceso puede tardar desde unos minutos hasta una hora, dependiendo de la velocidad de tu red
>
> Por favor, ten paciencia
>
> No se pudo encontrar la imagen 'discourse/base:2.0.20191013-2320' localmente
> /usr/bin/docker: Respuesta de error del daemon: Obtener https://registry-1.docker.io/v2/: net/http: solicitud cancelada mientras se esperaba la conexión (Client.Timeout superado mientras se esperaban las cabeceras).
> Consulta '/usr/bin/docker run --help'.
> Tu instalación de Docker no funciona correctamente
>
> Ver: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam

Restaurar desde una copia de seguridad anterior

Tengo una instantánea de un momento antes de mover el servidor y realizar la limpieza (que, como se mencionó, eliminó aproximadamente 4 GB de archivos). Intenté todo lo anterior nuevamente… y lo mismo (menos la Limpieza), así como el 502 Bad Gateway - nginx/1.14.0 (Ubuntu) en un navegador. ¿Quizás esto no tiene nada que ver con la limpieza?

En todo mi tiempo con Discourse, nunca he encontrado ninguno de estos errores. ¿Alguna sugerencia sobre qué puedo hacer para resolver estos errores y hacer que Discourse funcione en un navegador?

Tu servidor no puede conectarse a Docker Hub para descargar imágenes grandes; solo tuvo éxito la imagen pequeña ‘hello world’.

Entonces, ¿cómo puedo solucionar esto? No tengo mucha experiencia usando Docker, así que no sé por dónde empezar.

Lo único que sé sobre Docker son los comandos incluidos en la instalación de Discourse (junto con las modificaciones, por supuesto, ya que Discourse está instalado en una máquina virtual en uno de mis servidores, en lugar de en una nube de terceros).

¿Qué versión de Docker estás ejecutando (docker info)?

¿Puedes verificar tu pila de red en busca de problemas al establecer conexiones con https://registry-1.docker.io/v2/?

Aquí está mi información de Docker:

root@forum:/var/discourse# docker info
Contenedores: 1
En ejecución: 1
Pausados: 0
Detenidos: 0
Imágenes: 3
Versión del servidor: 18.09.5
Controlador de almacenamiento: overlay2
Sistema de archivos subyacente: extfs
Soporta d_type: true
Diferencia de superposición nativa: true
Controlador de registro: json-file
Controlador de cgroup: cgroupfs
Complementos:
Volumen: local
Red: bridge host macvlan null overlay
Registro: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactivo
Tiempos de ejecución: runc
Tiempo de ejecución predeterminado: runc
Binario de inicialización: docker-init
Versión de containerd: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
Versión de runc: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
Versión de inicialización: fec3683
Opciones de seguridad:
apparmor
seccomp
Perfil: predeterminado
Versión del kernel: 4.15.0-69-generic
Sistema operativo: Ubuntu 18.04.2 LTS
OSType: linux
Arquitectura: x86_64
CPUs: 2
Memoria total: 6.805GiB
Nombre: forum
ID: 2RRX:ZQIT:R5AK:WNPR:VJ6Z:2EBY:PFOL:W5RD:GL3X:RUQM:YLJ4:2L2X
Directorio raíz de Docker: /var/lib/docker
Modo de depuración (cliente): false
Modo de depuración (servidor): false
Registro: https://index.docker.io/v1/
Etiquetas:
Experimental: false
Registros inseguros:
127.0.0.0/8
Restauración en vivo habilitada: false
Licencia del producto: Community Engine

ADVERTENCIA: No hay soporte para límite de swap

En cuanto a tu pregunta:

¿Cómo hago esto?

@Falco Así que he estado intentando solucionar este problema más a fondo, y ahora estoy aún más confundido. Buenas noticias y malas noticias:

Buenas noticias

Después de realizar varios reconstrucciones de Discourse (./launcher rebuild app), ya no recibo los errores Unable to find image o Error response from daemon! Cuando inicio o reinicio Discourse, no veo errores:

> root@forum:/var/discourse# ./launcher start app
> 
> .+ /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 DISCOURSE_HOSTNAME=discourse.example.com -e DISCOURSE_DEVELOPER_EMAILS=admin@example.com,postmaster@example.com -e DISCOURSE_SMTP_ADDRESS=smtp.sparkpostmail.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=SMTP_Injection -e DISCOURSE_SMTP_PASSWORD=<OCULTANDO-POR-PRIVACIDAD> -e LETSENCRYPT_ACCOUNT_EMAIL=admin@example.com -h forum-app -e DOCKER_HOST_IP=100.17.0.1 --name app -t -p 8080:80 -p 8443:443 -p 2222:22 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:96:f3:e6:e7:14 local_discourse/app /sbin/boot
> cebe89493bc79dab2c1716599629adfe3dc571c8659367e6ffa0d39b0e6d47af
> root@forum:/var/discourse# ./launcher restart app
> .+ /usr/bin/docker stop -t 10 app
> app
> 
> iniciando contenedor existente
> .+ /usr/bin/docker start app
> app

Docker también está en ejecución:
> root@forum:/var/discourse# systemctl status docker.service
> ● docker.service - Motor de contenedores de aplicaciones Docker
>    Cargado: loaded (/lib/systemd/system/docker.service; enabled; configuración predeterminada del proveedor: enabled)
>    Activo: activo (en ejecución) desde el jueves 14 de noviembre de 2019 03:00:54 UTC; hace 17 horas
>      Docs: https://docs.docker.com
>  PID principal: 18721 (dockerd)
>     Tareas: 31
>    CGroup: /system.slice/docker.service
>            ├─ 1375 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8443 -container-ip 172.17.0.2 -container-port 443
>            ├─ 1387 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 80
>            ├─ 1399 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 2222 -container-ip 172.17.0.2 -container-port 22
>            └─18721 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
> 
> Nov 14 20:13:26 forum dockerd[18721]: time="2019-11-14T20:13:26.430856242Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:28 forum dockerd[18721]: time="2019-11-14T20:13:28.597999379Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:30 forum dockerd[18721]: time="2019-11-14T20:13:30.862158413Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:32 forum dockerd[18721]: time="2019-11-14T20:13:32.978285148Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:35 forum dockerd[18721]: time="2019-11-14T20:13:35.105130149Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:37 forum dockerd[18721]: time="2019-11-14T20:13:37.151466214Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:39 forum dockerd[18721]: time="2019-11-14T20:13:39.024948159Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:14:05 forum dockerd[18721]: time="2019-11-14T20:14:05.179759938Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:14:16 forum dockerd[18721]: time="2019-11-14T20:14:16.078334393Z" level=info msg="El contenedor cebe89493bc79dab2c1716599629adfe3dc571c8659367e6ffa0d39b0e6d47af no logró salir dentro de
> Nov 14 20:14:16 forum dockerd[18721]: time="2019-11-14T20:14:16.281731176Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"

Malas noticias

Sigo recibiendo el error 502 Bad Gateway - nginx/1.14.0 (Ubuntu) cuando intento abrir el sitio en varios navegadores. He limpiado sus cachés y probado múltiples navegadores por si acaso. Sin éxito.

Una cosa que he notado es que si intento una limpieza de Discourse, elimina varios contenedores:

> root@forum:/var/discourse# ./launcher cleanup
> ¡ADVERTENCIA! Esto eliminará todos los contenedores detenidos.
> ¿Estás seguro de que quieres continuar? [y/N] y
> Espacio recuperado total: 0B
> ¡ADVERTENCIA! Esto eliminará todas las imágenes sin al menos un contenedor asociado a ellas.
> ¿Estás seguro de que quieres continuar? [y/N] y
> Imágenes eliminadas:
> sin etiqueta: hello-world:latest
> sin etiqueta: hello-world@sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
> eliminado: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
> eliminado: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
> sin etiqueta: discourse/base:2.0.20191013-2320
> sin etiqueta: discourse/base@sha256:77e010342aa5111c8c3b81d80de7d4bdb229793d595bbe373992cdb8f86ef41f
> eliminado: sha256:53b44681b65ee5e9a9cadc6bd34c6aa6f6bcbbbe6270e61669c50bcd655c6898
> eliminado: sha256:939a3ac6d5627270ae02a9f9ea05c580589cec0afa019b7f296fdd43157dd3a0
> 
> Espacio recuperado total: 452.2MB

Ahora cada vez que intento iniciar/reiniciar… ¡los errores han vuelto! He vuelto atrás al momento en que los mensajes de error Unable to find image o Error response from daemon dejaron de aparecer. Claramente, los contenedores fueron reconstruidos, y borrar las imágenes de los contenedores causa problemas.

Si tu Docker está roto (es decir, docker run ubuntu falla), Discourse muy probablemente no funcionará.

Para obtener soporte específico de Docker, puedes intentar publicar en https://forums.docker.com/

@Falco Sí, estoy obteniendo los errores Unable to find image locally y Error response from daemon como antes cuando ejecuto ese comando.

Por lo tanto, siguiendo tu sugerencia, he iniciado un tema en los foros de Docker. Lamentablemente, aún no hay respuesta.

Así que, más noticias:

Buenas noticias

¡Ya no recibo el error /usr/bin/docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).!

docker run ubuntu ya no reporta errores. @Falco, ¿se supone que debería haber alguna salida que deba ver?

root@forum:/var/discourse# docker run ubuntu
root@forum:/var/discourse#

Entonces, ¿qué he hecho para resolver el error? He reemplazado el servidor de nombres (DNS) utilizado en esta VM por el servicio de Google Public DNS:
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Sin embargo, tengo que ejecutar el comando anterior cada vez después de reiniciar la VM (así que parece ser solo temporal), o obtendré los dos errores al intentar ejecutar cualquier comando ./launcher. Después de eso, solo aparece uno de los errores (Unable to find image 'discourse/base:2.0.20191013-2320' locally), pero el comando parece resolverse:

root@forum:/var/discourse# ./launcher start app

WARNING: We are about to start downloading the Discourse base image
This process may take anywhere between a few minutes to an hour, depending on your network speed

Please be patient

Unable to find image 'discourse/base:2.0.20191013-2320' locally
2.0.20191013-2320: Pulling from discourse/base
Digest: sha256:77e010342aa5111c8c3b81d80de7d4bdb229793d595bbe373992cdb8f86ef41f
Status: Downloaded newer image for discourse/base:2.0.20191013-2320

starting up existing container
+ /usr/bin/docker start app
app

Parece que también puedo ejecutar ./launcher rebuild app sin errores. Aquí está la última cosa que muestra la salida del comando (ocultando las URL y la dirección MAC):

+ /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 DISCOURSE_HOSTNAME=discourse.domain.com -e DISCOURSE_DEVELOPER_EMAILS=admin@domain.com,postmaster@domain.com -e DISCOURSE_SMTP_ADDRESS=smtp.sparkpostmail.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=SMTP_Injection -e DISCOURSE_SMTP_PASSWORD=0d431cd177ce3d35833aa823d498eb57c7c4e99c -e LETSENCRYPT_ACCOUNT_EMAIL=admin@domain.com -h forum-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 8080:80 -p 8443:443 -p 2222:22 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 00:00:00:00:00:01 local_discourse/app /sbin/boot
abb788d4a6fd301d88f129189a07a19c4a6bfc8554d43c555d3e3cd126374736

Malas noticias

Sigo recibiendo el error 502 Bad Gateway - nginx/1.14.0 (Ubuntu) cuando intento acceder a la página.

¿Qué más podría ser el problema? ¿Alguna sugerencia?

¡He resuelto mi problema! ¡Mi foro de Discourse ahora aparece en el navegador!

Bueno, para ser más específico, Francis Day en los foros de Nginx resolvió mi problema! En realidad, siempre fue Nginx. Esto es lo que hice:

  1. Inicié sesión en mi máquina virtual (VM) de Nginx.
  2. Edité el archivo de configuración de Discourse con VIM: vim /etc/nginx/sites-available/discourse.conf.
  3. Así se veía mi archivo de configuración de Discourse (obviamente no estoy usando el nombre de dominio que usaría normalmente, y donde 192.168.0.101 = VM de Nginx y 192.168.0.104 = VM de Discourse).
  4. Solo hice un cambio: cambié proxy_pass http://discourse.domainame.com:8080/; por proxy_pass 192.168.0.104:8080/;. Así que proxy_pass está configurado con la IP local de la VM de Discourse en lugar del nombre de host.
  5. Guardé el archivo de configuración y luego recargué (systemctl reload nginx.service) y reinicié (systemctl restart nginx.service) Nginx.
  6. ¡Listo! Refresqué la URL de Discourse y apareció. ¡Ni siquiera fue necesario reiniciar/reconstruir Discourse!

Espero que alguien encuentre útil lo que he escrito aquí, ya que hacer proxy inverso de Discourse a través de Nginx puede ser realmente complicado.