Git
Chapters ▾ 2nd Edition

4.6 Git na serveru - Chytrý HTTP

Chytrý HTTP

K dispozici už máme autentizovaný přístup přes SSH a neautentizovaný přístup přes git://. Ale existuje i protokol, který umí obojí najednou. Zřízení chytrého HTTP v podstatě spočívá jen v povolení CGI skriptu, který se dodává s Gitem a na serveru se nachází pod jménem git-http-backend. Tento CGI skript čte cestu a hlavičky zaslané pro dané HTTP URL příkazy git fetch nebo git push a zjistí, zda může klient komunikovat přes HTTP (což platí pro každého klienta od verze 1.6.6). Pokud CGI skript zjistí, že se jedná o chytrého klienta, bude s ním komunikovat chytrým způsobem. V opačném případě se uchýlí k hloupému chování (takže je vůči starším klientům zpětně kompatibilní pro čtení).

Projděme si nejzákladnější nastavení. Jako CGI server použijeme Apache. Pokud nemáte zprovozněn Apache, můžete jej na linuxovém počítači nainstalovat třeba takto:

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

Povolí se tím také moduly mod_cgi, mod_alias, mod_env a mod_rewrite, které jsou pro správnou činnost nutné.

Pro adresář /opt/git také budete muset nastavit unixovou uživatelskou skupinu na www-data, aby váš webový server získal přístup do repozitářů pro čtení i pro zápis. Instance Apache, která CGI skript spouští, totiž (standardně) běží pod tímto uživatelem:

$ chgrp -R www-data /opt/git

Dále potřebujeme do konfigurace Apache přidat další věci, aby se skript git-http-backend spouštěl pro obsluhu všeho, co na vašem webovém serveru prochází cestou /git.

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

Pokud vynecháte proměnnou prostředí GIT_HTTP_EXPORT_ALL, pak bude Git obsluhovat neautentizované klienty jen pro ty repozitáře, které v sobě mají soubor git-daemon-export-ok — právě tak, jak to dělá gitový démon.

Nakonec budete muset serveru Apache říct, aby povolil požadavky na skript git-http-backend a aby nějak zajistil autentizaci při zápisu — například podobným Auth blokem:

RewriteEngine On
RewriteCond %{QUERY_STRING} service=git-receive-pack [OR]
RewriteCond %{REQUEST_URI} /git-receive-pack$
RewriteRule ^/git/ - [E=AUTHREQUIRED]

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /opt/git/.htpasswd
    Require valid-user
    Order deny,allow
    Deny from env=AUTHREQUIRED
    Satisfy any
</Files>

Pro tento účel budete muset vytvořit soubor .htpasswd, který bude obsahovat hesla všech oprávněných uživatelů. Následující příklad do souboru přidává uživatele „schacon“:

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

Existují spousty způsobů, jak může Apache autentizovat uživatele. Jeden z nich si budete muset vybrat a použít. Tohle je jen nejjednodušší příklad, který se dá použít. Téměř jistě budete chtít zprovoznit komunikaci přes SSL, aby byla všechna data šifrovaná.

Nechceme zacházet do přílišných detailů konfigurace Apache, protože možná používáte jiný server, nebo máte jiné požadavky na autentizaci. Základní myšlenka je taková, že se Git dodává s CGI skriptem git-http-backend, který při aktivaci zajistí veškeré dohadování při odesílání a přijímání dat přes HTTP. Sám o sobě neprovádí žádnou autentizaci, ale to lze snadno zvládnout na úrovni webového serveru, který ho spouští. Lze toho dosáhnout s téměř každým webovým serverem, který podporuje CGI, takže použijte ten, který znáte nejlépe.

Note

Další informace o konfiguraci autentizace pro Apache naleznete v jeho dokumentaci na stránce http://httpd.apache.org/docs/current/howto/auth.html