HH maczarr.de

Synology NAS: GitLab, Pages und Runner via Docker einrichten

Bisher hatte ich GitLab auf meinem NAS von Synology als Paket eingerichtet, letztlich war das auch nur ein Docker-Image, aber man installierte es über die Pakete. Dazu kam, dass es ein Community-Image war, was relativ lange kein Update bekommen hat. Kürzlich kam DSM 7 für das NAS raus und in den Release Notes stand, dass das GitLab-Paket eingestellt werden würde. Ich musste mir also etwas überlegen. Das Naheliegendste war GitLab einfach mit dem offiziellen Docker-Image direkt aufzusetzen. Wie das geht und wie man sich dazu auch Docker Runner und GitLab Pages aufsetzt um anschließend Pipelines laufen zu lassen habe ich hier einmal aufgeschrieben.

GitLab einrichten

Für die Domain unter der GitLab selbst zu erreichen ist werde ich git.deine.domain benutzen, für die GitLab-Pages-Domain pages.deine.domain, da diese unterschiedlich sein müssen. Ob man das für einen Rechner über die /etc/hosts einrichtet und beides auf die IP des NAS verweist oder im LAN einen eigenen DNS-Server betreibt ist für das Beispiel hier egal.

Als erstes habe ich im File-Manager auf dem NAS unter docker/gitlab-ce/ die drei Verzeichnisse config, logs und data erstellt. Auf dem NAS unter Docker habe ich dann das Image "gitlab/gitlab-ce:latest" benutzt und die drei Verzeichnisse von eben als Volumes eingerichtet:

- docker/gitlab-ce/config:/etc/gitlab
- docker/gitlab-ce/logs:/var/log/gitlab
- docker/gitlab-ce/data:/var/opt/gitlab

Als Umgebungsvariablen habe ich folgende definiert:

- GITLAB_SSH_PORT: 30001
- GITLAB_PORT: 30000

Und zu guter letzt noch diese drei Ports eingerichtet:

- 30001:22:tcp
- 30002:443:tcp
- 30000:80:tcp

Man kann natürlich drei andere Ports nehmen, nur die Standardports gehen nicht, da diese schon vom NAS selbst genutzt werden.
Anschließend kann der Container das erste Mal gestartet werden mit Hilfe der GUI im NAS.

Per SSH verbindet man sich nun mit dem NAS und kann anschließend die Config-Datei im Volume anpassen, beispielsweise mittels vim (sudo vim docker/gitlab-ce/config/gitlab.rb) und fügt diese Zeilen hinzu:

external_url "http://git.deine.domain:30000/"
nginx['listen_port'] = 80

Anschließend muss GitLab rekonfiguriert werden ("gitlab-gitlab-ce1" ist hier der Container-Name und kann variieren):
sudo docker exec -it gitlab-gitlab-ce1 gitlab-ctl reconfigure

Das Rekonfigurieren braucht etwas Zeit und nach meiner Erfahrung ist GitLab auch noch nicht sofort unter git.deine.domain:30000 aufrufbar, nur weil die Rekonfiguration fertig ist – ein paar Minuten hat's gedauert, bis alles aufrufbar war.

Wird man beim ersten Aufruf nicht darum gebeten ein Root-Passwort zu setzen sondern bekommt nur eine Anmeldemaske muss das Root-Passwort neu gesetzt werden. Dazu geht man per SSH auf das NAS und von dort in den Container:
sudo docker exec -it gitlab-gitlab-ce1 /bin/bash
Im Container kann dann das Root-Passwort neu gesetzt werden mit Hilfe von:
gitlab-rake "gitlab:password:reset[root]"

Nun sollte ein Login im Browser möglich sein und als Root kann man dann weitere User anlegen.

GitLab Runner einrichten

GitLab steht, aber für Pipelines braucht's auch noch GitLab Runner. Dafür erstellt man wieder ein Verzeichnis für einen Volume-Mount:

- docker/gitlab-runner/config

Anschließend per SSH auf dem NAS einwählen und einen Runner starten:

sudo docker run -d 
--name gitlab_runner_docker
--restart always
--network host
-v /run/docker.sock:/var/run/docker.sock
-v /volume1/docker/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:latest

Der Docker-Socket wird in den Container reingereicht, damit von dort aus Docker-Container gestartet werden können. Das sollte man mit Bedacht tun, da damit der Container Zugriff auf das Host-System hat und beispielsweise auch alle Container listen oder löschen könnte. Der Pfad "/volume1/docker/gitlab-runner/config" sollte auf das eben erstellte Verzeichnis für den Mount verweisen.

Runner registrieren

Als Admin geht man jetzt im Browser einmal zu "http://git.deine.domain:30000/admin/runners", da man gleich Daten von dort benötigt. Anschließend kann im Terminal auf dem NAS der Registrierungsprozess gestartet werden:
sudo docker exec -it gitlab_runner_docker gitlab-runner register

"gitlab_runner_docker" muss hier identisch zum "--name gitlab_runner_docker" aus dem Schritt des Runner-Startens von oben sein.
Nach dem Absetzen des Register-Befehls bekommt man ein paar Fragen gestellt:

Instance: http://git.deine.domain:30000
Registration Token: # den gibt's auf der zuvor aufgerufenen Admin-Seite
Description for the runner: GitLabRunner1
Enter tags: # kann leer bestätigt werden, wenn der Runner nicht getaggt werden soll
Enter an executor: docker
Enter the default Docker image: alpine:latest

Damit ist die Registrierung abgeschlossen. Die Admin-Seite im Browser sollte nun nach einem Refresh den neuen Runner listen und unter "Last contact" sowas wie "seconds ago" stehen haben.

Anschließend habe ich noch die Config-Datei anpassen müssen:
vim /volume1/docker/gitlab-runner/config/config.toml

Unter "[[runners.docker]]" habe ich den Wert von privileged zu true geändert und die Zeile pull_policy = "if-not-present" ergänzt, sodass Container-Images nicht jedes Mal neu heruntergeladen werden. Danach den Container noch einmal neu starten und der Runner sollte fertig eingerichtet sein: sudo docker restart gitlab_runner_docker

GitLab Pages einrichten

GitLab Pages sind für mich vor allem für Pipeline-Artifacts interessant gewesen, beispielsweise um die detaillierten Ergebnisse eines Accessiblity- oder Performance-Tests einsehen zu können.
Damit GitLab Pages funktionieren muss alles unter http://*.pages.deine.domain:30000 auf die IP des NAS verweisen.

Als erstes muss die GitLab-Config angepasst werden. Per SSH vom NAS aus wird die Config geöffnet:
sudo vim docker/gitlab-ce/config/gitlab.rb

Die folgenden Zeilen werden ergänzt bzw. die Kommentare entfernt und Werte angepasst:

pages_external_url "http://pages.deine.domain:30000/"
pages_nginx['listen_port'] = 80

Nun muss GitLab wieder rekonfiguriert werden:
sudo docker exec -it gitlab-gitlab-ce1 gitlab-ctl reconfigure

Damit ist die Einrichtung der Pages im Prinzip auch schon abgeschlossen. In einer .gitlab-ci.yml kann nun eine Page benutzt werden:

pages:
stage: pages
script:
- echo "Building pages"
- mkdir public
- touch public/index.html
artifacts:
paths:
- public

Das ist alles. GitLab ist eingerichtet, kann Runner in Pipelines benutzen, die Runner können selbst Docker-Container starten und es kann am Ende Inhalt in GitLab Pages geschrieben werden.