Configuración de un entorno de desarrollo doméstico (docker + gitlab + DNS)

Introducción


No pude encontrar un nombre adecuado para la publicación, por lo que describiré brevemente lo que se discutirá.


La mayoría de nosotros tenemos algunas pequeñas artesanías personales que no van más allá de los límites de nuestros hogares. Alguien los aloja en una computadora que funciona, alguien en Heroku, alguien en VPS y alguien tiene un servidor doméstico. Incluso hay una comunidad r / homelab en reddit , en la que las personas discuten diferentes piezas de hardware y software para los llamados. laboratorio casero


No estoy tan interesado en este tema, pero tengo un Intel NUC en mi casa, que reproduce música desde un NAS usando MPD . Además de MPD, mis pequeñas embarcaciones están girando sobre él, lo que me ayuda a trabajar con él: ahora un bot muerto para telegramas, API HTTP en sinatra y una interfaz torpe para ello.


En una publicación, sin detalles especiales (muchos de los cuales yo mismo no entiendo) describiré el proceso de instalación de un servidor DNS para trabajar con nombres de dominio para servicios, el esquema de operación simultánea de varios servicios usando Docker e instalando Gitlab con CI. No aprende nada nuevo, pero de repente esta "guía" es útil para alguien. Además, me gustaría escuchar sugerencias sobre cómo hacerlo más fácil / más elegante / más correcto.


Inicialmente, el código de mis servicios estaba en un bitbucket / github, y después de crear las imágenes de la ventana acoplable, tuve que usar SSH y ejecutar un par de scripts que crearon / actualizaron contenedores con servicios. Me sorprendí pensando que veo un pequeño error molesto en la aplicación, que no soluciono solo porque soy demasiado vago para realizar todo este procedimiento. Obviamente, era hora de automatizar todo. Fue entonces cuando surgió la idea de instalar Gitlab + CI.


Dominios locales usando DNS


Todos los contenedores se crearon con la bandera --network=host por simplicidad; fue suficiente para usar diferentes puertos en las aplicaciones. Sin embargo, con el aumento en el número de servicios, recuerde qué aplicación utiliza qué puerto. Sí, e ingresar la dirección IP con el puerto en el navegador cada vez no es muy agradable, así que antes de instalar gitlab, decidí tratar con el alojamiento de varias aplicaciones en el mismo servidor.


La idea es simple: configuramos DNS, lo alimentamos al enrutador, instalamos Nginx y usamos su configuración para redirigir las solicitudes a diferentes puertos según el dominio. Esto le permitirá no molestarse con los puertos durante el desarrollo, ya que los contenedores comenzarán a usar --publish lugar de --network=host .


Durante la instalación, se utilizó esta guía . En él, la configuración se realiza para Ubuntu 16.04, tengo Debian.


Otras acciones se realizan como root .


En primer lugar, instale bind9 y utilidades:


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

A continuación, necesitamos configurar la zona del dominio. Para hacer esto, agregue lo siguiente al archivo /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. }; 

Además, la configuración para la búsqueda inversa se agrega a la guía, pero para ser honesto, realmente no entiendo por qué esto es necesario, por lo que no lo hice.


Ahora cree el archivo /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 

A continuación, reinicie bind9 y configure la ejecución automática:


 systemctl restart bind9 systemctl enable bind9 

Tenga en cuenta que usé .home lugar de .local . Esto se hizo porque el dominio nondv.local se resolvió sin subdominios. Bueno, más exactamente dig reconoció normalmente, pero los navegadores y curl no. Como me explicó un colega, esto probablemente se deba a varios programas como Bonjour (mi computadora portátil de trabajo con una manzana en la tapa). En general, no debería haber tales problemas con el dominio .home .


Eso es todo, en realidad. Después de eso, agregué DNS como primario al enrutador y volví a conectarlo (para que el archivo /etc/resolve.conf se actualice automáticamente).


Nginx


Como dije, para poder acceder a todos los servicios al mismo tiempo a través de HTTP en el puerto 80, necesitamos configurar Nginx para que envíe solicitudes a diferentes puertos dependiendo del dominio.


La documentación para la imagen nginx está disponible en el sitio web de Docker Hub .


Prepare el archivo de configuración 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; #  ,       } include /etc/nginx/conf.d/*.conf; } 

A continuación, configure los dominios. Mostraré solo uno:


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

El contenedor se inicia con el comando:


 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 

Eso es todo, ahora las solicitudes HTTP al puerto 80 serán capturadas usando nginx y redirigidas al puerto deseado.


Gitlab


Todo es simple según la guía oficial :


 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 

Estamos esperando que todo se configure (buscamos en los docker logs -f gitlab ) y luego ingresamos al contenedor ( docker exec -it gitlab bash ) para obtener más información. ajustes:


 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 

Para mayor confiabilidad, puede reiniciar el contenedor ( docker container restart gitlab ).


Ci


Gitlab CI ya está integrado, pero necesita un Gitlab Runner ( documentación ).


Para hacer esto, escribí un pequeño 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 

Después de crear el corredor, debemos registrarlo. Para hacer esto, vaya a gitlab (a través del navegador), vaya al área de administración → Descripción general → Corredores. Describe la instalación de corredores. En resumen, simplemente haces:


 docker exec -it gitlab-runner register 

y responde las preguntas.


Tus propios servicios HTTP


Se lanzan por analogía con el gitlab. Publíquelos en algún puerto y agregue la configuración a nginx.


Conclusión


Ahora puede alojar sus proyectos en su servidor doméstico y usar el poder de Gitlab CI para automatizar el montaje y la publicación de sus proyectos. Es conveniente hacer git push y no preocuparse por comenzar, ¿verdad?


También recomendaría configurar el correo para gitlab. Personalmente, utilicé un buzón en Yandex. Documentación

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


All Articles