Intro
Je n'ai pas pu trouver un nom approprié pour le poste, je vais donc décrire brièvement ce qui sera discuté.
La plupart d'entre nous ont de petits métiers personnels qui ne dépassent pas les limites de nos maisons. Quelqu'un les héberge sur un ordinateur de travail, quelqu'un sur Heroku, quelqu'un sur VPS et quelqu'un a un serveur domestique. Il existe même une communauté r / homelab sur reddit , dans laquelle les gens discutent de différents composants matériels et logiciels pour les soi-disant. laboratoire à domicile .
Je ne suis pas très intéressé par ce problème, mais j'ai un Intel NUC à ma place, qui joue de la musique à partir d'un NAS utilisant MPD . En plus de MPD, mes petits métiers tournent dessus, ce qui m'aide à travailler avec lui: maintenant un bot mort pour le télégramme, l'API HTTP sur sinatra et une interface maladroite pour lui.
Dans un article, je décrirai sans détails particuliers (dont beaucoup je ne comprends pas moi-même) le processus d'installation d'un serveur DNS pour travailler avec des noms de domaine pour les services, le schéma de fonctionnement simultané de plusieurs services à l'aide de Docker et l'installation de Gitlab avec CI. Vous n’apprenez rien de nouveau, mais soudain, ce «guide» est utile à quelqu’un. De plus, j'aimerais entendre des suggestions sur la façon de le rendre plus facile / plus élégant / plus correct.
Initialement, le code de mes services était sur un bitbucket / github, et après avoir créé les images de docker, j'ai dû passer sous SSH et exécuter quelques scripts qui ont créé / mis à jour des conteneurs avec des services. Je me suis surpris à penser que je voyais un petit bogue ennuyeux dans l'application, que je ne corrige pas juste parce que je suis trop paresseux pour effectuer toute cette procédure. De toute évidence, il était temps d'automatiser tout. C'est alors que l'idée d'installer Gitlab + CI est venue.
Domaines locaux utilisant DNS
Tous les conteneurs ont été créés avec l' --network=host
pour plus de simplicité - il suffisait d'utiliser différents ports dans les applications. Cependant, avec l'augmentation du nombre de services, rappelez-vous quelle application quel port utilise. Oui, et entrer l'adresse IP avec le port dans le navigateur à chaque fois n'est pas très agréable, donc avant d'installer gitlab, j'ai décidé de m'occuper de l'hébergement de plusieurs applications sur le même serveur.
L'idée est simple: nous configurons le DNS, le transmettons au routeur, installons Nginx et utilisons sa configuration pour rediriger les requêtes vers différents ports en fonction du domaine. Cela vous permettra de ne pas vous soucier des ports pendant le développement, car les conteneurs commenceront à utiliser --publish
au lieu de --network=host
.
Lors de l'installation, ce guide a été utilisé . Dans ce document, la configuration est effectuée pour Ubuntu 16.04, j'ai Debian.
D'autres actions sont effectuées en tant que root
.
Tout d'abord, installez bind9
et les utilitaires:
apt-get install -y bind9 bind9utils bind9-doc dnsutils
Ensuite, nous devons configurer la zone de domaine. Pour ce faire, ajoutez ce qui suit au fichier /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. };
De plus, la configuration de la recherche inversée est ajoutée au guide, mais pour être honnête, je ne comprends pas vraiment pourquoi cela est nécessaire, donc je ne l'ai pas fait.
Créez maintenant le fichier /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
Ensuite, redémarrez bind9 et définissez l'exécution automatique:
systemctl restart bind9 systemctl enable bind9
Notez que j'ai utilisé .home
au lieu de .local
. Cela a été fait car le domaine nondv.local
pas résolu sans sous-domaines. Eh bien, plus précisément, dig
reconnu normalement, mais pas les navigateurs et les curl
. Comme un collègue me l'a expliqué, cela est probablement dû à divers logiciels comme Bonjour (mon ordinateur portable de travail avec une pomme sur le couvercle). En général, il ne devrait pas y avoir de tels problèmes avec le domaine .home
.
C'est tout, en fait. Après cela, j'ai ajouté DNS en tant que principal au routeur et me suis reconnecté à celui-ci (afin que le fichier /etc/resolve.conf
soit automatiquement mis à jour).
Nginx
Comme je l'ai dit, afin de pouvoir accéder à tous les services en même temps via HTTP sur le port 80, nous devons configurer Nginx de manière à ce qu'il envoie des requêtes par procuration à différents ports en fonction du domaine.
La documentation de l'image nginx est disponible sur le site Web de Docker Hub .
Préparez le fichier de configuration principal /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;
Ensuite, configurez les domaines. Je n'en montrerai qu'un:
# /srv/nginx/conf.d/gitlab.conf server { listen 80; server_name gitlab.nondv.home; location / { proxy_pass http://127.0.0.1:3080; } }
Le conteneur est lancé par la commande:
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
C'est tout, maintenant les requêtes HTTP vers le port 80 seront capturées à l'aide de nginx et redirigées vers le port souhaité.
Gitlab
Tout est simple selon le guide officiel :
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
Nous attendons que tout soit configuré (nous examinons les docker logs -f gitlab
) et après cela, nous entrons dans le conteneur ( docker exec -it gitlab bash
) pour plus. paramètres:
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
Pour plus de fiabilité, vous pouvez redémarrer le conteneur ( docker container restart gitlab
).
Ci
Gitlab CI est déjà intégré, mais il a besoin d'un Gitlab Runner ( documentation ).
Pour ce faire, j'ai écrit un petit script:
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
Après avoir créé le coureur, nous devons l'enregistrer. Pour ce faire, allez dans gitlab (via le navigateur), allez dans la zone Admin → Présentation → Runners. Il décrit l'installation des coureurs. En bref, vous faites simplement:
docker exec -it gitlab-runner register
et répondez aux questions.
Vos propres services HTTP
Ils sont lancés par analogie avec le gitlab. Publiez-les sur un port et ajoutez la configuration à nginx.
Conclusion
Vous pouvez désormais héberger vos projets sur votre serveur domestique et utiliser la puissance de Gitlab CI pour automatiser l'assemblage et la publication de vos projets. Il est pratique de faire git push
et de ne pas se soucier de commencer, non?
Je recommanderais également de configurer la messagerie pour gitlab. Personnellement, j'ai utilisé une boîte aux lettres sur Yandex. La documentation