Installation von Gitlab hinter Traefik

Insider Blog

Der einfachste Weg, GitLab zu installieren

GitLab bietet offizielle Anweisungen zur Installation mit Docker und Docker Compose. Sie finden diese in der offiziellen Dokumentation

gitlab/docker-compose.yaml
services:
  gitlab:
    image: gitlab/gitlab-ee:<version>-ce.0
    container_name: gitlab
    restart: always
    hostname: '<gitlab.example.com>'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Add any other gitlab.rb configuration here, each on its own line
        external_url 'https://<gitlab.example.com>'
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'

Dies setzt voraus, dass Sie einen Server haben, der ausschließlich für GitLab bestimmt ist und alle erforderlichen Ports (http, https, ssh) frei sind. GitLab kümmert sich um alles, einschließlich der TLS-Konfiguration mit Lets Encrypt.

Integration von GitLab neben anderen Deployments

Was ist, wenn Sie GitLab nicht auf einem dedizierten Server installieren können oder wollen?

Vielleicht möchten Sie einfach einen einzigen Server für alle Ihre Dienste?

Dies ist eine Beispielstruktur, wie Sie Ihre Deployments organisieren könnten:

.
├── gitlab/                # GitLab Service-Stack
├── gitlab-runner/         # GitLab Runner für CI/CD
├── mattermost/            # Mattermost Team-Kollaboration
├── nextcloud/             # Nextcloud Dateihosting und Zusammenarbeit
└── traefik/               # Traefik Reverse-Proxy-Konfiguration

Verwendung einer dedizierten IP

Falls Sie die Möglichkeit haben, Ihrem Server eine zusätzliche IP zuzuweisen (wie eine Floating IP bei Hetzner), können Sie die Ports einfach an diese IP binden.

gitlab/docker-compose.yaml
services:
  gitlab:
    image: gitlab/gitlab-ee:<version>-ce.0
    container_name: gitlab
    restart: always
    hostname: '<gitlab.example.com>'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Add any other gitlab.rb configuration here, each on its own line
        external_url 'https://<gitlab.example.com>'
    ports:
      - '192.168.0.1:80:80'
      - '192.168.0.1:443:443'
      - '192.168.0.1:22:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'

Verwendung von Traefik als Reverse-Proxy

In diesem Fall gehe ich davon aus, dass Sie:

  • keine dedizierte IP für GitLab zuweisen können oder wollen
  • Ihren Standard-SSH-Port nicht ändern können oder wollen
  • Traefik als Reverse-Proxy verwenden möchten

Das Traefik-Deployment

Denken Sie daran, <[email protected]> durch Ihre eigene E-Mail-Adresse zu ersetzen.

traefik/docker-compose.yaml
volumes:
  letsencrypt:

services:
  traefik:
    image: traefik:3
    container_name: traefik
    restart: always
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - letsencrypt:/letsencrypt
    command:
      - --log.level=INFO

      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https

      - --entrypoints.websecure.address=:443
      - --entrypoints.websecure.http.tls.certresolver=letsencrypt

      - --providers.docker=true
      - --providers.docker.exposedByDefault=false

      - --certificatesresolvers.letsencrypt.acme.email=<[email protected]>
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web

Diese Konfiguration wird:

Das GitLab-Deployment

Denken Sie daran, <gitlab.example.com> durch Ihre eigene Domain zu ersetzen.

Bitte schauen Sie in die offizielle Dokumentation bezüglich des GITLAB_HOME-Verzeichnisses

gitlab/docker-compose.yaml
services:
  gitlab:
    image: gitlab/gitlab-ce:<version>-ce.0
    container_name: gitlab
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.gitlab.rule=Host(`<gitlab.example.com>`)"
      - "traefik.http.routers.gitlab.service=gitlab"
      - "traefik.http.services.gitlab.loadbalancer.server.port=80"
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Add any other gitlab.rb configuration here, each on its own line
        external_url '<https://gitlab.example.com>'
        
        letsencrypt['enable'] = false
        
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "https",
          "X-Forwarded-Ssl" => "on"
        }
        
        gitlab_rails['gitlab_shell_ssh_port'] = 2424
    ports:
      - '2424:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'

Diese Konfiguration wird:

  • Let's Encrypt deaktivieren
  • das Abhören von HTTPS deaktivieren und auf Port 80 hören
  • die erforderlichen Proxy-Header setzen
  • den SSH-Port auf 2424 ändern
  • Traefik anweisen, den gesamten Verkehr für gitlab.example.com an Port 80 des Containers weiterzuleiten

Das war's!



GitLab Container-Registry

Wenn Sie so weit gekommen sind, möchten Sie wahrscheinlich auch die Container-Registry einrichten

Container-Registry unter eigener Domain konfigurieren

Diese Einrichtung ist einfach. Wir müssen nur die registry_external_url setzen und Traefik anweisen, wohin die Anfragen weitergeleitet werden sollen


Aktualisierung der GitLab-Konfiguration
gitlab/docker-compose.yaml
services:
  gitlab:
    image: gitlab/gitlab-ce:<version>-ce.0
    container_name: gitlab
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.gitlab.rule=Host(`<gitlab.example.com>`)"
      - "traefik.http.routers.gitlab.service=gitlab"
      - "traefik.http.services.gitlab.loadbalancer.server.port=80"
      - "traefik.http.routers.container-registry.rule=Host(`registry.gitlab.example.com`)"
      - "traefik.http.services.container-registry.loadbalancer.server.port=5000"
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Add any other gitlab.rb configuration here, each on its own line
        external_url '<https://gitlab.example.com>'

        letsencrypt['enable'] = false

        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "https",
          "X-Forwarded-Ssl" => "on"
        }

        gitlab_rails['gitlab_shell_ssh_port'] = 2424

        registry_external_url '<https://registry.gitlab.example.com>'
        registry_nginx['enable'] = false
    ports:
      - '2424:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'

Diese Konfiguration wird:

  • die externe URL der Registry setzen
  • Nginx für die Registry deaktivieren
  • Traefik anweisen, den gesamten Verkehr für registry.gitlab.example.com an Port 5000 des Containers weiterzuleiten


Container-Registry unter einer bestehenden GitLab-Domain konfigurieren

Aktualisierung der Traefik-Konfiguration
traefik/docker-compose.yaml
volumes:
  letsencrypt:

services:
  traefik:
    image: traefik:3
    container_name: traefik
    restart: always
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - letsencrypt:/letsencrypt
    command:
      - --log.level=INFO

      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https

      - --entrypoints.websecure.address=:443
      - --entrypoints.websecure.http.tls.certresolver=letsencrypt
        
      - --entrypoints.container-registry.address=:5050
      - --entrypoints.container-registry.http.tls.certresolver=letsencrypt

      - --providers.docker=true
      - --providers.docker.exposedByDefault=false

      - --certificatesresolvers.letsencrypt.acme.email=<[email protected]>
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web

Diese Konfiguration wird:

  • einen neuen Einstiegspunkt für die Container-Registry hinzufügen
  • die TLS-Konfiguration auf alle Routen in diesem Einstiegspunkt anwenden

Aktualisierung der GitLab-Konfiguration
gitlab/docker-compose.yaml
services:
  gitlab:
    image: gitlab/gitlab-ce:<version>-ce.0
    container_name: gitlab
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.gitlab.rule=Host(`<gitlab.example.com>`)"
      - "traefik.http.routers.gitlab.entrypoints=web,websecure"
      - "traefik.http.routers.gitlab.service=gitlab"
      - "traefik.http.services.gitlab.loadbalancer.server.port=80"
      - "traefik.http.routers.container-registry.rule=Host(`gitlab.example.com`)"
      - "traefik.http.routers.container-registry.entrypoints=container-registry"
      - "traefik.http.routers.container-registry.service=container-registry"
      - "traefik.http.services.container-registry.loadbalancer.server.port=5000"
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Add any other gitlab.rb configuration here, each on its own line
        external_url '<https://gitlab.example.com>'

        letsencrypt['enable'] = false

        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "https",
          "X-Forwarded-Ssl" => "on"
        }

        gitlab_rails['gitlab_shell_ssh_port'] = 2424

        registry_external_url '<https://gitlab.example.com:5050>'
        registry_nginx['enable'] = false
    ports:
      - '2424:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'

Diese Konfiguration wird:

  • die externe URL der Registry setzen
  • Nginx für die Registry deaktivieren
  • Traefik anweisen, den gesamten Verkehr von Port 5050 an Port 5000 des Containers weiterzuleiten

Autor

Steckbrief

Veröffentlicht:

July 16, 2025

Kategorien:

Was uns bewegt, Infrastruktur

Tags:

DevOps
Vorheriger Artikel
Für Entwickler, Für Shopbetreiber - Wir arbeiten nicht mit beliebigen Frameworks, Bibliotheken, Plugins und Programmiersprachen. Wir lieben es professionell. Software, die bei Helm & Walter entsteht, soll leistungsfähig und schlank sein. Hier unsere Favoriten: PHP (rekursives Akronym für PHP: Hypertext Preprocessor) ist eine weit verbreitete und für den …
June 27, 2017
Bernd Helm