Saltar para o conteúdo

GitLab CI: Automatizando Deploy via SSH com Scripts no Servidor

julho 4, 2025

Como criar uma job para se conectar com seu servidor e automatizar processos na hora do Deploy.

Recentemente, precisei configurar um processo de deploy automatizado para um projeto na empresa onde trabalho. A ideia era simples: Ao fazer push na branch main, o GitLab CI deverá acessar o servidor via SSH e atualizar a aplicação, tudo isso com menos intervenção manual possível. Neste artigo, vou mostrar como criei uma prova de conceito(POC) para essa abordagem.

Configuração no Servidor

Nesse caso criei um servidor pela Digital Ocean, mas outros CSP como AWS e Azure servem. Para os próximos passos, vamos considerar que o servidor já tenha sido provisionado.

1. Configurando chaves de acesso remoto

Vamos criar um par de chaves para nos conectarmos à instância via SSH de forma segura com o comando:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa

landscape
Criação de chaves pública / privada

Nossas chaves pública e privada foram criadas com sucesso, podendo ver elas com o comando:

ls -a ~/.ssh/

landscape
Visualizando arquivos do diretório .ssh/

2. Convertendo a chave privada

Ao final do passo anterior, nossas chaves foram geradas, mas precisamos converter o formato da chave privada de OpenSSH para seu formato mais antigo(PEM), pois atualmente o Gitlab não aceita chaves em seus novos formatos. Use o comando abaixo para fazer a conversão.

ssh-keygen -p -m PEM -f ~/.ssh/id_rsa

3. Copiando chave pública no authorized_keys

Para que possamos nos conectar usando as chaves, precisamos adicionar a chave pública no arquivo de chaves autorizadas (authorized_keys), localizado na pasta .ssh/ do usuário. Primeiro, exiba o valor da chave no terminal com a e depois a copie.

cat ~/.ssh/id_rsa.pub

landscape
Exibindo no terminal o conteúdo da chave id_rsa.pub

Após ter copiado, acesse (ou crie caso não exista) o arquivo authorized_keys com o comando sudo nano ~/.ssh/authorized_keys, cole o conteúdo da chave nele e salve o arquivo com Ctrl + X seguido de y e Enter.

Important

Após essas configurações, você já deverá conseguir se conectar ao servidor via SSH sem a necessidade de digitar senhas — apenas utilizando a chave privada como argumento. Caso enfrente algum problema, talvez seja necessário ajustar algumas diretivas no arquivo /etc/ssh/sshd_config. Não entrarei em detalhes aqui para não fugir do foco, mas uma consulta rápida a um agente de IA pode te ajudar com isso.

4. Anotando valores

Precisamos anotar 3 coisas estando no servidor para usarmos dentro Gitlab, sendo elas: A chave privada, o ip público o servidor (123.456.12 por exemplo) e o usuário (no nosso caso o root). Para ver sua chave privada, use o comando:

cat ~/.ssh/id_rsa

landscape
Final de uma chave privada no formato antigo (PEM)

5. Criar chaves para acessar projeto no gitlab

Você precisa fazer esse passo apenas se seu projeto for privado, assim o servidor poderá se conectar à ele e buscar as mudanças. Caso não seja, pode pular essa etapa.

ssh-keygen -t rsa -b 4096 -C "deploy@servidor" -f ~/.ssh/gitlab

landscape
Criação de chaves pública / privada

Após criar as chaves, não precisamos alterar o formato da chave privada, apenas copiar a chave pública. Use o comando para exibir o conteúdo da chave, logo em seguida a copie:

cat ~/.ssh/gitlab.pub

Configurando o projeto no GitLab

Agora, vamos precisar de um projeto no gitlab para que a partir dele o Deploy aconteça. Caso você ainda não tenha, crie um antes de começarmos.

1. Importando arquivos base do projeto

Eu criei um projeto base no Gitlab, onde a partir dele você possa seguir esse tutorial. Clique aqui para ver o projeto. Copie 2 arquivos do projeto, o index.html e o .gitlab-ci.yml, com isso já podemos trabalhar.

2. Configurando projeto no Gitlab

Agora, precisamos configurar 2 coisas: As variáveis que nossa pipeline utilizará para se conectar ao servidor; Um token de acesso para o servidor conseguir acessar o repositório (apenas se o seu projeto for privado).

Acesse settings > CI/CD e selecioe Variables:

landscape
Acessando a área de CI/CD do projeto no Gitlab

Adicione essas 3 variáveis, usando como valor aqueles itens que copiamos do servidor (ip do servidor, nome do usuário e chave privada).

landscape
Tela de variables do projeto no Gitlab

3. Adicionando Deploy Keys

Important

Você precisará fazer esse passo apenas se seu projeto for privado.

Acesse settings > Repository > Deploy Keys:

landscape
Menu Repository no repositório do Gitlab

Agora, vamos precisar da chave públilca que criamos no 5º passo. Se você a copiou, cole em Key.

landscape
Adicionando Deploy key ao projeto

Se seu servidor precisar subir mudanças no repositório, habilite a opção “Grant write permissions to this key” e adicione a chave.

Finalizando o lado do servidor

Agora que já criamos o nosso projeto no gitlab e configuramos eles, vamos voltar ao servidor e configurar o repositório.

1. Testando conexão com gitlab

Rode o comando abaixo:

ssh -T git@gitlab.com

landscape
Verificando conexão com Gitlab

2. Puxando projeto pela primeira vez

Agora, fazer o clone do projeto para o servidor, assim das próximas vezes, a pipeline ‘encontrará’ o diretório no servidor, e o fluxo de deploy acontecerá corretamente.

Important

No exemplo que trouxe, o .gitlab-ci.yml espera que o diretório do projeto no servidor esteja no seguinte caminho: /var/www/gitlab-ci-connect-server, pois para testar de forma rápida, eu configurei o nginx no servidor e configurei o mesmo para ‘fornecer’ meu projeto. Não trouxe essa configuração para não sairmos do foco, o importante é fazer o clone do projeto dentro do servidor no mesmo caminho que a pipeline espera, caso contrário ela não encontrará o .git e não vai funcionar.

No meu caso, o comando foi (dentro da pasta /var/www/):

git clone git@gitlab.com:ViniciusCassemira/gitlab-ci-connect-server.git

Depois desse tutorial, basta executar sua pipeline dentro do Gitlab, que ela deverá conseguir se conectar ao servidor e atualizar o código local do mesmo. Trouxe um exemplo bem simples, mas essa lógica pode ser aplicada a projetos reais e complexos, o que facilita algumas etapas na hora do Deploy de sua aplicação.

Gostou do conteúdo? Posso melhorar esse tutorial? Entrem e contato comigo, vamos conversar! Essa foi minha vez escrevendo esse tipo de conteúdo e espero trazer mais tópicos como esse :)

Última modificação