Chapters ▾ 2nd Edition

4.6 Git på servern - Smart HTTP

Smart HTTP

Nu har vi autentiserad åtkomst via SSH och icke-autentiserad åtkomst via git://, men det finns också ett protokoll som kan göra båda samtidigt. Att sätta upp Smart HTTP handlar i praktiken om att aktivera CGI-skriptet git-http-backend som följer med Git. CGI:t läser sökväg och huvudrader som skickas av git fetch eller git push till en HTTP-URL och avgör om klienten kan prata HTTP (vilket alla klienter kan sedan 1.6.6). Om CGI:t ser att klienten är smart kommunicerar den smart, annars faller den tillbaka till det dumma läget (så att äldre klienter fortfarande kan läsa).

Låt oss gå igenom en enkel uppsättning. Vi använder Apache som CGI-server. Om du inte har Apache kan du installera det på en Linuxmaskin med något i stil med:

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

Detta aktiverar även modulerna mod_cgi, mod_alias och mod_env, som behövs för att allt ska fungera.

Du behöver också sätta Unix-gruppen för katalogerna under /srv/git till www-data så att webbservern kan läsa och skriva i kodförråden, eftersom Apache-instansen som kör CGI:t normalt kör som den användaren:

$ chgrp -R www-data /srv/git

Sedan behöver du lägga till några rader i Apaches konfiguration så att git-http-backend hanterar allt som kommer in under /git:

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

Om du utelämnar miljövariabeln GIT_HTTP_EXPORT_ALL kommer Git bara att servera kodförråd som har filen git-daemon-export-ok, precis som Git‑demonen gör.

Till sist behöver du tala om för Apache att tillåta anrop till git-http-backend och att skrivningar ska kräva autentisering, till exempel med ett Auth-block som detta:

<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>

Detta kräver att du skapar en .htpasswd-fil med lösenord för alla giltiga användare. Här är ett exempel där användaren "schacon" läggs till:

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

Apache har många sätt att autentisera användare, så du får välja och implementera det som passar. Det här är bara det enklaste exemplet. Du kommer också nästan säkert vilja köra allt över SSL så att data krypteras.

Vi går inte djupare i Apachekonfiguration, eftersom du kan använda en annan server eller ha andra autentiseringsbehov. Poängen är att Git levererar CGI:t git-http-backend, som när det anropas sköter hela förhandlingen för att skicka och ta emot data över HTTP. Det implementerar inte autentisering i sig, men det styrs enkelt i webbserverlagret som anropar det. Det fungerar med nästan vilken CGI-kapabel webserver som helst, så använd den du är mest bekväm med.

Notera

För mer information om autentisering i Apache, se dokumentationen: https://httpd.apache.org/docs/current/howto/auth.html.