Introdução
Como não consegui encontrar um nome adequado para o post, descreverei brevemente o que será discutido.
A maioria de nós tem alguns pequenos objetos pessoais que não vão além dos limites de nossas casas. Alguém os hospeda em um computador em funcionamento, alguém no Heroku, alguém no VPS e alguém tem um servidor doméstico. Existe até uma comunidade r / homelab no reddit , na qual as pessoas discutem diferentes partes de hardware e software para os chamados. laboratório em casa .
Não estou tão interessado nessa questão, mas tenho uma Intel NUC em minha casa, que reproduz músicas de um NAS usando MPD . Além do MPD, meus pequenos trabalhos estão mudando, o que me ajuda a trabalhar com ele: agora um bot morto para telegrama, API HTTP no sinatra e uma interface desajeitada.
Em uma postagem, descreverei sem detalhes especiais (muitos dos quais eu não entendo) o processo de instalação de um servidor DNS para trabalhar com nomes de domínio de serviços, o esquema de operação simultânea de vários serviços usando o Docker e a instalação do Gitlab com o CI. Você não aprende nada de novo, mas de repente este "guia" é útil para alguém. Além disso, eu gostaria de ouvir sugestões sobre como torná-lo mais fácil / mais elegante / mais correto.
Inicialmente, o código dos meus serviços estava em um bitbucket / github e, depois de criar as imagens do docker, tive que passar pelo SSH e executar alguns scripts que criavam / atualizavam contêineres com serviços. Eu me peguei pensando que vejo um pequeno bug irritante no aplicativo, que não corrigo apenas porque tenho preguiça de executar todo esse procedimento. Obviamente, era hora de automatizar tudo. Foi então que surgiu a idéia de instalar o Gitlab + CI.
Domínios locais usando DNS
Todos os contêineres foram criados com o --network=host
para simplificar - bastava usar portas diferentes nos aplicativos. No entanto, com o aumento do número de serviços, lembre-se de qual aplicativo qual porta usa. Sim, e inserir o endereço IP com a porta no navegador sempre não é muito bom; portanto, antes de instalar o gitlab, decidi lidar com a hospedagem de vários aplicativos no mesmo servidor.
A idéia é simples: configuramos o DNS, alimentamos o roteador, instalamos o Nginx e usamos sua configuração para redirecionar solicitações para diferentes portas, dependendo do domínio. Isso permitirá que você não se preocupe com as portas durante o desenvolvimento, como Os contêineres começarão a usar --publish
vez de --network=host
.
Durante a instalação, este guia foi usado . Nele, a configuração é feita para o Ubuntu 16.04, tenho o Debian.
Ações adicionais são executadas como root
.
Primeiro de tudo, instale o bind9
e os utilitários:
apt-get install -y bind9 bind9utils bind9-doc dnsutils
Em seguida, precisamos configurar a zona do domínio. Para fazer isso, adicione o seguinte ao arquivo /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. };
Além disso, a configuração da pesquisa inversa é adicionada ao guia, mas, para ser sincero, eu realmente não entendo por que isso é necessário, então não o fiz.
Agora crie o arquivo /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
Em seguida, reinicie o bind9 e defina a execução automática:
systemctl restart bind9 systemctl enable bind9
Observe que eu usei .home
vez de .local
. Isso foi feito porque o domínio nondv.local
foi resolvido sem subdomínios. Bem, a dig
com mais precisão o reconheceu normalmente, mas os navegadores e os curl
não. Como um colega me explicou, isso provavelmente ocorre devido a vários softwares como Bonjour (meu laptop de trabalho com uma maçã na tampa). Em geral, não deve haver problemas com o domínio .home
.
Isso é tudo, na verdade. Depois disso, adicionei o DNS como primário ao roteador e reconecte-o (para que o arquivo /etc/resolve.conf
seja atualizado automaticamente).
Nginx
Como eu disse, para poder acessar todos os serviços ao mesmo tempo via HTTP na porta 80, precisamos configurar o Nginx para que ele proxies solicitações para portas diferentes, dependendo do domínio.
A documentação para a imagem nginx está disponível no site do Docker Hub .
Prepare o arquivo de configuração 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;
Em seguida, configure os domínios. Vou mostrar apenas um:
# /srv/nginx/conf.d/gitlab.conf server { listen 80; server_name gitlab.nondv.home; location / { proxy_pass http://127.0.0.1:3080; } }
O contêiner é iniciado pelo 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
Isso é tudo, agora as solicitações HTTP para a porta 80 serão capturadas usando o nginx e redirecionadas para a porta desejada.
Gitlab
Tudo é simples, de acordo com o guia 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 aguardando que tudo esteja configurado (procuramos nos docker logs -f gitlab
) e depois entramos no contêiner ( docker exec -it gitlab bash
) para obter mais. configurações:
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 confiabilidade, você pode reiniciar o contêiner ( docker container restart gitlab
).
Ci
O IC do Gitlab já está integrado, mas precisa de um Gitlab Runner ( documentação ).
Para fazer isso, escrevi um pequeno 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
Depois de criar o corredor, precisamos registrá-lo. Para fazer isso, vá para o gitlab (através do navegador), vá para a área Admin → Visão geral → Corredores. Descreve a instalação dos corredores. Em resumo, você simplesmente faz:
docker exec -it gitlab-runner register
e responda as perguntas.
Seus próprios serviços HTTP
Eles são lançados por analogia com o gitlab. Publique-os em alguma porta e adicione a configuração ao nginx.
Conclusão
Agora você pode hospedar seus projetos em seu servidor doméstico e usar o poder do Gitlab CI para automatizar a montagem e publicação de seus projetos. É conveniente fazer git push
e não se preocupar em começar, certo?
Eu também recomendaria configurar o correio para o gitlab. Pessoalmente, usei uma caixa de correio no Yandex. Documentação