New in the Journal

Archive of all articles

From my feed reader

Microblog

Journal

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

comments powered by Disqus