logo_header

icon_register icon_logout

icon_bubbles Forum

icon_bubbles Wiki

icon_bubbles Blogs

icon_bubbles Planet

RootForum Community » Wiki

Mercurial mit Lighttpd und FastCGI (de)

From RootForum Community » Wiki

Jump to:navigation, search

Contents

Einleitung

In diesem Artikel geht es um die Einrichtung eines Mercurial Hosting Servers, der mehrere Repositories für jeweils verschiedene User verwalten können soll. Der Zugriff auf die Repositories soll dabei über das HTTP-Protokoll erfolgen; gleichzeitig sollen die Repositories per Weboberfläche erforschbar sein.

Um eine möglichst hohe Performance des Setups zu erreichen, wird - anders als in den Anleitungen im Mercurial Wiki - FastCGI anstelle von CGI eingesetzt. Zusammen mit einem schnellen Webserver, in diesem Falle Lighttpd, ergibt sich eine beachtliche Performance.

Die Anleitung orientiert sich an meinem Mercurial-Server. Diesen habe ich unter FreeBSD in einem Jail aufgesetzt. Bitte achten Sie darauf, dass unter Linux häufig andere Pfade verwendet werden müssen als die von mir genannten!


Anforderungen

  • Ein virtueller Host
  • Beliebig viele Repositories
  • Userverwaltung unabhängig vom Betriebssystem
  • Zugriff auf die Repositories via HTTP(S)
  • Ansicht der Repositories über Weboberfläche
  • URL-Schema für den Webzugriff: hg.domain.tld/<repository-name>


Benötigte Software

Es werden folgende Programme bzw. Pakte installiert:

Am einfachsten ist es, die benannten Pakete über das Paketverwaltungssystem des verwendeten Betriebssystems zu installieren. Zusätzlich wird noch das Programm htpasswd von Apache benötigt. Dieses muss nicht unbedingt auf dem Server installiert sein; es wird lediglich zum Erzeugen einer Passwort-Datei für die Mercurial-User benötigt. Soll die User-Verwaltung auf dem Server stattfinden, muss allerdings ein Apache-Paket installiert sein (da der Server nicht genutzt wird, ist es egal, welches...)


Infrastruktur einrichten

Auf meinem System läuft Lighttpd unter www:www. Wenn das auf Ihrem System anders sein sollte, bitte für den folgenden Teil durch die auf Ihrem System verwendeten User- bzw. Gruppennamen ersetzen. Des weiteren habe ich alle benötigten Daten unter /local/data abgelegt. Andere mögliche Orte wären z. B. /var/hg oder /srv/hg - passen Sie bitte auch diese Vorgabe an Ihre eigenen Bedürfnisse an.

Zuerst muss eine Basis-Verzeichnisstruktur angelegt werden:

cd /local/data
mkdir config www repos
chgrp www *
chmod 0750 *

Das Servieren der Repositories via HTTP übernimmt Mercurial selbst; lediglich das FastCGI-Wrapperskript muss für den Einsatz vorbereitet werden:

cp /usr/local/share/mercurial/www/hgwebdir.fcgi /local/data/www/
cat > /local/data/www/hgweb.config << EOF
[collections]
/local/data/repos = /local/data/repos
 
[web]
baseurl = /
EOF
cd /local/data/www
chmod 0640 hgweb.config
chmod 0750 hgwebdir.fastcgi

Zu guter letzt muss noch die Kennwort-Datei erzeugt werden (hier mit einem Beispiel-User namens "test"):

cd /local/data/conf
htpasswd -m -c auth test
chown root:www auth
chmod 0640 auth


Lighttpd konfigurieren

Lighttpd muss nun noch dazu animiert werden, alle Requests über den Mercurial FastCGI-Handler abarbeiten zu lassen (mit Ausnahme aller Anfragen nach statischem Content wie Style Sheets oder Grafiken). Die meisten Setups machen es sich einfach und lassen die Repositories über ein Unterverzeichnis servieren. Möchte man das nicht, muss man etwas basteln, damit der statische Content trotzdem noch korrekt serviert wird. Folgendes muss an die bestehende (und hoffentlich funktionstüchtige Lighttpd-Konfiguration angehängt werden:

server.modules += ( "mod_rewrite", "mod_alias", "mod_auth", "mod_fastcgi" )
static-file.exlude-extensions += ( ".fcgi" )
 
# Alias für statischen Content
# Pfad muss an eigene Python-Installation angepasst werden!
alias.url = ( "/static/" => "/usr/local/lib/python-2.6/site-packages/mercurial/templates/static/" )
 
# Alle Requests (außer die, die mit /static/ beginnen) für FastCGI umschreiben
url.rewrite-once = ( "^(/(?!(static/)).*)" => "/hgwebdir.fcgi$1" )
 
# FastCGI konfigurieren
fastcgi.server = ("/hgwebdir.fcgi" => 
  ( "localhost" =>
    (
      "bin-path"        => "/local/data/www/hgwebdir.fcgi",
      "socket"          => "/var/run/lighttpd/hgwebdir.sock",
      "check-local"     => "disable",
      "disable-time"    => 1,
      "min-procs"       => 1,
      "max-procs"       => 1
    ),
  )
)
 
# Authentifizierung bei Push erzwingen
$HTTP["querystring"] =~ "cmd=unbundle" {
  auth.require = ( "" => (
    "method"        =>      "basic",
    "realm"         =>      "My Mercurial Server",
    "require"       =>      "valid-user"
  ))
}
 
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/local/data/conf/auth"

Zusätzlich kann noch SSL aktiviert und konfiguriert werden. Bei mir ist ein Reverse Proxy vorgeschaltet, der gleichzeitig auch die SSL-Verschlüsselung übernimmt. Ist dies in Ihrem Setup nicht der Fall, sollten Sie Lighttpd auf jeden Fall mit SSL-Unterstützung aufrüsten. Wie das geht, ist in der Lighttpd-Dokumentation beschrieben.

Nachdem Lighttpd gestartet wurde, sollte beim Aufruf von hg.domain.tld/ eine Übersichtsseite angezeigt werden, auf der jedoch noch keine Repositories aufgelistet sind.


Einrichten eines Repositories

Zu guter Letzt bleibt noch, ein Beispiel-Repository einzurichten. Der vorhin angelegte User test soll lesen und schreiben dürfen, Besucher dürfen das Repository nur lesen (Pull, Clone):

cd /local/data/repos
mkdir beispiel
cd beispiel
hg init
cd ..
chgrp -R www beispiel
chmod -R g+w beispiel
chmod -R o-rwx beispiel

Damit das gewünschte Verhalten erzielt wird, muss die Konfiguration des Repositories noch entsprechend angepasst werden:

cat >> /local/data/repos/beispiel/.hg/hgrc << EOF
[web]
contact = Lord Python
description = RootForum.org Beispiel-Repository
allow_push = test
allow_archive = gz, bz2, zip
EOF

Zur Erläuterung: contact und description werden auf der Übersichtsseite mit angezeigt. Mit allow_push = test wird festgelegt, dass ausschließlich der User test in das Repository schreiben darf. allow_archive = gz, bz2, zip sorgt dafür, dass jede Version in Form eines der angegebenen Archiv-Formate über die Weboberfläche heruntergeladen werden kann.