Las páginas de GitLab que se ejecutan en Docker son inaccesibles desde fuera del contenedor

Las páginas de GitLab que se ejecutan en Docker son inaccesibles desde fuera del contenedor

Tengo una instancia de GitLab ejecutándose en la ventana acoplable. GitLab funciona bien pero no puedo accederPáginas de GitLab.

La puesta en marcha

Descripción general

           +------------+
Request+-->+ Cloudflare |
           +-----+------+
                 |
                 v       +---------+
               Nginx+--->+Docker   |
                         |  +------+
                         |  |GitLab|
                         +---------+

El problema es que Nginx no puede pasar la solicitud al servidor de GitLab Pages (tenga en cuenta que GitLab funciona solo).
Entrada del registro de errores de Nginx

[error] 14932#14932: *30505 connect() failed (111: Connection refused) while connecting to upstream, [...]

Estibador

image: gitlab/gitlab-ce
version: 13.7.1 (latest)
ip: 172.17.0.7 (dynamic)
published ports:
    172.17.0.1:8080 -> 80
    172.17.0.1:8090 -> 8090

nginx

Entrada de servidor para páginas

server {
        listen 80 default_server;
        listen 443 default_server;
        server_name _;
        
        location / {
                proxy_pass      http://172.17.0.1:8090;
        }
}

GitLab

grep -v '^#|^$' gitlab.rb1

nginx['listen_port'] = 80
nginx['listen_https'] = false
pages_external_url "http://pages.example.com/"
gitlab_pages['enable'] = true
gitlab_pages['external_http'] = []
gitlab_pages['listen_proxy'] = "localhost:8090"
gitlab_pages['inplace_chroot'] = true
gitlab_pages['metrics_address'] = ":9235"
pages_nginx['enable'] = true
pages_nginx['listen_https'] = false
pages_nginx['redirect_http_to_https'] = false

También probé con la configuración mínima absoluta, definiendo solo pages_external_urly gitlab_pages['enable'].

Rastreando el problema

  1. La solicitud a páginas.example.com falló con 502 (Puerta de enlace incorrecta) de CF
  2. Comprobé el registro de Nginx y encontré la entrada de registro mencionada anteriormente.
  3. Realizó múltiples solicitudes desde el host al contenedor.
    1. # curl 172.17.0.1:8090 -> curl: (7) Failed to connect to 172.17.0.1 port 8090: Connection refused
    2. # curl 172.17.0.7:8090 -> curl: (7) Failed to connect to 172.17.0.7 port 8090: Connection refused
  4. Hizo una solicitud desde el contenedor.
    # curl localhost:8090 -> 404 error page

De esto supongo que algo está bloqueando el tráfico entrante para 8090(Páginas de GitLab), pero solicita 80(GitLab)se completan con éxito. Pasé un par de días buscando en Google este problema pero no pude encontrar nada.


1 truncado; Se eliminaron las configuraciones de SMTP, LDAP y omniauth

Respuesta1

Acabo de encontrar la causa de mi problema después de muchas horas de buscar algo incorrecto (pero hablaremos de eso más adelante).

TL;DR

Tuve que cambiar el gitlab_pages['listen_proxy']valor para escuchar en cada interfaz, por lo que se ve así:

gitlab_pages['listen_proxy'] = "0.0.0.0:8090"

Detallado

Estaba buscando este problema con palabras clave relacionadas con las páginas de GitLab y justo ahora pensé que tal vez debería pensar de manera innovadora, ¿qué pasa si es un problema más general y ni siquiera está relacionado con las páginas de GitLab? Después de la primera búsqueda en Google encontré unBuen articulosobre esto.

Recibí el mensaje "conexión rechazada" porque no había nada escuchando en el puerto 8090, porque localhostse refiere a la dirección de loopback, es decir 127.0.0.1, pero los puertos expuestos se reenvían para la IP del contenedor, en mi caso a una IP dinámica que mientras escribía la pregunta era 172.17.0.7. Entonces, la solución es escuchar en todas las interfaces que sean posibles utilizando 0.0.0.0como direcciones IP.

Dos figuras que visualizan el problema y la solución.

(Cifras del artículo mencionado, pero ligeramente modificadas para que coincidan mejor con la pregunta y solo texto para mejorar la legibilidad cuando se usa el modo oscuro forzado)
Cuando usas localhost:8090:

   Request      +--------------------------------------+
      +         | Default network namespace            |
      |         |                                      |
      |         |               +-------+              |
      v         |        +----->+ Nginx +------+       |
+-----+------+  |        |      +-------+      |       |
| Cloudflare |  |        |                     |       |
+-----+------+  |        |                     v       |
      |         +--------+-----------+-+-------+-------+
      |         | Physical interface | | Docker bridge |
      +-------->+ 10.0.0.1           | | 172.17.0.1    |
                +--------------------+ +-------+-------+
                                               |
                                               |
                                               v
                                       +-------+-------+
                                       | Docker bridge |
                                       | 172.17.0.7    |
                 +-------+-----------+-+---------------+
                 |       | Loopback  |                 |
                 |       | 127.0.0.1 |                 |
                 |       +-----+-----+                 |
                 |             |                       |
                 |             |      +--------------+ |
                 |             +----->+ Pages server | |
                 |                    +--------------+ |
                 |GitLab's Network namespace           |
                 +-------------------------------------+

Escuchando en cada interfaz, usando 0.0.0.0:8090:

   Request      +--------------------------------------+
      +         | Default network namespace            |
      |         |                                      |
      |         |               +-------+              |
      v         |        +----->+ Nginx +------+       |
+-----+------+  |        |      +-------+      |       |
| Cloudflare |  |        |                     |       |
+-----+------+  |        |                     v       |
      |         +--------+-----------+-+-------+-------+
      |         | Physical interface | | Docker bridge |
      +-------->+ 10.0.0.1           | | 172.17.0.1    |
                +--------------------+ +-------+-------+
                                               |
                                               |
                                               v
                                       +-------+-------+
                                       | Docker bridge |
                                       | 172.17.0.7    |
                 +-------+-----------+-+-------+-------+
                 |       | Loopback  |         |       |
                 |       | 127.0.0.1 |         |       |
                 |       +-----+-----+         |       |
                 |             |               v       |
                 |             |      +--------+-----+ |
                 |             +----->+ Pages server | |
                 |                    +--------------+ |
                 |GitLab's Network namespace           |
                 +-------------------------------------+

Respuesta2

Mi última configuración para gitlab 16.xx

GITLAB_OMNIBUS_CONFIG: |
        ### Web interace settings
        external_url "https://gitlab.domain.org"
        nginx['listen_port'] = 80
        nginx['listen_https'] = false

        ### Pages
        gitlab_pages['enable'] = true
        pages_external_url "https://pages.domain.org"
        pages_nginx['ssl'] = false
        pages_nginx['listen_https'] = false
        gitlab_pages['listen_proxy'] = '0.0.0.0:8090'
        gitlab_pages['internal_gitlab_server'] = 'http://localhost:8080'

Esta es la configuración para 1 contenedor acoplable, que permanece detrás de un proxy inverso (nginx/traefik/lo que sea). Si termina https(TLS) en el balanceador de carga y envía el tráfico a los puertos HTTP: 80 - gitlab, 8090 - páginas.

información relacionada