New in the Journal

Archive of all articles

From my feed reader

Microblog

Journal

Installation von Redmine und Git unter Ubuntu

Auf der Suche nach einer Alternative zur Software-Projektverwaltungssoftware Trac landete ich bei Redmine, einer in Ruby bzw. mit Hilfe von Rails geschriebenen Software. Die Features lassen sich sehen – vor allem die Multiprojekt-Unterstützung, Kalender und Gantt-Diagramm, Zeiterfassung und gute Unterstützung für Git sind im Vergleich zur Trac herausragend. Wie sich während der Installation herausstellte, ist auch das Authentifizierungs-Feature für SVN und Git via WebDAV absolut praktisch – über die Rechte der Projektteilnehmer in Redmine wird automatisch auch der Lese- und Schreibzugriff im Versionskontrollsystem gesteuert, die Benutzer müssen also nur an einer Stelle gepflegt werden.

Für alle, die Redmine installieren möchten, hier ein paar meiner Erfahrungen. Die Installation erfolgte auf einem System mit Ubuntu 9.10 12.04 Server, es wird ein Apache-HTTP-Server und MySQL vorausgesetzt. Es gibt viele Möglichkeiten, eine Ruby/Rails-Anwendung zu installieren – ich habe mich für die Variante mit Apache und Phusion Passenger entschieden.

Großes Update vom 20.05.2013: Anleitung für Ubuntu 12.04 und Redmine 2.3.x angepasst. Passenger ist zwar in den Paketquellen von Ubuntu 12.04 enthalten, möchte aber immer das mittlerweile veraltete Ruby 1.8.7 mit installieren, deshalb installieren wir Passenger selbst via Rubygems. Diese Anleitung geht mittlerweile von einer aktuelleren Redmine-Version (2.3+) aus, bei der die Abhängigkeiten von Redmine mittels Bundler installiert werden.

Installation von Passenger unter Ubuntu 12.04

Zunächst installieren wir einige Abhängigkeiten über die Paketverwaltung – wichtig ist, dass wir Ruby 1.9.3 verwenden (in Ubuntu 12.04 sind sowohl das in Kürze nicht mehr unterstützte 1.8.7 und das aktuellere 1.9.3 in den Paketquellen enthalten). Auch wenn der Paketname “ruby1.9.1-full” irritiert – dahinter verbirgt sich Version 1.9.3:

sudo apt-get install ruby1.9.1-full subversion imagemagick libxslt1-dev libcurl4-openssl-dev libssl-dev libapr1-dev libaprutil1-dev apache2-threaded-dev

Hinweis: Es ist nicht zu empfehlen, Ruby-Abhängigkeiten wie Rake und Rails aus den Paketquellen zu installieren, sondern besser direkt über Rubygems/Bundler, da die Versionen aus den Paketquellen ohnehin zu alt sind.

Installation von Passenger

Passenger kann einfach via Rubygems installiert werden. Dazu folgendes ausführen:

sudo gem install rack rake passenger
passenger-install-apache2-module

Sollten bestimmte Abhängigkeiten noch fehlen, gibt der Installer ausführliche Fehlermeldungen mit eventuell noch zu installierenden Paketen. Das Kompilieren des Apache-Moduls kann einige Minuten dauern. Kaffeepause!

Jetzt fügen wir noch die notwendige Apache-Konfiguration hinzu, damit Passenger geladen werden kann:

Die Datei /etc/apache2/mods-available/passenger.load mit folgendem Inhalt anlegen:

LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-4.0.2/libout/apache2/mod_passenger.so

Und die Datei /etc/apache2/mods-available/passenger.conf mit folgendem Inhalt:

PassengerRoot /var/lib/gems/1.9.1/gems/passenger-4.0.2
PassengerDefaultRuby /usr/bin/ruby1.9.1

PassengerDefaultUser www-data

Achtung: je nach aktueller Version von Passenger können die Pfade leicht abweichen – daher am Ende der Installation von Passenger auf die Hinweise achten.

Jetzt kann Passenger aktiviert und Apache neu gestartet werden:

sudo a2enmod passenger
sudo service apache2 restart

Installation von Redmine

Jetzt kann Redmine heruntergeladen werden. Für einfache spätere Updates wird das Auschecken des stable-Branchs via SVN oder git empfohlen. Dann reicht später ein Update über das Versionskontrollsystem zur Aktualisierung. Wem die Installation via Paketverwaltung lieber ist, kann Redmine seit Ubuntu 10.04 auch direkt aus den Paketquellen installieren, hat ggf. aber nicht die aktuellste Version. Dafür reicht ein “apt-get install redmine redmine-mysql” (für die Verwendung mit MySQL als Datenbank). Mehr im offiziellen How-To.

Für die Installation via SVN wird der aktuelle stabile Zweig ausgecheckt:

svn co http://svn.redmine.org/redmine/branches/2.3-stable/ /var/www/redmine.example.lit/redmine/

Jetzt stellen wir die Datenbank bereit. Ich habe mich für MySQL als Datenbank entschieden, es steht aber unter anderem auch SQLite zur Verfügung. Die Installation von MySQL ist nicht Teil dieser Anleitung, aber mittels apt-get install mysql-server auch schnell erledigt. Vorbereitend wird nun eine Datenbank (z.B. via phpMyAdmin) erstellt, ggf. mit eigenem DB-Benutzer:

CREATE DATABASE `redmine` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT USAGE ON redmine.* TO redmine@localhost IDENTIFIED BY "mysecretp4ssw0rd";
GRANT ALL PRIVILEGES ON redmine.* TO redmine@localhost;

Jetzt sollten wir die Datenbankverbindung konfigurieren. Dazu wird im Verzeichnis /var/www/redmine.example.lit/redmine/config/ die Beispieldatei kopiert und im Bereich “production” die richtigen DB-Verbindungsdaten angegeben:

cd /var/www/redmine.example.lit/redmine/config/
cp database.yml.example database.yml
vim database.yml

Achtung: in der Datei unbedingt auf die korrekte Einrückung mit zwei Leerzeichen achten! Die “production”-Sektion kann dann z.B. so aussehen:

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "mysecretp4ssw0rd"
  encoding: utf8

Anschließend wird der Mailversand konfiguriert:

cd /var/www/redmine.example.lit/redmine/config/
cp configuration.yml.example configuration.yml
vim configuration.yml

Dort muss bei Verwendung von sendmail ganz unten in der Datei in der Sektion “production” folgendes eingetragen werden (auch hier wieder auf die korrekte Einrückung mit zwei Leerzeichen achten):

# specific configuration options for production environment
# that overrides the default ones
production:
  email_delivery:
    delivery_method: :sendmail

Jetzt installieren wir die Abhängigkeiten mit Rubygems/Bundler:

sudo gem install bundler --no-ri --no-rdoc
cd /var/www/redmine.example.lit/redmine/
sudo bundle install --without development test

Jetzt sollte noch der Besitzer dieses Verzeichnisses und aller Unterordner/Dateien geändert werden, da Passenger als User “www-data” läuft.

sudo chown -R www-data:www-data /var/www/redmine.example.lit/redmine/

Bei der verwendeten SVN-Version muss noch ein Session-Token erzeugt werden. Dazu im Wurzelverzeichnis der Anwendung (also z.B. /var/www/redmine.example.lit/redmine/) folgendes ausführen:

rake generate_secret_token

Nun wird die Datenbankstruktur erzeugt und die Standard-Konfiguration in die Datenbank geschrieben. Dazu wird folgendes (im Wurzelverzeichnis der Installation) aufgerufen:

cd /var/www/redmine.example.lit/redmine/
rake db:migrate RAILS_ENV="production"
rake redmine:load_default_data RAILS_ENV="production"

Nun ist Redmine installiert und es kann der virtuelle Apache-Host nach folgendem Muster konfiguriert werden (z.B. /etc/apache2/sites-available/redmine.example.lit):

<VirtualHost *:80>
  ServerName redmine.example.lit
  DocumentRoot /var/www/redmine.example.lit/redmine/public
  <Directory /var/www/redmine.example.lit/redmine/public>
    AllowOverride all
    Options -MultiViews
  </Directory>
</VirtualHost>

Nach dem Aktivieren des virtuellen Hosts und dem Neuladen der Apache-Konfiguration mittels

sudo a2ensite redmine.example.lit
sudo service apache2 reload

ist Redmine über die entsprechende (Sub-)Domain erreichbar. Nun kann Redmine über die Oberfläche konfiguriert werden. Die Administrator-Zugangsdaten sind admin/admin (und sollten gleich geändert werden).

Einrichten eines öffentlich lesbaren GIT-Repositorys via HTTP/WebDAV mit Redmine als Zugriffskontrolle

Nach dem Anlegen einiger Projekte habe ich für diese ein Git-Repository angelegt. Git wird der Einfachheit halber für die Nutzung via HTTP/WebDAV konfiguriert, auch wenn dies deutlich weniger performant als die anderen zur Verfügung stehenden Varianten ist. Ein weiterer Vorteil ist die Erreichbarkeit auch aus Umgebungen mit restriktiven Firewalls. Außerdem kann so die anfangs erwähnte Authentifizierung via Redmine genutzt werden.

Update: seit Version 2.1 kann Redmine auch mit dem “Smart HTTP transport” von Git umgehen. Eine ergänzende Anleitung dazu gibt es in einem neuen Blogbeitrag.

Falls noch nicht vorhanden, muss git installiert werden.

sudo apt-get install git-core

Von einem installierten Apache2 mit mod_dav wird ausgegangen. Zuerst wird – am Besten außerhalb der DocumentRoot – ein Verzeichnis für das Repository angelegt. Danach wird ein git-Repository in diesem Ordner erstellt, das durch die Option —bare nicht mit einer Arbeitskopie in Verbindung steht. Anschließend wird der Benutzer und die Gruppe des Webservers als Eigentümer des Verzeichnisses gesetzt, bei Debian und Ubuntu ist dies “www-data”.

Wichtig ist, dass der Name des Repository-Ordners mit dem existierenden GIT-Projekt-Identifier übereinstimmt, damit Redmine später die Zuordnung gelingt.

cd /var/www/redmine.example.lit/
mkdir git
cd git
mkdir example-project
cd example-project
git --bare init
cd ..
sudo chown -R www-data:www-data example-project

Nun wird die Zugriffskontrolle via Redmine eingerichtet. Dazu wird erst einmal modperl, moddav und weitere Abhängigkeiten installiert und die erforderlichen Module aktiviert. Redmine stellt zur Authentifizierung ein Perl-Modul bereit.

sudo apt-get install libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl libdigest-sha1-perl

sudo a2enmod dav
sudo a2enmod dav_fs
sudo a2enmod perl

Dann wird das Redmine-Perl-Modul an die richtige Stelle verlinkt:

ln -s /var/www/redmine.example.lit/redmine/extra/svn/Redmine.pm /usr/lib/perl5/Apache/Redmine.pm

Nun muss ein virtueller Apache-Host für den Zugriff konfiguriert werden. Dazu wird z.B. ein neuer virtueller Apache-Host nach folgendem Muster konfiguriert (im unteren Teil den Namen sowie die Zugangsdaten für die Datenbank einsetzen). Das Verzeichnis, das als DocumentRoot angegeben ist, sollte existieren.

   <virtualhost *:80>
      ServerName code.example.lit
      DocumentRoot /var/www/redmine.example.lit/code

      PerlLoadModule Apache::Redmine

      Alias /git /var/www/redmine.example.lit/git

      <location /git>
          DAV on

          AuthType Basic
          Require valid-user
          AuthName "Git"

          Options +Indexes -ExecCGI -Includes

          PerlAccessHandler Apache::Authn::Redmine::access_handler
          PerlAuthenHandler Apache::Authn::Redmine::authen_handler

          RedmineDSN "DBI:mysql:database=redmine;host=localhost"
          RedmineDbUser "username"
          RedmineDbPass "password"
      </location>
   </virtualhost>

Anschließend ist das Git-Repository des Projekts “example-project” – jedenfalls laut Beispielkonfiguration – unter code.example.lit/git/example-project erreichbar. Falls das Projekt in Redmine auf “öffentlich” geschaltet ist, kann jeder auf dieses Repository lesend zugreifen. Schreibzugriffe haben alle Redmine-Benutzer, die dem Projekt als Mitglied zugeordnet sind.

Damit der Repository-Browser von Redmine das Repository findet, kann es eventuell nötig sein, in der Projektkonfiguration für das Repository “Git” auszuwählen und den (lokalen!) Pfad anzugeben, z.B. /var/www/redmine.example.lit/git/example-project

Sollte beim Anzeigen des Repositories in Redmine ein Fehler auftreten, kann dies daran liegen, dass es noch keinen Commit gab.

Weiterführende Hinweise finden sich auf folgenden Seiten:

comments powered by Disqus