Versionsverwaltung selbstgemacht: Gitlab auf dem eigenen Server

← zurück zum Blog

Gitlab hat sich als Open-Source-Alternative zu Diensten wie GitHub oder Bitbucket einen Namen gemacht. Die kostenlose Community Edition der Versionsverwaltungs-Software lässt sich problemlos auf eigener Hardware oder einem virtuellen Server installieren. Heute zeigen wir Ihnen, wie Sie Gitlab auf einem Geekserver installieren und mit einem SSL-Zertifikat von Let’s Encrypt ausstatten.

Hinweis: Wir haben das Geekserver-Angebot per Ende Juli 2017 eingestellt.

Gitlab: Versionsverwaltung selbstgemacht

Die Vorbereitungen

Wir installieren die Gitlab Community Edition (Gitlab CE) auf einem Server mit der momentan aktuellen LTS-Version 16.04 der beliebten Linux-Distrution Ubuntu. Gitlab verlangt für den vernünftigen Betrieb eine Maschine mit 4 GB Arbeitsspeicher. Ein Geekserver mit der benötigten Power steht in wenigen Minuten bereit.

Software

Alle benötigten Bestandteile, um Gitlab auf einem eigenen Server zu betreiben, sind als Open-Source-Software verfügbar. Gitlab bietet dazu für verschiedene Linux-Distributionen die sogenannten Omnibus-Pakete an, die praktisch alle benötigten Komponenten enthalten und die sich in wenigen Minuten installieren lassen.

Sicherheit

Eine frische Ubuntu-Installation sollte mit einigen Massnahmen gesichert werden, um ungewollten Zugriff von Dritten zu verhindern. Mit einem unprivilegierten Benutzer, der anstatt root verwendet wird, der einfach zu bedienenden Firewall ufw und dem Deaktivieren von SSH-Logins per Passwort sind die wichtigsten Teile auf Betriebssystem-Seite abgedeckt.

Falls nicht bereits geschehen, geben wir mit sudo ufw allow http und sudo ufw allow https die Ports für HTTP und HTTPS frei, da wir diese später für Gitlab und das Anfordern des SSL-Zertifikats benötigen.

Damit die Kommunikation zur Gitlab-Installation verschlüsselt ist, beziehen wir von der Zertifizierungsstelle Let’s Encrypt ein kostenloses SSL-Zertifikat und binden es in Gitlab ein.

Adresse

Gitlab wird unter einem öffentlich erreichbaren Hostnamen erreichbar sein. Dazu benötigen wir eine Domain bzw. Subdomain, die per DNS-Eintrag auf den Server zeigt. Diesen Schritt führen wir als allererstes durch.

Die Installation

Wir installieren Gitlab auf einem Server mit Ubuntu 16.04 unter der Subdomain gitlab.oliverorange.ch. Ersetzen Sie gitlab.oliverorange.ch in den folgenden Anweisungen jeweils durch die von Ihnen gewählte Domain.

DNS-Zone

Für die neue Subdomain benötigen wir einen DNS-Record, den wir mithilfe des DNS-Editors im my.cyon-Konto unter «Webhosting/Domain» > «DNS verwalten» erstellen können.

DNS-Editor: Neuen A-Record hinzufügen.

DNS-Editor: Neuen A-Record hinzufügen.

Wir geben im Feld «Zone» den kompletten Domainnamen ein und im Feld «Wert» die IP-Adresse unseres Geekservers.

Gitlab installieren

Wir verbinden uns per SSH zu unserem Geekserver und installieren als erstes Abhängigkeiten, die von Gitlab benötigt werden.

sudo apt-get install curl openssh-server ca-certificates postfix

Die Installation von Postfix wird mit einer kleinen Installationsroutine begleitet. Wir wählen dort die Option Internet Site.

Danach fügen wir das Gitlab-Paket der Paketverwaltung hinzu:

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Und installieren das Paket:
sudo apt-get install gitlab-ce

Zum Schluss konfigurieren wir Gitlab mit folgendem Befehl:
sudo gitlab-ctl reconfigure

Danach ist Gitlab bereits einsatzbereit. Wir müssen lediglich das Administrator-Passwort setzen, was wir denn auch gleich im Browser tun. Wir rufen dazu die vorerst noch unverschlüsselte URL http://gitlab.oliverorange.ch auf und vergeben ein sicheres Passwort.

Gitlab: Issue-Board

Issues in der Board-Ansicht.

SSL-Zertifikat anfordern

Dank Let’s Encrypt können wir für unsere Gitlab-Installation ein kostenloses SSL-Zertifikat ausstellen lassen. Dazu installieren wir den Client namens Certbot auf dem Server (das passende Paket heisst in der Paketverwaltung von Ubuntu 16.04 noch letsencrypt):

sudo apt-get install letsencrypt

Um das gewünschte SSL-Zertifikat für gitlab.oliverorange.ch zu erhalten, müssen wir beweisen können, dass wir die zu sichernde Subdomain kontrollieren. Wir machen uns dabei den nginx-Webserver zu Nutze, den Gitlab für die Ausgabe der Webapplikation verwendet. Wir erstellen dazu als erstes ein Verzeichnis, in welchem der Certbot-Client eine Datei ablegen wird, die unsere Kontrolle von gitlab.oliverorange.ch beweist:
sudo mkdir -p /var/www/letsencrypt

Danach editieren wir die Gitlab-Konfigurationsdatei /etc/gitlab/gitlab.rb mit dem Befehl sudo vim /etc/gitlab/gitlab.rb und fügen im Abschnitt GitLab Nginx folgende Zeile hinzu:

nginx['custom_gitlab_server_config'] = "location ^~ /.well-known { root /var/www/letsencrypt; }"

Die Zeile bewirkt, dass das zuvor erstellte Webverzeichnis von nginx gegen aussen unter der Adresse /.well-know erreichbar gemacht wird. Mit :wq speichern und schliessen wir die Datei in vim. Nun können wir das Zertifikat bei Let’s Encrypt beantragen. Das erreichen wir mit folgendem Befehl:

sudo letsencrypt certonly -a webroot -w /var/www/letsencrypt -d gitlab.oliverorange.ch

-a webroot bewirkt, dass die Authentifizierung bei Let’s Encrypt per Webroot beantragt wird, -w /var/www/letsencrypt teilt dem Certbot-Client mit, auf welches Verzeichnis das Webroot zeigen soll und -d gitlab.oliverorange.ch gibt die zu sichernde Domain an.

Es erscheint ein grafischer Dialog, bei dem wir eine E-Mail-Adresse angeben, an die wir Informationen von der Zertifizierungsstelle erhalten, falls beispielsweise das Zertifikat ablaufen sollte. Ausserdem akzeptieren wir die AGB der Zertifizierungsstelle.

Die erstellten Schlüssel und Zertifikate befinden sich danach im Verzeichnis /etc/letsencrypt/live/gitlab.oliverorange.ch.

SSL-Zertifikat mit Gitlab konfigurieren

Damit das soeben angeforderte SSL-Zertifikat mit Gitlab auch funktioniert, passen wir die Gitlab-Konfiguration entsprechend an. Wir öffnen die Konfigurationsdatei mit sudo vim /etc/gitlab/gitlab.rb und ändern als erstes die Zeile

external_url 'http://gitlab.oliverorange.ch'

zu

external_url 'https://gitlab.oliverorange.ch'

fügen also dem Protokoll einfach ein s hinzu.

Als zweites hinterlegen wir den Pfad zu den Zertifikaten und aktivieren die Weiterleitung von HTTP zu HTTPS. Wir ändern dazu die folgenden drei Zeilen im Abschnitt GitLab Nginx von

# nginx['redirect_http_to_https'] = false
# nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt"
# nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"

zu

nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.oliverorange.ch/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.oliverorange.ch/privkey.pem"

und speichern die Konfiguration mit :wq. Zum Schluss laden wir in Gitlab die neue Konfiguration mit sudo gitlab-ctl reconfigure. Unsere Gitlab-Installation ist nun per HTTPS erreichbar.

SSL-Zertifikat automatisch verlängern lassen

SSL-Zertifikate von Let’s Encrypt sind 90 Tage gültig und müssen daher regelmässig erneuert werden. Die Erneuerung erledigen wir deshalb mit einem Cronjob. Wir legen mit dem Befehl sudo vim /etc/cron.d/letsencrypt eine neue Datei im Verzeichnis /etc/cron.d/ an und fügen den Befehl zur Erneuerung ein:

0 */12 * * * root perl -e 'sleep int(rand(3600))' && letsencrypt renew | tee | grep -q "/etc/letsencrypt/live/gitlab.oliverorange.ch/fullchain.pem (success)" && /usr/bin/gitlab-ctl hup nginx >> /var/log/letsencrypt-renew.log

Da die Certbot-Version in Ubuntu 16.04 die Option --renew-hook noch nicht kennt prüfen wir jeweils die die Rückgabe-Werte von letsencrypt, ob diese den Teil

/etc/letsencrypt/live/gitlab.oliverorange.ch/fullchain.pem (success)

enthalten. Ist das der Fall, wird mit /usr/bin/gitlab-ctl hup nginx nginx neu geladen und mit >> /var/log/letsencrypt-renew.log eine Nachricht im Renew-Log hinterlegt.

4 Kommentare

  1. Macht es nicht mehr Sinn anstelle eurem extra langen Konstrukt an Cronjob

    #TEST -> letsencrypt renew –dry-run –agree-tos

    Produktive -> letsencrypt renew

    zu nutzen ? -> https://certbot.eff.org/#ubuntuxenial-nginx

    und optional als public verzeichniss direkt das von gitlab zu nutzen ?
    –webroot -w /opt/gitlab/embedded/service/gitlab-rails/public

    • Hi Joel, danke für Deinen Kommentar. In meinem Beispiel hatte noch die Option renew gefehlt, das habe ich korrigiert. Zur Länge des Cronjobs: perl -e 'sleep int(rand(3600))' bewirkt, dass die weiteren Tasks zu einer zufälligen Minute in der gewählten Stunde ausgeführt werden. Ganz am Schluss unter https://certbot.eff.org/#ubuntuxenial-nginx wird gewünscht, für den Cronjob eine zufällige Minute zu wählen. Wir treiben es mit dem Befehl auf die Spitze, für den Fall, dass die Anleitung von hunderten von Lesern angewendet wird :) Die Befehle nach dem eigentlichen Renew-Befehl dienen dazu, dass nginx nur dann neu geladen wird, wenn effektiv ein neues Zertifikat gespeichert wurde und der Vorgang einen entsprechenden Log-Eintrag enthält.

  2. Eine Alternative für ein selber gehostetes „Github“ wäre auch gogs: https://gogs.io/

Kommentar hinzufügen

Ihre E-Mail-Adresse wird nicht veröffentlicht.
Auszufüllende Felder sind mit einem * gekennzeichnet.

*
*
*
Einfache HTML Anweisungen wie a, strong, blockquote etc. sind möglich.

Hinweis

Wir behalten uns vor, Spam-, beleidigende oder anderweitig unpassende Kommentare zu entfernen.

← zurück zum Blog