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 é owww-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
- estamos assumindo que: a pasta do servidor é
-
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 casowww-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/