26.3.2017 Linux Docker GitLab

Am Wochenende habe ich mich einmal mit Docker beschäftigt, weil es doch wesentlich performanter und angenehmer ist einen Docker Container zu haben, als für alles eine eigene VM. Außerdem “müllt” man sich nicht sein ganzes System zu und kann schnell neue Produkte ausprobieren ohne sich direkt alles zu zerschießen. Dabei habe ich mich auch mal dazu entschieden ein eigenes GitLab im Docker Container aufzusetzen. Ich erstmal die bereitgestellte GitLab Dokumentation gelesen, die auch sehr anschaulich ist. Ich habe die Parameter nur leicht verändert, da ich später per Apache ProxyPass auf das GitLab zugreifen möchte.

docker create \
-h git.docqube.de \
-p 4000:80/tcp \
-p 4001:22/tcp \
--name gitlab \
--restart=always \
-v {path-to-your-gitlab-folder}/config:/etc/gitlab \
-v {path-to-your-gitlab-folder}/logs:/var/log/gitlab \
-v {path-to-your-gitlab-folder}/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

Wie man oben unschwer erkennen kann, möchte ich nur den Port 80 und 22 des Containers anschließen und leite diese an freie Ports des eigentlichen Servers weiter. Die Ports sind beliebig und können natürlich verändert werden.

Nachdem der Container erstellt wurde kann dieser direkt über docker start gitlab gestartet werden. Natürlich ist noch keine Konfiguration vorgenommen worden, was natürlich nachgeholt werden muss. Dazu erstellt GitLab im Container angegebenen Ordner ({path-to-your-gitlab-folder}/config) alle Konfigurationsdateien. Dort findet sich auch die gitlab.rb-Datei, die alle Konfigurationsmöglichkeiten beinhaltet.

Dort habe ich diese Zeilen verändert oder hinzugefügt:

[...]
external_url 'https://{your-gitlab-url}'
[...]
### SMTP Settings
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "{your-smtp-server}"
gitlab_rails['smtp_port'] = {your-smtp-port}
gitlab_rails['smtp_user_name'] = "{your-smtp-user}"
gitlab_rails['smtp_password'] = "{your-smtp-password}"
gitlab_rails['smtp_domain'] = "{your-smtp-server}"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true

### Email Settings
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '{your-gitlab-email}'
gitlab_rails['gitlab_email_display_name'] = 'your own GitLab'
gitlab_rails['gitlab_email_reply_to'] = '{your-gitlab-email}'

[...]

nginx['listen_port'] = 80
[...]
nginx['listen_https'] = false
[...]

Die SMTP-Settings musste ich komplett neu einfügen, die restlichen Einträge können durch das Entfernen des # am Anfang der Zeile aktiviert und verändert werden. Wichtig ist nur, dass diese Einträge über die komplette Konfigurationsdatei verteilt sind (und die ist groß).

Sind die Einstellungen gemacht, kann der Docker-Container neu: docker restart gitlab. Nun folgt die Apache Konfiguration für den ProxyPass. Da ich hier https benutze, habe ich noch ein Let’s Encrypt Zertifikat mit dem certbot erstellt. Eine entsprechende Anleitung findet ihr hier. Der VirtualHost von Apache sieht dann so aus:

<VirtualHost *:443>
    ServerName {your-gitlab-url}
    ServerAdmin {your-admin-url}

    RequestHeader set Host "{your-gitlab-url}"
    RequestHeader add X-Forwarded-Ssl on
    RequestHeader set X-Forwarded-Proto "https"

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:4000/
    ProxyPassReverse / http://127.0.0.1:4001/

    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/live/{your-gitlab-url}/cert.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/{your-gitlab-url}/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/{your-gitlab-url}/chain.pem
    SSLCACertificateFile    /etc/letsencrypt/live/letsencrypt_CA.pem
</VirtualHost>

Falls noch nicht geschehen die Apache Module für Proxy und Header aktivieren, da sonst die Konfigurationsdatei nicht geschluckt wird.

a2enmod proxy proxy_balancer proxy_html proxy_http proxy_wstunnel xml2enc headers

Nach einem Neustart kann man das GitLab unter der angegeben Adresse unter https erreichen und dieses benutzen. Wer stattdessen nur auf http setzten möchte, kann dementsprechend die Konfigurationsdateien ändern.

Der SSH Port für die Kommunikation ist nach außen in dieser Variante 4001. Dieser Port kann in der SSH Konfigurationsdatei (~/.ssh/config) des Clients eingefügt werden, damit er auch weiß wo er den GitLab Server erreichen kann. Hier die eine Beispielkonfiguration:

Host myowngitlab
        Hostname {your-gitlab-url}
        User git
        IdentityFile {path-to-your-gitlab-private-key}
        Port 4001

GitLab Docker Image im Docker Hub: https://hub.docker.com/r/gitlab/gitlab-ce/

GitLab Dokumentation zu Docker: https://docs.gitlab.com/omnibus/docker/

CertBot für Let’s Encrypt: https://certbot.eff.org/

Nach oben