"Smart HTTP transport" für Git mit Redmine 2.1
In einem früheren Artikel habe ich über die Installation von Redmine auf einem Server mit Ubuntu 10.04, Apache und Passenger geschrieben – dort wurde außerdem die Zugriffskontrolle auf Git-Repositories eingerichtet.
Die dort verwendete Methode des Zugriffs auf die Git-Repositories via HTTP ist allerdings wenig intelligent: denn hier greifen Clients einfach per WebDAV auf das Repository zu und übertragen Daten relativ uneffizient. Um die Kommunikation via HTTP zu verbessern, gibt es seit einigen Jahren die “Smart HTTP”-Unterstützung in Git, die – um es kurz zu machen – mit Hilfe eines CGI-Backends für eine deutlich effizientere Übertragung sorgt.
Seit der Version 2.1.x unterstützt auch Redmine.pm, das Authentifizierungs-Modul von Redmine für Apache, die Authentifizierung von Requests über “Smart HTTP”, da diese nicht mehr per WebDAV, sondern nur noch mittels GET und POST funktionieren und Lese- und Schreibzugriffe anderweitig erkannt werden müssen.
Seit Git 1.7 ist das git-http-backend verfügbar – also auch unter Ubuntu 10.04. Es muss nur das Paket git-core
installiert sein.
sudo apt-get install git-core
Ich gehe davon aus, dass Redmine grundsätzlich installiert ist, die Ordnerstruktur für die Repositories angelegt ist, die notwendigen Apache-Module aktiviert sind und das Redmine-Perl-Modul nach /usr/lib/perl5/Apache/Redmine.pm verlinkt ist. Diese Schritte können ansonsten in meinem früheren Artikel nachvollzogen werden.
Unterschiedlich ist eigentlich nur die Konfiguration des Apache-vHosts. Neben dem aus der Standard-Variante bekannten
PerlLoadModule Apache::Redmine
zum Laden des Authentifizierungs-Moduls müssen für das git-http-backend allerdings noch einige Umgebungsvariablen sowie ein Alias auf das Backend selbst gesetzt werden:
SetEnv GIT_PROJECT_ROOT /var/www/code.example.lit/git/
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
Achtung: der erste Pfad in der ScriptAlias-Direktive ist das Unterverzeichnis, in dem die Git-Repositories liegen – und der zweite Pfad ist der zum git-http-backend unter Ubuntu. Dieser letzte Pfad weicht ggf. auf anderen Systemen ab.
Die übrige Konfiguration stimmt im Wesentlichen mit der aus dem vorhergehenden Beitrag überein, sehr wichtig ist allerdings noch die Einstellung
RedmineGitSmartHttp yes
damit die Redmine-Authentifizierung den Smart-HTTP-Modus aktiviert.
Hier ist eine vollständige Beispielkonfiguration:
<virtualhost *:443>
ServerName code.example.lit
ServerAdmin webmaster@localhost
DocumentRoot /var/www/code.example.lit/code
PerlLoadModule Apache::Redmine
SetEnv GIT_PROJECT_ROOT /var/www/code.example.lit/git/
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
<directory /usr/lib/git-core/>
<files "git-http-backend">
Options +ExecCGI
</files>
< /directory>
<location /git>
Order allow,deny
Allow from all
AuthType Basic
AuthName "Git"
Require valid-user
AuthUserFile /dev/null
Options +Indexes -ExecCGI -Includes
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
RedmineDSN "DBI:mysql:database=redmine;host=localhost"
RedmineDbUser "redmine"
RedmineDbPass "pass"
RedmineGitSmartHttp yes
</location>
</virtualhost>
Damit sollten zukünftige Git-Pulls oder Pushes performanter erfolgen – zumindest wenn der Git-Client nicht älter als Version 1.7 ist!
Weitere Links:
- Redmine-Ticket für die “Smart HTTP”-Unterstützung in der Redmine.pm
- Dokumentation zu Smart HTTP mit Redmine im Kopf der Redmine.pm
- Manpage zum git-http-backend
- Ausführlicher Artikel zum Git Smart HTTP transport