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 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 Passenger (mod_rails) entschieden.

Damit Ruby/Rails-Anwendungen via Apache ausgeführt werden können, wird Passenger (“mod_rails”) installiert. Passenger ist auch in den Paketquellen von Ubuntu zu finden, jedoch will apt für die Installation den bei mir installierten apache2-mpm-prefork sowie php5 deinstallieren.

Update: Da seit Ubuntu 10.04 das in den Paketquellen enthaltene Passenger-Modul auch mit dem apache2-mpm-prefork kompatibel ist (der für PHP5 notwendig ist), kann das Modul nun auch direkt über die Paketquellen installiert werden – was die Installation erheblich verkürzt. Siehe den entsprechenden Abschnitt unten.

Installation von Passenger und weiteren Dependencies unter Ubuntu 9.10

Zuerst werden die für Redmine benötigten Pakete installiert.

sudo aptitude install ruby rails rubygems ruby1.8-dev libgemplugin-ruby libgemplugin-ruby1.8 libruby-extras libruby1.8-extras rubygems1.8 rake apache2-threaded-dev libapache-dbi-perl libapache2-mod-perl2 libdigest-sha1-perl libopenssl-ruby build-essential

Hinweis: bei mir wurde die über die Paketverwaltung installierte Version von Rails später nicht erkannt – und generell sollte man Rails möglichst nur auf eine Art und Weise installieren, entweder via Paketverwaltung oder gem. Deshalb sollte “rails” eventuell lieber gleich weggelassen werden. Installation via gem siehe unten.

Dann wird ein virtueller Apache-Host angelegt, dazu wird z.B. das Verzeichnis /var/www/redmine.example.lit/redmine angelegt.

Unter Ubuntu 9.10 ist das in den Paketquellen enthaltene Passenger-Apache-Modul nicht mit dem apache2-mpm-prefork kompatibel – der wiederum ist für PHP5 erforderlich. Deshalb habe ich mich für die Installation via gem entschieden:

sudo gem install passenger

Nach der Installation muss das Apache-Modul kompiliert werden, die benötigten Pakete sollten alle bereits installiert sein. Um das Modul zu erstellen, wird folgendes ausgeführt:

/var/lib/gems/1.8/bin/passenger-install-apache2-module

Nun wird man durch den Kompiliervorgang des Moduls geführt, eventuell fehlende Abhängigkeiten werden beschrieben und notwendige Schritte erläutert. Danach ist das apache2-Modul kompiliert und muss noch aktiviert werden. Dazu wird die Datei /etc/apache2/mods-available/passenger.load mit folgendem Inhalt angelegt:

LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-2.2.9/ext/apache2/mod_passenger.so

Nun wird noch die Modul-Konfigurationsdatei (/etc/apache2/mods-available/passenger.conf) mit folgendem Inhalt angelegt:

PassengerRoot /var/lib/gems/1.8/gems/passenger-2.2.9
PassengerRuby /usr/bin/ruby1.8

(Die Pfade können bei neueren Versionen oder anderen Distributionen abweichen.)

Nun muss das Modul noch aktiviert und Apache neu gestartet werden:

sudo a2enmod passenger
/etc/init.d/apache2 restart

Installation von Passenger ab Ubuntu 10.04

Ab Ubuntu 10.04 können fast alle Abhängigkeiten (inkl. Passenger) direkt über die Paketverwaltung installiert werden:

sudo aptitude install ruby rails rubygems ruby1.8-dev libgemplugin-ruby libgemplugin-ruby1.8 libruby-extras libruby1.8-extras rubygems1.8 rake libapache-dbi-perl libapache2-mod-perl2 libdigest-sha1-perl libopenssl-ruby libapache2-mod-passenger

Hinweis: bei mir wurde die über die Paketverwaltung installierte Version von Rails später nicht erkannt – und generell sollte man Rails möglichst nur auf eine Art und Weise installieren, entweder via Paketverwaltung oder gem. Deshalb sollte “rails” eventuell lieber gleich weggelassen werden. Installation via gem siehe unten.

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 “aptitude 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://redmine.rubyforge.org/svn/branches/0.9-stable/ /var/www/redmine.example.lit/redmine/

Nach dem Checkout sollte der Besitzer dieses Verzeichnisses und aller Unterordner/Dateien geändert werden. Entweder wird ein eigener Benutzer für Redmine angelegt oder es wird der Benutzer des Webservers (“www-data”) verwendet. Hintergrund: Passenger führt die Anwendung später mit diesem Benutzer aus! Deshalb sollte dies keinesfalls root sein.

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

Ich habe mich für MySQL als Datenbank entschieden, es steht aber unter anderem auch SQLite zur Verfügung. 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;

Dann muss eine DB-Konfigurationsdatei aus der Beispieldatei erstellt und im Bereich “production” die richtigen DB-Verbindungsdaten angegeben werden:

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

Anschließend wird der Mailversand konfiguriert:

cd /var/www/redmine.example.lit/redmine/config/
cp email.yml.example email.yml
nano email.yml

Dort muss bei Verwendung von sendmail nur folgendes eingetragen werden:

production:
  delivery_method: :sendmail

Bei der verwendeten SVN-Version muss noch ein Session-secret erzeugt werden, dies ist wohl bei den “richtigen Releases” nicht notwendig:

rake generate_session_store

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/
sudo rake db:migrate RAILS_ENV="production"
sudo rake redmine:load_default_data RAILS_ENV="production"

Sollte die folgende folgende Fehlermeldung erscheinen:

Missing the Rails 2.3.5 gem. Please `gem install -v=2.3.5 rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.

oder die folgende:

The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql. rake aborted!

muss Rails (wie oben erwähnt) oder der MySQL-Treiber für Rails noch wie beschrieben installiert werden. Außerdem muss ruby-openid installiert sein, damit das OpenID-Feature genutzt werden kann.

sudo gem install -v=2.3.5 rails
sudo gem install mysql
sudo gem install ruby-openid

Nun 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
/etc/init.d/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.

Falls noch nicht vorhanden, muss git installiert werden.

sudo aptitude 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 mod_perl, mod_dav und weitere Abhängigkeiten installiert und die erforderlichen Module aktiviert. Redmine stellt zur Authentifizierung ein Perl-Modul bereit.

sudo aptitude 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:

12 Kommentare zu „Installation von Redmine und Git unter Ubuntu“

  1. Lido sagt:

    Das nenn ich mal nen gelungen Artikel! Warum können nicht alle Freaks bloggen wie du? Kompliment von mir!

  2. CN sagt:

    Super, dank Deiner Anleitung konnte ich es auch endlich installieren. Redmine finde ich das beste Projektmanagementtool das es zur Zeit gibt.

  3. apalgen sagt:

    Wo ist der “Like” Button?! :D
    Danke.

  4. internaut sagt:

    Super Anleitung, vielen Dank!
    Ich hatte leider ein paar Probleme mit

    git push

    und bekam ständig folgende Fehler:

    MKCOL ... failed, aborting (22/401)

    Zum Glück hatte sich das dann mit einer .netrc-Datei erledigt. Falls jemand ähnliche Probleme hat, mehr dazu hier:
    A solution for git-http-push failed errors

  5. Volker sagt:

    Hi ich habe dieses Tut leider erst sehr spät gefunden und mich erst mit dem Howto für CentOS5 auf redmine.org beschäftigt. Dummerweise bin ich jetzt ziemlich aufgeschmissen, da ich mit Ruby, RubyGems noch überhaupt garnichts gemacht habe. in dem HowTo heißt es

    Create the Gemfile and register these gems in it¶

    * "rake", "0.8.3"
    * "rack", "1.0.1"
    * "i18n", "0.4.2"
    * "rubytree", "0.5.2", :require => "tree"
    * "RedCloth", "~>4.2.3", :require => "redcloth" # for CodeRay
    * "mysql"
    * "coderay", "~>0.9.7"

    bundle install

    Create the Redmine MySQL database¶
    Configure database.yml (rename database.yml.example)¶
    Set the production environment (optional)¶

    Uncomment the following line:

    ENV['RAILS_ENV'] ||= 'production'

    Generate the session store¶

    RAILS_ENV=production bundle exec rake generate_session_store

    Leider habe ich keine Ahnung wie ich das Gemfile erzeugen soll, bzw. wo.
    Die rake-commands führen mich an der Stelle in einen Fehler (Verständlich) und bundle install sagt er könne das Gem-File nicht finden (Was ja aktuell auch mein Problem ist).

    Es dreht sich zwar nicht um Deine Anleitung, aber vielleicht kannst Du ja trotzdem helfen.
    Ich wäre auch über Skype erreichbar.

    Gruß und Danke

    Volker

    • Hallo Volker,

      das Gemfile müsste einfach im Wurzelverzeichnis der Redmine-Installation (in dem auch die Unterverzeichnisse app/ und config/ liegen) angelegt werden – und ist einfach eine Textdatei mit dem von Dir beschriebenen Inhalt.

      Du kannst die Abhängigkeiten aber auch einfach ohne Bundler und Gemfile installieren – einfach via


      gem install mysql
      gem install i18n --version 0.4.2
      [usw...]

      Rake und Rack sollten normalerweise bereits installiert sein.

      Achtung: dies muss als root-User erfolgen, da die Gems systemweit installiert werden – das muss besonders bedacht werden, falls noch andere Ruby-/Rails-Anwendungen auf dem System laufen, die evtl. andere Versionen der Gems benötigen.

      Ich hoffe, das führt Dich etwas weiter…

      • Volker sagt:

        Hallo Raphael,

        ich bin jetzt eine ganze Ecke weiter. Immerhin konnte ich eben die Oberfläche sehen. Ich habe einige Einstellungen gemacht und schon…

        Server error 500 sobald ich jetzt die Konfiguration oder die Benutzerverwaltung anklicke. Auch der Klick auf neues Projekt bringt mich jetzt in einen internal Server-Error.

        Merkwürdigerweise wird überhaupt nichts mehr ins production.log geschrieben. Google ist derweil auch nicht mein bester Freund und liefert nicht wirklich brauchbare Ergebnisse.

        Die Abhängigkeiten habe ich bereits installiert.

        Ich hoffe Du kannst noch mal helfen :/

        Gruß

        Volker

  6. Volker sagt:

    Also nach langem Suchen und Fummeln wurde endlich wieder etwas in das production.log geschrieben:


    Processing SettingsController#index (for 77.11.93.241 at 2011-03-22 11:16:29) [G ET]
    Parameters: {"controller"=>"settings", "action"=>"index"}
    Rendering template within layouts/admin
    Rendering settings/edit

    ActionView::TemplateError (incompatible character encodings: UTF-8 and ASCII-8BI T) on line #14 of app/views/settings/_display.rhtml:
    11:
    12: :label_language_based %>
    13:
    14:
    15:
    16:
    17:

    Interessant ist dabei, dass im Redmine-Tutorial immer eine DB mit utf-8 charset angelegt wird. Letztendlich verursacht das ohne entsprechende Umwandlung aber anscheinend die Probleme.

    Folgende Lösung hat mir geholfen:

    im config-Dir die additional_environment.rb.example in additional_environment.rb umbenennen und folgenden Code einfügen:

    require 'mysql'

    class Mysql::Result
    def encode(value, encoding = "utf-8")
    String === value ? value.force_encoding(encoding) : value
    end

    def each_utf8(&block)
    each_orig do |row|
    yield row.map {|col| encode(col) }
    end
    end
    alias each_orig each
    alias each each_utf8

    def each_hash_utf8(&block)
    each_hash_orig do |row|
    row.each {|k, v| row[k] = encode(v) }
    yield(row)
    end
    end
    alias each_hash_orig each_hash
    alias each_hash each_hash_utf8
    end

    Das sollte es gewesen sein. Keine Deadlinks mehr bei mir. Wenn ich noch etwas finde, melde ich mich auf jeden Fall, ansonsten 1000 Dank für die Hilfe.

    Beste Grüße

    Volker

    • Schön, dass die Installation bei Dir funktioniert hat! Die encoding-Probleme hatte ich bisher glücklicherweise nicht – allerdings habe ich Redmine bisher auch nur unter Ubuntu und Debian installiert…

  7. ddjjmm sagt:

    Hallo Raphael,

    danke erstmal für deine ausführlichen Anleitungen und Ergänzungen. Habe Redmine zusammen mit der Anleitung von http://wiki.ubuntuusers.de/Baustelle/Redmine und Hinweisen auf deinem Blog installiert.

    Konnte mich einloggen und auch schon im Backend Einstellungen verwalten etc.

    Nachdem ich WinSCP bzw. Putty geschlossen habe, war natürlich auch Redmine nicht mehr über den Browser zu erreichen, da ich die Umgebung ja zuvor mit Hilfe des Commands “sudo ruby script/server -e production” gestartet habe.

    Kannst du mir weiterhelfen, wie ich den Start von Redmine unter Ubuntu automatisieren kann? Startskripte oder ähnliches? Stehe da vollkommen im Dunkeln :-(

    • Hallo ddjjmm,

      der von Dir beschriebene Start auf der Kommandozeile funktioniert natürlich nur zu Test-/Entwicklungszwecken. Die einfachste Variante, eine Ruby/Rails-Anwendung zu deployen, ist das Apache-Modul “Passenger” – was in der von Dir genannten Anleitung unter http://wiki.ubuntuusers.de/Baustelle/Redmine#Anbindung-mittels-Passenger beschrieben wird, meine Anleitung beschreibt dies ebenfalls. Dazu muss Passenger entweder via gem install passenger – oder aber ab Ubuntu 10.04 viel einfacher via sudo apt-get install libapache2-mod-passenger installiert werden. Dieses Apache-Modul muss natürlich im Apache auch aktiviert sein (sudo a2enmod passenger). Passenger startet die Anwendung automatisch, wenn die DocumentRoot des virtuellen Apache-Hosts auf das “public”-Verzeichnis zeigt. Hast Du die Schritte ausgeführt? Was erscheint bei Dir nach einem Aufruf im Browser? Achtung: Du musst natürlich Port 80 bzw. 443 bei SSL verwenden (um über Apache/Passenger zu gehen) – beim Test hast Du Redmine ja sicher über Port 3000 aufgerufen (den Port verwendet eine manuell gestartete Rails-Anwendung normalerweise).

  8. ddjjmm sagt:

    hat funktioniert, war mir zu unsicher ob passenger das richtige ist. Vielen Dank!

Kommentieren

(wird nicht veröffentlicht, Gravatar-Unterstützung)
 
XHTML: Sie können folgende Elemente nutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">