Um AUTO DEPLOY simples, prático e muito útil utilizando apenas GIT e PHP

Olá pessoal! Esse é meu primeiro artigo aqui e estou totalmente aberto a cíticas e sugestões.

Venho trazer um macete bem bacana para quem trabalha com desenvolvimento web e GIT (especificamente o GitHub). Trata-se de um auto deploy, ou seja, uma atualização no servidor, de forma simples e rápida.

Com ele, você consegue atualizar seu servidor apenas subindo uma atualização no git!

Você vai precisar apenas de um repositório do seu projeto no GitHub, um arquivo PHP responsável pela atualização do repositório e algumas configurações no servidor e no git.

Vamos lá!

Configuração

Primeiramente, você precisa configurar seu servidor web (hospedagem, vps...) para conseguir se conectar ao seu git.

  • Verificar se o git está instalado no servidor, caso negativo, instale-o. git --version

  • Criar a chave RSA para autenticação no GIT sudo -Hu www-data ssh-keygen

  • Lembrando:

    • estamos assumindo que: a pasta do servidor é /var/www/html e o usuário dono do diretório é o www-data
    • o usuário do apache é www-data
    • caso algum desses itens não se confirme, você pode adaptar o script de acordo com seu caso
  • configure sua chave, eu sempre deixo com os valores padrões, na pasta padrão /var/www/.ssh/.

GitHub

Vamos adicionar a chave criada ao seu Git. Esta chave vai permitir que o servidor (que contem a chave privada) possa se comunicar com o Git sem pedir usuário e senha.

  • Copie o valor da chave pública
    • sudo cat /var/www/.ssh/id_rsa.pub
  • Acesse https://github.com/settings/ssh
  • Clique no botão verde "New SSH key"
  • Cole sua chave, escolha um nome de fácil identificação (confia, se você gostar, vai ir adicionando 500 chaves e uma hora vai se perder)
  • Salve sua chave.

Arquivo de atualização (deploy.php)

Vamos criar o arquivo que será utilizado para fazer o deploy. Ele é um simples PHP, com alguns shell_exec. IMPORTANTE: Algumas hospedagens bloqueam por padrão o comando do PHP shell_exec. Geralmente é possível habilitar via cPanel ou por contato com o suporte da hospedagem.

O arquivo está disponível aqui

  • Suba esse arquivo no seu repositório

Finalização

Vamos para as últimas etapas de configuração.

  • No seu servidor, clone o repositório com o usuário www-data
    • sudo -Hu www-data git clone <clone with ssh: git@github.com:usuario/rep.git>
      • sudo -Hu é um comando para rodar outros comandos como outro usuário, nesse caso www-data (usuário do apache, altere caso necessário)
  • No seu repositório, acesse a configuração de Webhooks
    • https://github.com/usuario/git/settings/hooks
  • Adicione um novo webhook
    • Payload URL: URL do seu servidor para o arquivo deploy.php, exemplo: http://meusite.com/deploy.php
    • Content type: manter o application/x-www-form-urlencoded
    • Which events would you like to trigger this webhook?: o evento que vai ativar o hook, mantenha no padrão Just the push event.
    • Salve o WebHook.

Ready to go.

Algumas observações:

  • Seu projeto não precisa ser em PHP para utilizar este script. Você precisa do PHP instalado para este script, mas você pode utilizar em um projeto Node.js ou em alguma outra linguagem.
  • Algumas pessoas no repositório do criador do conteúdo sugerem algumas brechas de segurança, realmente elas existem, mas devemos sempre avaliar necessidade x riscos x trabalho. Nunca utilizei isso em projetos extremamente sigilosos (até por que nem tenho), nos meus projetos sempre utilizei e sempre me atendeu muito bem, por ser simples e bem efetivo. Para projetos do dia a dia, visando a praticidade e a agilidade, ele funciona bem.
    • Valem algumas práticas como colocar um nome de arquivo diferente, para ficar mais dificil encontrar o arquivo por pessoas maliciosas.
    • O próprio arquivo deploy.php tem um filtro por IP, inclusive isto pode lhe gerar um problema, já que alguns IPS do GitHub podem ter mudado.
      • Neste caso, sempre verifique os Logs na tela de webhooks do git. Caso o IP tenha sido bloqueado, você será informado através dele.

Espero que ajude alguém, qualquer dúvida e/ou sugestão estou a disposição! Abraços!

o document root do seu apache é /var/www e a chave está publicada em /var/www/.ssh/?

se for assim e dependendo de como estão as suas configurações do apache para listar arquivos, é possivel que de pra acessar as chaves através de http://meusite.com/.ssh/

bem observado, o root fica na `/var/www/html`. faltou adicionar esse diretório na raiz. Obrigado
boa! outra coisa, pra rodar `git pull` no servidor não é mais interessante rodar direto pelo github actions? ai não precisa nem instalar php no servidor só por conta do deploy (caso vc use node por ex)
é uma opção bem mais robusta, realmente. Mas visando a simplicidade, acho que o script se torna mais viavel. Pra ser sincero, nunca coloquei em prática o GH Actions, pode ser que ele seja tão simples quanto o script (ou até mais), portanto não vou bater o martelo rs. Mas o script eu já coloco em todos os projetos, o unico trabalho é configurar a webhook, já que a chave já está configurada na minha conta, salvo quando subo em algum outro servidor onde ainda não configurei, mas ainda assim é só um comando a mais.
sim sim, pelo GH Actions é sussa, tão simples quanto incluir esse step ``` steps: - name: Remote Deploy to Production uses: appleboy/ssh-action@master with: username: ${{ secrets.USERNAME }} host: ${{ secrets.HOST }} key: ${{ secrets.SSH_KEY }} script: "cd /var/www/html; git pull " ```
boaa, obrigado por compartilhar!