Einrichten einer Heimentwicklungsumgebung (Docker + Gitlab + DNS)

Intro


Ich konnte keinen passenden Namen für den Beitrag finden, daher werde ich kurz beschreiben, was besprochen wird.


Die meisten von uns haben einige kleine persönliche Handwerke, die nicht über die Grenzen unserer Häuser hinausgehen. Jemand hostet sie auf einem funktionierenden Computer, jemand auf Heroku, jemand auf VPS und jemand hat einen Heimserver. Es gibt sogar eine R / Homelab- Community auf reddit , in der Leute über verschiedene Hardware- und Softwareteile für die sogenannten diskutieren. Heimlabor .


Ich bin nicht so begeistert von diesem Thema, aber ich habe einen Intel NUC an meinem Platz, der Musik von einem NAS mit MPD wiedergibt . Zusätzlich zu MPD drehen sich meine kleinen Handwerke darum, was mir hilft, damit zu arbeiten: jetzt ein toter Bot für Telegramm, HTTP-API auf Sinatra und ein ungeschicktes Frontend dafür.


In einem Beitrag werde ich ohne spezielle Details (von denen ich viele selbst nicht verstehe) den Prozess der Installation eines DNS-Servers für die Arbeit mit Domänennamen für Dienste, das Schema des gleichzeitigen Betriebs mehrerer Dienste mit Docker und die Installation von Gitlab mit CI beschreiben. Sie lernen nichts Neues, aber plötzlich ist dieser „Leitfaden“ für jemanden nützlich. Außerdem würde ich gerne Vorschläge hören, wie ich es einfacher / eleganter / korrekter machen kann.


Anfangs befand sich der Code meiner Dienste auf einem Bitbucket / Github, und nachdem ich die Docker-Images erstellt hatte, musste ich unter SSH einige Skripte ausführen, mit denen Container mit Diensten erstellt / aktualisiert wurden. Ich habe mich dabei erwischt, dass ich einen kleinen nervigen Fehler in der Anwendung sehe, den ich nicht behebe, nur weil ich zu faul bin, um diesen gesamten Vorgang auszuführen. Offensichtlich war es Zeit, alles zu automatisieren. Damals kam die Idee auf, Gitlab + CI zu installieren.


Lokale Domänen mit DNS


Alle Container wurden der Einfachheit halber mit dem --network=host Es reichte aus, verschiedene Ports in Anwendungen zu verwenden. Denken Sie jedoch mit zunehmender Anzahl von Diensten daran, welche Anwendung welcher Port verwendet. Ja, und es ist nicht sehr schön, jedes Mal die IP-Adresse mit dem Port im Browser einzugeben. Vor der Installation von gitlab habe ich mich daher für das Hosting mehrerer Anwendungen auf demselben Server entschieden.


Die Idee ist einfach: Wir konfigurieren DNS, geben es an den Router weiter, installieren Nginx und verwenden seine Konfiguration, um Anforderungen je nach Domäne an verschiedene Ports umzuleiten. Auf diese Weise können Sie sich während der Entwicklung nicht um Ports kümmern Container verwenden --publish anstelle von --network=host .


Während der Installation wurde diese Anleitung verwendet . Darin ist die Konfiguration für Ubuntu 16.04 erledigt, ich habe Debian.


Weitere Aktionen werden als root .


Installieren Sie zunächst bind9 und Dienstprogramme:


 apt-get install -y bind9 bind9utils bind9-doc dnsutils 

Als nächstes müssen wir die Domänenzone konfigurieren. /etc/bind/named.conf.local Datei /etc/bind/named.conf.local Folgendes /etc/bind/named.conf.local :


 zone "nondv.home" IN { //    type master; file "/etc/bind/fwd.nondv.home.db"; // Forward lookup file allow-update { none; }; // Since this is the primary DNS, it should be none. }; 

Die Konfiguration für die umgekehrte Suche wurde ebenfalls zum Handbuch hinzugefügt. Um ehrlich zu sein, verstehe ich nicht wirklich, warum dies erforderlich ist, also habe ich es nicht getan.


Erstellen Sie nun die Datei /etc/bind/fwd.nondv.home.db :


 $TTL 604800 @ IN SOA ns1.mydomain.home. root.mydomain.home. ( 20 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ;Name Server Information IN NS ns1.nondv.home. ;IP address of Name Server ns1 IN A 192.168.0.3 ;A - Record HostName To Ip Address nuc IN A 192.168.0.3 gitlab IN A 192.168.0.3 mpd IN A 192.168.0.3 @ IN A 192.168.0.3 

Starten Sie anschließend bind9 neu und stellen Sie autorun ein:


 systemctl restart bind9 systemctl enable bind9 

Beachten Sie, dass ich .home anstelle von .local . Dies geschah, weil die Domäne nondv.local ohne Subdomänen nicht aufgelöst wurde. Genauer gesagt hat dig es normal erkannt, Browser und curl jedoch nicht. Wie mir ein Kollege erklärte, ist dies höchstwahrscheinlich auf verschiedene Software wie Bonjour (meinen Arbeitslaptop mit einem Apfel auf dem Deckel) zurückzuführen. Im Allgemeinen sollte es keine derartigen Probleme mit der .home Domäne geben.


Das ist eigentlich alles. Danach habe ich dem Router DNS als primäres /etc/resolve.conf hinzugefügt und erneut eine Verbindung zu ihm hergestellt (sodass die Datei /etc/resolve.conf automatisch aktualisiert wird).


Nginx


Wie gesagt, um über HTTP auf Port 80 gleichzeitig auf alle Dienste zugreifen zu können, müssen wir Nginx so konfigurieren, dass es je nach Domäne Anfragen an verschiedene Ports weiterleitet.


Die Dokumentation zum Nginx-Image finden Sie auf der Docker Hub- Website.


/srv/nginx/nginx.conf Sie die Hauptkonfigurationsdatei /srv/nginx/nginx.conf :


 user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name nondv.home; rewrite ^/$ http://mpd.nondv.home redirect; #  ,       } include /etc/nginx/conf.d/*.conf; } 

Konfigurieren Sie als Nächstes die Domänen. Ich werde nur einen zeigen:


 # /srv/nginx/conf.d/gitlab.conf server { listen 80; server_name gitlab.nondv.home; location / { proxy_pass http://127.0.0.1:3080; } } 

Der Container wird mit dem folgenden Befehl gestartet:


 docker run --detach \ --network host \ --name nginx \ --restart always \ --volume /srv/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \ --volume /srv/nginx/conf.d:/etc/nginx/conf.d:ro \ nginx:alpine 

Das ist alles, jetzt werden HTTP-Anforderungen an Port 80 mit nginx abgefangen und an den gewünschten Port umgeleitet.


Gitlab


Nach dem offiziellen Leitfaden ist alles einfach:


 docker run --detach \ --hostname gitlab.nondv.home \ --publish 3080:80 --publish 3022:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab:Z \ --volume /srv/gitlab/logs:/var/log/gitlab:Z \ --volume /srv/gitlab/data:/var/opt/gitlab:Z \ gitlab/gitlab-ce:latest 

Wir warten darauf, dass alles konfiguriert wird (wir schauen in die docker logs -f gitlab ) und geben danach den Container ( docker exec -it gitlab bash ) für weitere docker exec -it gitlab bash . Einstellungen:


 nano /etc/gitlab/gitlab.rb # or vim # /etc/gitlab/gitlab.rb external_url 'http://gitlab.nondv.home' gitlab_rails['gitlab_shell_ssh_port'] = 3022 # /etc/gitlab/gitlab.rb gitlab-ctl reconfigure 

Aus docker container restart gitlab Zuverlässigkeit können Sie den docker container restart gitlab starten ( docker container restart gitlab ).


Ci


Gitlab CI ist bereits integriert, benötigt jedoch einen Gitlab Runner ( Dokumentation ).


Dazu habe ich ein kleines Skript geschrieben:


 NAME="gitlab-runner$1" echo $NAME docker run -d --name $NAME --restart always \ --network=host \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:alpine 

Nachdem wir den Läufer erstellt haben, müssen wir ihn registrieren. Gehen Sie dazu zu gitlab (über den Browser) und gehen Sie zu Admin → Übersicht → Läufer. Es beschreibt die Installation von Läufern. Kurz gesagt, Sie tun einfach:


 docker exec -it gitlab-runner register 

und beantworte die Fragen.


Ihre eigenen HTTP-Dienste


Sie werden analog zum Gitlab gestartet. Veröffentlichen Sie sie an einem Port und fügen Sie die Konfiguration zu nginx hinzu.


Fazit


Jetzt können Sie Ihre Projekte auf Ihrem Heimserver hosten und die Leistung von Gitlab CI nutzen, um das Zusammenstellen und Veröffentlichen Ihrer Projekte zu automatisieren. Es ist praktisch, git push und sich keine Sorgen um den Start zu machen, oder?


Ich würde auch empfehlen, Mail für Gitlab einzurichten. Persönlich habe ich eine Mailbox auf Yandex verwendet. Dokumentation

Source: https://habr.com/ru/post/de417179/


All Articles