Chapters ▾ 2nd Edition

4.6 Git no Servidor - Smart HTTP

Smart HTTP

Agora temos acesso autenticado via SSH e acesso não autenticado via git://, mas também há um protocolo que pode fazer as duas coisas ao mesmo tempo. Configurar o Smart HTTP é basicamente habilitar um script CGI que é fornecido com o Git chamado git-http-backend no servidor. Este CGI lerá o caminho e os cabeçalhos enviados por um git fetch ou git push para uma URL HTTP e determinará se o cliente pode se comunicar por HTTP (o que é verdadeiro para qualquer cliente desde a versão 1.6.6). Se o CGI vir que o cliente é inteligente (smart), ele se comunicará inteligentemente com ele; caso contrário, recorrerá (fall back) ao comportamento burro (dumb behavior) (portanto, é retrocompatível para leituras com clientes mais antigos).

Vamos analisar uma configuração muito básica. Vamos configurar isso com o Apache como servidor CGI. Se você não tem o Apache configurado, você pode fazê-lo em uma máquina Linux com algo assim:

$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env

Isso também habilita os módulos mod_cgi, mod_alias e mod_env, que são todos necessários para que isso funcione corretamente.

Você também precisará definir o grupo de usuários Unix dos diretórios /srv/git para www-data para que o seu servidor web possa ter acesso de leitura e gravação aos repositórios, porque a instância do Apache executando o script CGI estará (por padrão) sendo executada como aquele usuário:

$ chgrp -R www-data /srv/git

Em seguida, precisamos adicionar algumas coisas à configuração do Apache para executar o git-http-backend como o manipulador (handler) de qualquer coisa que chegue ao caminho /git do seu servidor web.

SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

Se você omitir a variável de ambiente GIT_HTTP_EXPORT_ALL, o Git servirá aos clientes não autenticados apenas os repositórios com o arquivo git-daemon-export-ok neles, assim como o Git daemon fez.

Finalmente, você vai querer dizer ao Apache para permitir requisições ao git-http-backend e fazer com que as gravações sejam autenticadas de alguma forma, possivelmente com um bloco Auth como este:

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
    Require valid-user
</Files>

Isso exigirá que você crie um arquivo .htpasswd contendo as senhas de todos os usuários válidos. Aqui está um exemplo de adição de um usuário “schacon” ao arquivo:

$ htpasswd -c /srv/git/.htpasswd schacon

Há inúmeras maneiras de fazer o Apache autenticar usuários, você terá que escolher e implementar uma delas. Este é apenas o exemplo mais simples que pudemos imaginar. Você quase certamente também vai querer configurar isso com SSL para que todos esses dados sejam criptografados.

Não queremos nos aprofundar muito na toca do coelho (rabbit hole) dos detalhes da configuração do Apache, pois você pode muito bem estar usando um servidor diferente ou ter necessidades de autenticação diferentes. A ideia é que o Git vem com um CGI chamado git-http-backend que, quando invocado, fará toda a negociação para enviar e receber dados via HTTP. Ele não implementa nenhuma autenticação em si, mas isso pode ser facilmente controlado na camada do servidor web que o invoca. Você pode fazer isso com quase qualquer servidor web com capacidade para CGI, então escolha o que você conhece melhor.

Note

Para mais informações sobre a configuração de autenticação no Apache, confira a documentação do Apache aqui: https://httpd.apache.org/docs/current/howto/auth.html.