Mercurial mit Lighttpd und FastCGI (de)
From RootForum Community » Wiki
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.