Professional Documents
Culture Documents
Trac) zu installieren. Ich bin der Bitte nachgekommen und habe auf einem Rechner
Ubuntu 9.10 und dann darauf Git und Trac installiert. Diesen Artikel schreibe ich auch als
Gedächtnisstütze für mich, falls ich so eine Maschine noch mal aufsetzen muss.
- ich übernehme keinerlei Haftung für irgendwelche Schäden, die durch die Befolgung
dieser Anleitung entstehen
- das Setup ist nicht optimal, da der git-daemon häufig Repositories nicht exportiert.
Irgendwo befindet sich ein Bug in meiner Konfiguration und ich finde ihn nicht. Hinweise
werden erbeten, falls jemand beim Nachvollziehen dieser Anleitung auf den Fehler stößt.
- gitosis hat bei diesem Setup leider nicht die Macht, die es haben sollte, weil der git-
daemon nicht immer eingebunden wird. Durch die Verwendung einer Public-Key-
Authentification sollten aber keine Sicherheitsprobleme auftreten. Falls jemand eines
entdecken sollte, lasst es mich bitte wissen.
- die Installation eines solchen Setups ist nichts für Anfänger und dauert seine Zeit. Wer
schneller good-to-go sein will, sollte sich die Angebote von www.github.com und
www.lighthouseapp.com näher anschauen.
Nach der erfolgreichen Installation von Ubuntu (Server oder Desktop spielt dabei keine
Rolle), brauchen wir erst mal ein paar grundlegende Pakete. Desktop-spezifische Pakete
lasse ich außen vor, ich gehe von einer Serverinstallation aus. Aber, wie gesagt, eine
Desktop-Variante von Ubuntu arbeitet genau so zuverlässig.
aus, um erst mal sicherzustellen, dass unser System wirklich auf dem aktuellsten Stand
ist.
Jetzt machen wir uns an die Installation einiger benötigter Pakete, die für den späteren
Betrieb von Git und Trac erforderlich oder auf jeden Fall sinnvoll sind:
Da es sich bei der Maschine um einen Server handelt, sollte diese auf jeden Fall einen
Fully Qualified Domain Name und eine feste IP-Adresse erhalten:
lässt einen die Interface-Konfiguration bearbeiten. Diese sollte nach getaner Arbeit
folgenden Inhalt haben:
Nachdem die Datei gespeichert ist, musst der entsprechende Dienst neugestartet
werden:
Jetzt sollte die Netzwerkschnittstelle 'eth0' die IP-Adresse 192.168.0.11 haben und mit
dem Netzwerk kommunizieren können. Sollte eure Netzwerkkonfiguration von meiner hier
genannte abweichen, müsst ihr eure Konfiguration natürlich entsprechend anpassen.
Testen kann man das beispielsweise mit dem Kommando 'ping'.
Ich starte im Allgemeinen nun das komplette System neu um zu sehen, ob alle
Einstellungen auch nach einem Neustart funktionieren:
sudo reboot
Nun sollten die Kommandos:
hostname
hostname -f
Bei .domain und .tld handelt es sich natürlich um individuelle Werte, die ihr selbst setzen
müsst.
Ganz einfach:
Nachdem die Installation abgeschlossen ist, müssen wir unter Umständen erst mal dafür
sorgen, dass der git-daemon auch wirklich startet. Bedingt durch einen Bug (https://
bugs.launchpad.net/ubuntu/+source/runit/+bug/439049) in der aktuellen Version von
Ubuntu (9.10) startet er nämlich nicht unbedingt automatisch. Um dieses Problem zu
beheben, müssen wir mittels
die Datei runsvdir.conf bearbeiten und die ersten Zeilen (start on runlevel x) durch
folgende Zeile ersetzen:
Theoretisch sollte das durch das System automatisch erledigt worden sein, wenn nicht,
hilft der genannte Fix. Am Besten sollte man das System nun neu starten, um
sicherzustellen, dass der git-daemon auch wirklich läuft. Am einfachsten lässt sich das
mittels
überprüfen. Der Output sollte auf jeden Fall eine Zeile mit dem Inhalt
beinhalten. Wenn das der Fall ist, sollte der git-daemon laufen. Dieser ist erforderlich,
damit man mittels des Git-Protokolls mit dem Server kommunizieren kann.
sudo adduser \
--system \
--shell /bin/sh \
--gecos 'git version control' \
--group \
--disabled-password \
--home /home/git \
git
Jetzt legen wir ein Verzeichnis für die Repositories im Home-Verzeichnis des Benutzers
git an:
Damit der git-daemon auch weiß, wo sich die Repositories befinden, müssen wir dem
Dienst sagen, wo er suchen soll. Dazu editieren wir die Datei run des git-daemon:
und ein paar Sekunden Wartezeit sollte der git-daemon nun wissen, wo er nach
Repositories zu suchen hat.
Der in 2.2 angelegte Benutzer hat kein Passwort, kann sich also regulär auch nicht per
SSH am System anmelden. Dieses Szenario eignet sich hervorragend für den Fall, dass
nicht für jeden Entwickler ein eigener SSH-Account angelegt werden soll. Damit dieser
sich aber trotzdem am System über den Benutzer git anmelden kann, kopieren wir den
Key des jeweiligen Benutzers auf den Server. Diese initiale Einrichtung muss von einem
Benutzer des Servers durchgeführt werden, der entsprechende Rechte besitzt, also
beispielsweise dem Administrator (aka bei der Installation erstellter Nutzer).
mkdir user-keys
Also beispielsweise
Diesen Prozess wiederholt man nun für jeden Benutzer, der via Git mit dem Server
arbeiten soll.
Nachdem die benötigten Schlüssel auf dem Server sind, kopiert man deren Inhalte noch
in die Datei .ssh/authorized_keys. Dies geschieht am einfachsten und fehlerfreisten
mittels des folgenden Befehls:
Auch dieser Prozess muss für jeden vorhandenen Schlüssel durchgeführt werden. Ab
sofort kann jeder Benutzer, dessen Schlüssel auf dem Server liegt und sich in der Datei
authorized_keys befindet über den Benutzeraccount 'git' mittels des SSH-Protokolls auf
den Server zugreifen.
Testen kann man das, indem man sich von einem Client mittels
ssh git@servername
mit der Maschine verbindet. War die Verbindung erfolgreich, hat alles geklappt. Wenn
nicht, sollte man die vorherigen Schritte erneut durchführen bzw. jeden einzelnen prüfen.
3.2 Git-Projekt auf einem Client erstellen und auf den Server kopieren
Theoretisch genügt ein leeres Verzeichnis, um zu testen, ob alles geklappt hat. In diesem
leeren (oder auch nicht-leeren) Verzeichnis geben wir nun folgendes ein:
git init
git add .
git commit -a -m "initial import"
git remote add origin ssh://git@servername/home/git/repositories/
test.git
git config user.name "Dein Name"
git config user.email "deineadresse@domain.tld"
touch .git/git-daemon-export-ok
scp -rp .git git@servername:repositories/test.git
git push --all
- mittels git init wird das Verzeichnis .git mit den für Git erforderlichen Inhalten erstellt.
- git add . fügt alle Dateien im aktuellen Verzeichnis zum working tree hinzu.
- git commit erstellt einen (vorerst lokalen) commit.
- git config fügt Zeilen zur lokalen Git-Konfiguration hinzu, in denen
Benutzerinformationen zu finden sind.
- git remote add fügt eine weitere Zeile zur lokalen Konfiguration des aktuellen Git-
Repositories, in der sich die Information befindet, wo das aktuelle Repository abgelegt
werden soll.
- die Datei git-daemon-export-ok teilt dem git-daemon mit, dass das Repository nach
außen hin verfügbar sein soll. git push lädt Änderungen auf der lokalen Seite auf den
Server hoch.
3.3 Clone des soeben angelegten Repositories und pushen von Änderungen
Wechselt nun in ein anderes (möglichst leeres) Verzeichnis und testet, ob der Clone auch
funktioniert:
Es sollten nun einige Ausgaben seitens Git erfolgen. Wenn alles geklappt hat, sollte sich
nun im aktuellen Verzeichnis ein neues Verzeichnis mit dem Namen "test" befinden.
Wechselt nun in dieses Verzeichnis und legt mittels
touch testfile
Jetzt muss leider die config-Datei des Clones angepasst werden, da ich bisher keine
Möglichkeit gefunden habe, direkt über das Git-Protokoll zu pushen.
nano .git/config
Die Zeile 'url' in der Sektion [remote "origin"] muss nun so angepasst werden, dass
anstelle von
git://servername/repositoryname.git
ssh://git@servername/home/git/repositories/repositoryname.git
steht.
git add . && git commit -a -m "test commit" && git push --all
Nun wird die initiale Konfiguration von gitosis erstellt. Voraussetzung dafür ist ein Public
Key, wie bereits in 3.1 erläutert.
Damit auch alles funktioniert, passen wir die Rechte an einem so genannten Hook Script
an:
Nun holen wir das soeben erstellte Repository auf einen der Clients. Dazu führen wir auf
einem Client den folgenden Befehl aus:
Auch hier sollte theoretisch das Git-Protokoll funktionieren, bei meinen Tests schlug das
aber leider fehl.
Auf dem Client sollte sich nun ein Verzeichnis mit dem Namen 'gitosis-admin' befinden.
Wenn wir in dieses mittels
cd gitosis-admin
wechseln, finden wir eine Datei, 'gitosis.conf' und ein Verzeichnis, 'keydir'. Im
Verzeichnis 'keydir' sollte der Public Key des vorhin verwendeten Nutzers liegen.
Nun editieren wir die Datei 'gitosis.conf' und fügen folgendes ans Ende der Datei ein:
[group myteam]
members = ulf alice bob
writable = test
Die Benutzergruppe 'myteam' besteht also aus den Mitgliedern ulf, alice und bob. Die
Gruppe hat Schreibrechte auf das Repository 'test'. Dieses Repository sollte bereits
existieren, wenn nicht, legen wir es wie weiter oben beschrieben an.
Damit Alice und Bob nun auch tatsächlich mitspielen dürfen, müssen deren Public Keys
noch in das (weiterhin lokale) Repisitory gitosis-admin kopiert werden. Kopiert nun also
die von den Benutzern Alice und Bob erhaltenen Schlüssel in das Verzeichnis:
cd gitosis-admin
cp ~/alice.pub ~/bob.pub keydir/
Die geänderte Konfiguration gleichen wir nun mit dem Server ab:
git commit -a -m "alice, bob and ulf have write access to test"
git push --all
sollten nun auch Alice und Bob das Repository clonen können.
5.1 Installation
Die Installation von Trac ist recht simpel. Ich empfehle aber, nicht die (veraltete) Version
aus den Ubuntu-Repositories zu verwenden, sondern die aktuelle Version mittels
easy_install zu installieren. Damit das funktionieren kann, brauchen wir aber erst mal ein
paar Pakete:
Das funktioniert nur, wenn (wie weiter oben beschrieben) die Pakete python-setuptools,
python-dev und subversion installiert sind. Ansonsten geht entweder gar nichts oder man
bekommt Warnmeldungen.
Jetzt brauchen wir noch ein Plugin, welches unsere Git-Repositories in Trac einbindet.
Dessen Installation erfolgt folgendermaßen:
svn co http://trac-hacks.org/svn/gitplugin
cd gitplugin/0.11/
sudo easy_install .
Um weitere Projekte anzulegen, wiederholt ihr den letzten Befehl einfach mit einem
anderen Verzeichnisnamen (also beispielsweise /var/trac/megaproject).
Gebt als Typ des Repository git und außerdem den vollständigen Pfad zum gewünschten
Git-Repository an.
[components]
tracext.git.* = enabled
Nun könnt ihr die Trac-Installation mittels des in Python geschriebenen Tracd testen:
Wenn ihr nun die IP (oder den Namen) eures Servers gefolgt von :8000/project in euren
Webbrowser eingebt, solltet ihr das Wiki von Trac sehen. Außerdem müsste unter dem
Punkt "Browse Source" euer zuvor spezifiziertes Git-Repository einzusehen sein.
Sollte hier irgendetwas nicht funktionieren, prüft eure trac.ini auf fehlerhafte Einträge.
Beliebte Fehler sind falsch angegebene Repository-Typen oder -Pfade.
Zuallererst installieren wir den Apache samt aller für den Betrieb von Trac benötigten
Pakete:
Mittels
legen wir eine neue leere Datei für den Container an. Dieser sollte folgenden Inhalt
bekommen:
<Location /trac>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/trac
PythonOption TracUriRoot /trac
PythonOption PYTHON_EGG_CACHE /tmp
AuthType Basic
AuthName "Trac"
AuthBasicProvider external
AuthExternal pwauth
require valid-user
require group git
</Location>
Das Verzeichnis, und somit auch die komplette Trac-Installation, wird mit einem
Kennwortschutz versehen. Zugriffsberechtigt sind nur Systembenutzer. Neue
Systembenutzer legt ihr mit folgendem Befehl an:
Solltet ihr dies an dieser Stelle nicht wünschen, müsst ihr eigentlich nur die Zeilen ab
"AuthType Basic" bis "require group git" wegfallen lassen. Die allerletzten beiden Zeilen
(AddExternalAuth, etc.) braucht ihr ebenfalls nicht. Alternativ lässt sich hier natürlich auch
ein Zugangsschutz mit der klassischen .htpasswd realisieren. Ich verweise an dieser
Stelle einfach mal auf Google, die Einrichtung ist simpel.
In meinem Beispiel ist außerdem zu berücksichtigen, dass nur Benutzer, die Mitglied der
Gruppe 'git' sind zugangsberechtigt sind. Entsprechende Benutzer müssen also mittels
die neu hinzugefügte Apache-Konfiguration und starten den Webserver einfach mal
komplett neu:
Das Schöne an dieser Lösung ist, dass der Systemnutzer auch gleich verwendet wird, um
sich auch bei Trac anzumelden. Neue Dokumente können also diesem Benutzer
zugeordnet werden. Hat sich ein Benutzer bereits angemeldet, kann er mittels des Trac-
Befehls 'trac-admin' zum Administrator dieser Trac-Instanz gemacht werden:
Mittels
erstellen wir unseren privaten, 1024 Bit starken Schlüssel mit dem Dateinamen
server1.key.
Das Kennwort sollte mindestens acht Zeichen lang sein und den bekannten Kriterien
eines sicheren Kennworts entsprechen.
Mittels
legen wir nun einen unsicheren Schlüssel für die Generierung des CSR an. Die beiden
folgenden Kommandos wechseln die Namen der beiden Dateien, um den CSR ohne
Passwort zu generieren:
mv server1.key server1.key.secure
mv server1.key.insecure server1.key
Mittels
aktivieren wir die SSL-Unterstützung des Apache. Um die zuvor generierten Schlüssel
auch nutzen zu können, kopieren wir sie in das Standardverzeichnis für Zertifikate des
Apache:
<VirtualHost *>
ServerName server1.oc.local
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server1.crt
SSLCertificateKeyFile /etc/ssl/certs/server1.key
<Location /trac>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/trac
PythonOption TracUriRoot /trac
PythonOption PYTHON_EGG_CACHE /tmp
AuthType Basic
AuthName "Trac"
AuthBasicProvider external
AuthExternal pwauth
require valid-user
require group git
</Location>
# If you just change the port or add more ports here, you will
likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default
# This is also true if you have upgraded from before 2.2.9-3 (i.e.
from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz
and
# README.Debian.gz
#NameVirtualHost *:80
#Listen 80
<IfModule mod_ssl.c>
# SSL name based virtual hosts are not yet supported,
therefore no
# NameVirtualHost statement here
Listen 443
</IfModule>
Ab sofort sollte unser Apache nur noch Verbindungen über Port 443 entgegennehmen.
Der Nutzer der Trac-Installation muss nun also explizit https als Protokoll beim Aufruf der
Seite angeben, http ist "aus". Ein abschliessendes