mecker. mecker. mecker.

Grack + Redmine Auth = Git Smart HTTP++

So, nach gut zwei Wochen weiterem Probieren und Failen habe ich nun auch eine richtige Au­then­ti­fi­zie­rung für non-Apache Webserver mittels Redmine. Ich nutze hierbei das neue Smart HTTP Transport Protokoll, das seit Git 1.6.6 un­ter­stützt wird. Über SSL getunnelt ist es fast so sicher und genauso schnell wie die Über­tra­gung über SSH oder Git-Daemon. Nur halt mittels plain HTTP, Webserver und etwas mod_proxy.

Weil schon die In­stal­la­ti­on abseits von Apache/Nginx eine Qual wegen nicht vor­han­de­ner Do­ku­men­ta­ti­on war, will ich auch hier wieder do­ku­men­tie­ren, indem ich mein Setup als Beispiel angebe. Wie immer nutze ich lighttpd und eine Redmine-In­stal­la­ti­on Version 1.2.1, betrieben mit thin. Weil Hype cool ist, existieren Wrapper für git-http natürlich nur in nodejs und ruby. Argh. Naja, hab’ ich schon Ruby am Hals, nehm ich halt den letzteren. Mein Code baut auf maxlapshin/grack auf, das ist ein un­ge­merg­ter Fork eines un­ge­merg­ten Fork von schacon/grack x(

Schema

Mein an­ge­streb­tes URL-Layout sieht wie folgt aus:

/redmine                <- meine Redmine-Installation, HTTPS-getunnelt
/git/myproject.git      <- das Repository

Meine Ord­ner­struk­tur ist so aufgebaut:

~/posativ.org/redmine/  <- die Redmine-Installation
~/posativ.org/grack/    <- dort liegt grack später™
~/repositories/git/myproject <- das Beispielprojekt

In der /etc/lighttpd/lighttpd.conf steht dann wieder das übliche:

$HTTP["host"] == "posativ.org" {

    # some conf here
    # index-file.names = ("index.html") und so weiter
    # mod_proxy ist erforderlich, logischerweise

    $HTTP["url"] =~ "/git" {
        proxy.server = ("" =>
            (("host" => "127.0.0.1", "port" => 7654)))
    }
}

In­stal­la­ti­on – Fort­füh­rung von dem hier

Damit das auch funk­tio­niert, habe ich grack auch geforkt:

$ git clone https://github.com/posativ/grack ~/posativ.org/grack
$ thin config -c /home/www/posativ.org/grack/ -p 7654 -a 127.0.0.1 -e production \
  -l grack.log -C /etc/thin/grack.yml

Dann noch die config.ru anpassen. Das Teil ist so gepatcht, dass es SSL-Zer­ti­fi­ka­te nicht prüft, denn das tut es nämlich irgendwie falsch. Angegeben werden muss use_­red­mi­ne_auth, redmine und in meinem Falle auch grack_­sub­u­ri, denn es wird unter /git/myproject.git gehostet.

config = {
  :project_root          => "/home/www/repositories/git",
  :git_path              => '/usr/bin/git',
  :upload_pack           => true,
  :receive_pack          => true,

  :use_redmine_auth      => true,
  :redmine               => 'https://posativ.org/redmine',
  :grack_suburi          => '/git'
}

Dann noch ein schnelles

$ invoke-rc.d thin stop && invoke-rc.d thin start

und grack läuft über Port 7654 auf localhost und wird von Webserver getunnelt. Sogar mit SSL. Damit die Redmine-Au­then­ti­fi­zie­rung auch läuft, muss die REST API aktiviert werden. Die findet sich unter Ad­mi­nis­tra­ti­on -> Kon­fi­gu­ra­ti­on -> Au­then­ti­fi­zie­rung -> REST Schnitt­stel­le aktivieren. Denn was (mein) Grack macht, ist einfach https://redmine.tld/projects/myproject.xml mittels der Nut­zer­da­ten aufrufen, das bei Zugriff auf dieses Projekt 200 Ok oder eben 403 Forbidden zurückgibt.

Usage

Das Handling ist jetzt noch etwas suboptimal, ich hoffe, es gibt dazu aber noch schöne Redmine-Plugins. Denn ein Git-Repository muss als --bare erstellt werden (Vor­aus­set­zung für HTTP):

$ cd ~/repositories/git
$ git init --bare myproject.git
$ # oder via git clone --bare ~/myproject myproject.git ein altes Projekt umwandeln

Dann lässt sich das Repository über https://domain.tld/git/myproject.git klonen und pushen. Ganz hübsch.

blog comments powered by Disqus