Uma vez pensei em automatizar a implantação do meu projeto. O gitlab.com fornece todas as ferramentas para isso, e é claro que eu decidi usá-lo classificando e escrevendo um pequeno script de implantação. Neste artigo, compartilho minha experiência com a comunidade.
TL; DR
- Configurar o VPS: desabilite o root, faça login com senha, instale o dockerd, configure o ufw
- Gere certificados para o servidor e cliente docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Habilite o controle dockerd via soquete tcp: remova a opção -H fd: / / da configuração do docker.
- Registrar caminhos de certificado no docker.json
- Registre-se nas variáveis do gitlab nas configurações de CI / CD com o conteúdo do certificado. Escreva um script .gitlab-ci.yml para a implantação.
Vou mostrar todos os exemplos no kit de distribuição Debian.
Configuração inicial do VPS
Então, como você comprou uma instância, por exemplo, no
DO , a primeira coisa a fazer é proteger seu servidor do mundo externo agressivo. Não vou provar e reivindicar nada, apenas mostro o log / var / log / messages do meu servidor virtual:
Primeiro, instale o firewall ufw:
apt-get update && apt-get install ufw
Ative a política padrão: bloqueie todas as conexões de entrada, permita todas as conexões de saída:
ufw default deny incoming ufw default allow outgoing
Importante: não esqueça de permitir a conexão ssh:
ufw allow OpenSSH
A sintaxe geral é: Permitir uma conexão de porta: ufw allow 12345, em que 12345 é o número da porta ou o nome do serviço. Negar: ufw negar 12345
Ligue o firewall:
ufw enable
Saímos da sessão e efetuamos login novamente via ssh.
Adicione o usuário, atribua uma senha a ele e adicione-o ao grupo sudo.
apt-get install sudo adduser scoty usermod -aG sudo scoty
Em seguida, de acordo com o plano, você deve desativar a entrada de senha. Para fazer isso, copie sua chave ssh para o servidor:
ssh-copy-id root@10.101.10.28
O ip do servidor deve ser especificado. Tente agora fazer login com o usuário criado anteriormente, não é mais necessário digitar uma senha. Em seguida, nas definições de configuração, altere o seguinte:
sudo nano /etc/ssh/sshd_config
desativar entrada de senha:
PasswordAuthentication no
Reinicie o daemon sshd:
sudo systemctl reload sshd
Agora, se você ou outra pessoa tentar fazer login como root, não funcionará.
Em seguida, defina o dockerd, aqui não descreverei o processo, pois tudo já pode ser alterado, siga o link para o site oficial e siga as etapas para instalar o docker em sua máquina virtual:
https://docs.docker.com/install/linux/docker- ce / debian /Geração de certificado
Para gerenciar o daemon do docker remotamente, é necessária uma conexão TLS criptografada. Para fazer isso, você deve ter um certificado e uma chave, que devem ser gerados e transferidos para sua máquina remota. Siga as etapas fornecidas nas instruções no site oficial do docker:
https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Todos gerados * .pem arquivos para o servidor, ou seja, ca.pem, server.pem, key.pem devem ser colocados no diretório / etc / docker no servidor.
Configuração do Dockerd
No script para iniciar o daemon do docker, remova a opção -H df: //, essa opção responde qual host pode controlar o daemon do docker.
# At /lib/systemd/system/docker.service [Service] Type=notify ExecStart=/usr/bin/dockerd
Em seguida, crie um arquivo de configurações, se ainda não estiver lá, e prescreva as opções:
/etc/docker/daemon.json { "hosts": [ "unix:///var/run/docker.sock", "tcp://0.0.0.0:2376" ], "labels": [ "is-our-remote-engine=true" ], "tls": true, "tlscacert": "/etc/docker/ca.pem", "tlscert": "/etc/docker/server.pem", "tlskey": "/etc/docker/key.pem", "tlsverify": true }
Vamos ativar as conexões na porta 2376:
sudo ufw allow 2376
Reinicie o dockerd com as novas configurações:
sudo systemctl daemon-reload && sudo systemctl restart docker
Verifique:
sudo systemctl status docker
Se tudo estiver verde, acreditamos que configuramos com êxito a janela de encaixe no servidor.
Configurando a entrega contínua no gitlab
Para que o trabalhador do gitalab possa executar comandos no host remoto do docker, é necessário determinar como e onde armazenar certificados e a chave para uma conexão criptografada com o dockerd. Eu resolvi esse problema simplesmente escrevendo-o em variáveis nas configurações do gitlbab:
Simplesmente exiba o conteúdo dos certificados e da chave via cat:
cat ca.pem
. Copie e cole no valor das variáveis.
Vamos escrever o script para a implantação através do gitlab. A imagem docker-in-docker (dind) será usada.
.gitlab-ci.yml image: name: docker/compose:1.23.2 # entrypoint , dind entrypoint: ["/bin/sh", "-c"] variables: DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 services: - docker:dind stages: - deploy deploy: stage: deploy script: - bin/deploy.sh #
O conteúdo do script de implantação com comentários:
bin / deploy.sh #!/usr/bin/env sh # , - set -e # , , set -v # DOCKER_COMPOSE_FILE=docker-compose.yml # DEPLOY_HOST=185.241.52.28 # , - gitlab- DOCKER_CERT_PATH=/root/.docker # , docker info docker-compose version # ( - gitlab') mkdir $DOCKER_CERT_PATH # , . echo "$CA_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/ca.pem echo "$CERT_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/cert.pem echo "$KEY_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/key.pem # chmod 400 $DOCKER_CERT_PATH/ca.pem chmod 400 $DOCKER_CERT_PATH/cert.pem chmod 400 $DOCKER_CERT_PATH/key.pem # docker-. , export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://$DEPLOY_HOST:2376 # , docker-compose \ -f $DOCKER_COMPOSE_FILE \ ps # docker-, "" docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker-compose \ -f $DOCKER_COMPOSE_FILE \ pull app # docker-compose \ -f $DOCKER_COMPOSE_FILE \ up -d app
O principal problema era “extrair” o conteúdo dos certificados na forma normal das variáveis CI / CD do gitlab. Não consegui entender por que a conexão com o host remoto não funcionou. No host, observei o log do docker do sudo journalctl -u, há um erro de handshake. Eu decidi olhar o que geralmente é armazenado nas variáveis, para isso você pode ver o gato -A $ DOCKER_CERT_PATH / key.pem. O erro foi solucionado adicionando a remoção do símbolo do carro tr -d '\ r'.
Além disso, no script, você pode adicionar tarefas pós-lançamento a seu critério. Você pode ver a versão de trabalho no meu repositório
https://gitlab.com/isqad/gitlab-ci-cd