
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:
- den Docker-Provider aktivieren
- die Container-Erkennung deaktivieren
- den gesamten HTTP-traffic auf HTTPS umleiten
- Let's Encrypt mit
HTTP-01
-Challenge konfigurieren - die TLS-Konfiguration auf alle Routen anwenden
- den Traefik-Container direkt an das Netzwerk des Hosts binden, sodass keine zusätzliche Konfiguration für Traefik erforderlich ist
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