Um dia, eu pensei sobre a automação do deploy do meu projeto. O gitlab.com gentilmente fornece todas as ferramentas necessárias para isso, e eu decidi aproveitar, analisando e escrevendo um pequeno script de deploy. Neste artigo, compartilho minha experiência com a comunidade.
TL;DR
- Configurar VPS: desabilitar root, login por senha, instalar dockerd, configurar ufw
- Gerar certificados para o servidor e o cliente Habilitar o gerenciamento do dockerd através de socket tcp: remover a opção -H fd:// da configuração do docker.
- Прописать пути до сертификатов в docker.json
- Inserir nas variáveis do gitlab nas configurações de CI/CD o conteúdo dos certificados. Escrever um script .gitlab-ci.yml para o deploy.
Todos os exemplos que apresentarei serão feitos na distribuição Debian.
Configuração inicial do VPS
Você comprou uma instância, por exemplo, na , a primeira coisa que precisa ser feita é proteger seu servidor do agressivo mundo exterior. Não pretendo provar ou afirmar nada, apenas mostrarei o log /var/log/messages do meu servidor virtual:
Captura de tela
Primeiro, vamos instalar o firewall ufw:
apt-get update && apt-get install ufwVamos habilitar a política padrão: bloquear todas as conexões de entrada, permitir todas as conexões de saída:
ufw default deny incoming
ufw default allow outgoingImportante: não se esqueça de permitir a conexão via ssh:
ufw allow OpenSSHA sintaxe geral é a seguinte: Permitir conexão por porta: ufw allow 12345, onde 12345 é o número da porta ou o nome do serviço. Negar: ufw deny 12345
Ativamos o firewall:
ufw enableSaia da sessão e faça login novamente via ssh.
Adicione um usuário, defina uma senha e adicione-o ao grupo sudo.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyEm seguida, devemos desabilitar o login por senha. Para isso, copie sua chave ssh para o servidor:
ssh-copy-id root@10.101.10.28O IP do servidor deve ser o seu. Tente agora fazer login com o usuário criado anteriormente; não é mais necessário inserir a senha. Em seguida, nas configurações de configuração, alteramos o seguinte:
sudo nano /etc/ssh/sshd_configdesabilitamos o login por senha:
PasswordAuthentication noReiniciamos o daemon sshd:
sudo systemctl reload sshdAgora, se você ou alguém tentar entrar como usuário root, não conseguirá.
Em seguida, instalamos dockerd; não descreverei este processo, pois pode já ter mudado. Consulte o link do site oficial e siga as etapas para instalar o docker na sua VM:
Geração de certificados
Para gerenciar o daemon do Docker remotamente, é necessária uma conexão TLS criptografada. Para isso, você precisará de um certificado e uma chave, que devem ser gerados e transferidos para sua máquina remota. Siga os passos fornecidos nas instruções no site oficial do Docker: Todos os arquivos *.pem gerados para o servidor, a saber, ca.pem, server.pem, key.pem, devem ser colocados no diretório /etc/docker no servidor.
Configuração do dockerd
No script de inicialização do daemon do Docker, removemos a opção -H df://, essa opção especifica em qual host pode-se gerenciar o daemon do Docker.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdEm seguida, crie um arquivo de configuração, se ainda não existir, e defina as opções:
/etc/docker/docker.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
}Permitindo conexões na porta 2376:
sudo ufw allow 2376Reiniciaremos o dockerd com as novas configurações:
sudo systemctl daemon-reload && sudo systemctl restart dockerVerificaremos:
sudo systemctl status dockerSe tudo estiver "verde", consideramos que configuramos o Docker com sucesso no servidor.
Configuração de entrega contínua no GitLab
Para que o worker do GitLab possa executar comandos no host remoto do Docker, é necessário decidir como e onde armazenar os certificados e a chave para a conexão criptografada com o dockerd. Resolvi esse problema simplesmente definindo as variáveis nas configurações do GitLab:
Título do spoiler
Basta exibir o conteúdo dos certificados e chave através do cat: cat ca.pem. Copie e cole no valor das variáveis.
Vamos escrever um script para o deployment via GitLab. O Docker-in-Docker (dind) será utilizado.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# reescreveremos o entrypoint para funcionar no 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 # script de deployment aqui
O conteúdo do script de deployment 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 foi "extrair" das variáveis do GitLab CI/CD o conteúdo dos certificados em um formato adequado. Eu não conseguia entender por que a conexão com o host remoto não funcionava. No host, consultei o log sudo journalctl -u docker, havia um erro durante o handshake. Decidi ver o que realmente estava armazenado nas variáveis, para isso pode-se observar assim cat -A $DOCKER_CERT_PATH/key.pem. Resolvi o erro, adicionando a remoção do caractere de retorno tr -d ‘r’.
A seguir, você pode adicionar tarefas pós-lançamento ao seu critério. Você pode conferir a versão de trabalho no meu repositório.
Fonte: habr.com
