In Docker ausgeführte GitLab-Seiten sind von außerhalb des Containers nicht zugänglich

In Docker ausgeführte GitLab-Seiten sind von außerhalb des Containers nicht zugänglich

Ich habe eine GitLab-Instanz im Docker laufen. GitLab funktioniert einwandfrei, aber ich kann nicht darauf zugreifenGitLab-Seiten.

Die Einrichtung

Überblick

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

Das Problem besteht darin, dass Nginx die Anforderung nicht an den GitLab Pages-Server weiterleiten kann (beachten Sie, dass GitLab selbst funktioniert).
Nginx-Fehlerprotokolleintrag

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

Docker

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

Servereintrag für Seiten

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

Auch mit der absoluten Minimalkonfiguration versucht, nur definieren pages_external_urlund gitlab_pages['enable'].

Dem Problem auf der Spur

  1. Die Anfrage an pages.example.com ist mit 502 (Bad Gateway) von CF fehlgeschlagen
  2. Nginx-Protokoll geprüft, oben erwähnten Protokolleintrag gefunden
  3. Mehrere Anfragen vom Host an den Container gestellt
    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. Habe eine Anfrage aus dem Container gestellt
    # curl localhost:8090 -> 404 error page

Daraus schließe ich, dass etwas den eingehenden Verkehr für 8090 blockiert(GitLab-Seiten), aber Anfragen an 80(GitLab)wurden erfolgreich abgeschlossen. Ich habe ein paar Tage damit verbracht, dieses Problem zu googeln, konnte aber nichts finden.


1 Abgeschnitten; SMTP-, LDAP- und Omniauth-Einstellungen entfernt

Antwort1

Habe gerade die Ursache meines Problems gefunden, nachdem ich stundenlang nach dem Falschen gesucht habe (aber dazu später mehr).

Kurz zusammengefasst

Ich musste den gitlab_pages['listen_proxy']Wert ändern, um auf jeder Schnittstelle zu lauschen, daher sieht es folgendermaßen aus:

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

Detaillierte

Ich habe dieses Problem mit Schlüsselwörtern im Zusammenhang mit GitLab-Seiten gesucht und gerade jetzt dachte ich, vielleicht muss ich über den Tellerrand hinausschauen, was ist, wenn es ein allgemeineres Problem ist und nicht einmal mit GitLab-Seiten zusammenhängt. Nach der ersten Google-Suche fand ich eineschöner Artikeldarüber.

Ich habe die Meldung „Verbindung abgelehnt“ erhalten, weil auf Port 8090 nichts lauschte, da localhostsich dies auf die Loopback-Adresse bezieht, d. h. 127.0.0.1, aber freigegebene Ports werden für die IP des Containers weitergeleitet, in meinem Fall an eine dynamische IP, die beim Schreiben der Frage war 172.17.0.7. Die Lösung besteht also darin, auf jeder Schnittstelle zu lauschen, die mit der IP-Adresse möglich ist 0.0.0.0.

Zwei Abbildungen, die das Problem und die Lösung visualisieren

(Zahlen aus dem erwähnten Artikel, jedoch leicht verändert, um besser zur Frage zu passen, und als reiner Text, um die Lesbarkeit bei Verwendung des Forced-Darkmode zu verbessern)
Beim Benutzen 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           |
                 +-------------------------------------+

Abhören auf jeder Schnittstelle mit 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           |
                 +-------------------------------------+

Antwort2

Meine neueste Konfiguration für 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'

Dies ist die Konfiguration für 1 Docker-Container, der hinter einem Reverse-Proxy (nginx/traefik/was auch immer) bleibt. Wenn Sie https (TLS) auf dem Load Balancer beenden, wird der Datenverkehr an die HTTP-Ports weitergeleitet: 80 – Gitlab, 8090 – Seiten.

verwandte Informationen