Journal

Artikel-Schlagworte: „web“

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 auch 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.

Installation von Redmine

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.

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

Damit Ruby/Rails-Anwendungen via Apache ausgeführt werden können, wird nun 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. 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

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.

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:

Selbstsigniertes SSL-Zertifikat erstellen

Eher als Notizzettel für mich: kurz und knapp – so erstellt man ein selbstsigniertes SSL-Zertifikat mit OpenSSL:

Private Key erstellen
openssl genrsa -des3 -out server.key 1024

Private Key ohne Passwortschutz erstellen (für Apache u.a.)
openssl rsa -in server.key -out server.key.decrypted

Certificate Signing Request erstellen
openssl req -new -key server.key -out server.csr

Zertifikat ausstellen
openssl x509 -req -days 3650 -in server.csr -signkey server.key.decrypted -out server.crt

PEM-Datei (für Courier etc.) erstellen
cat server.key.decrypted server.crt > server.pem
openssl gendh >> server.pem

Maxmind ändert URL für GeoIP-Datenbank

Gestern musste ich entsetzt feststellen, dass AWStats nicht mehr richtig funktionierte. Das Problem: mein monatliches GeoIP-Update-Shellskript schlug fehl, weil sich die URL zur Maxmind-GeoIP-Datenbank geändert hat. Das brachte wiederum das geoip-Plugin von AWStats zu Fall.

Der neue Link zur GeoLiteCountry-Datenbank lautet: http://geolite.maxmind.com/download/geoip/
database/GeoLiteCountry/GeoIP.dat.gz

Gefunden bei g-loaded.

WordPress 2.7 “Coltrane” ist fertig

Die lang erwartete neue WordPress-Version 2.7 “Coltrane” ist heute veröffentlicht worden. Vor allem das Backend wurde komplett neu gestaltet – ich poste gerade aus dem neuen QuickPress-Widget auf dem Dashboard. Allen WordPress-Nutzern sei also das Upgrade wärmstens empfohlen!

Spiegel online im 21. Jahrhundert angekommen: RSS-Feed mit Teaser und Bildern

Ich hätte nicht gedacht, dass dieser Tag kommt. Seit einigen Monaten habe ich den SpOn-Newsfeed nur noch punktuell gelesen, zu einem nicht unbedeutenden Teil aus dem Grund, weil dort nur die Schlagzeile selbst, nicht aber eine Zusammenfassung der Meldung oder gar Bilder per RSS übertragen wurden. So muss jeder Leser entweder aus seinem Feedreader den Artikel aufrufen, um mehr zu erfahren oder aber darauf verzichten. Das bringt zwar vielleicht teilweise mehr Page Impressions, einige suchen sich aber auch ganz andere Nachrichtenquellen – denn ordentliche RSS-Feeds sind mittlerweile Standard.
Seit heute (?) ist das anders: nicht nur der Teaser zur Meldung, nein, auch ein Bild ist im Feed zu sehen. Jetzt fehlt eigentlich nur noch heise online…

Wordpress 2.6 und Permalink-Problem

Zuerst: Wordpress 2.6 ist da! Mit tollen neuen Features (Revisionierung von Beiträgen!), aber leider auch Bugs.

Nach meinem Upgrade konnte ich leider Permalinks zu Artikeln nicht mehr erreichen (das offizielle Theme gibt eine 404er-Fehlermeldung), die Übersicht samt Paging und Permalinks zu Kategorien und Tags sowie “Seiten” waren erreichbar.

Zur Erklärung: ich verwendete keine mod_rewrite-Permalinks, sondern die PATHINFO-Permalinks im Stil

http://www.kallensee.info/journal/index.php/2008/08/22/test-beitrag

Nur bei diesen Permalinks, in denen die index.php vorkommt, tritt auch der Fehler auf.

Das Problem ist auch bereits bekannt. Ein Workaround wäre, in der Konfiguration unter Permalinks für Tags und Kategorien eine “Basis” einzutragen (ganz unten). Dadurch ändern sich allerdings Links zu Tags und Kategorien.

Ich habe den Bug gleich dazu genutzt, meine Permalinks auf die mod_rewrite-Variante umzustellen und von unnötigen Informationen zu bereinigen. Der SEO Blog brachte mich auf den Gedanken, dass die Datumsangabe in der URL ziemlich unnötig ist.

Das neue Permalink-Schema für Artikel ist deutlich schlanker als zuvor:

http://www.kallensee.info/journal/test-beitrag

Jetzt ist es natürlich an der Zeit, sich um die alten URLs zu kümmern. Alle Links – bis auf die Beitrags-Permalinks – werden von WordPress automatisch vom alten Format auf die neue Link-Struktur umgeleitet – Tags, Archive usw. Wichtig sind natürlich aber vor allem die Beitrags-Permalinks – die ja bei Google und anderen Blogs noch im alten Permalink-Format vorliegen. Damit die nicht auf einer Fehlerseite landen, habe ich in meine Apache-Konfiguration für den entsprechenden Host eine RedirectMatch-Direktive eingefügt:

RedirectMatch permanent ^/journal/index.php/200(6|7|8)/[0-9][0-9]/[0-9][0-9]/([A-Za-z0-9-/#]*) http://www.kallensee.info/journal/$2

Diese Direktive leitet alle Anfragen auf Beiträge des alten URL-Formats auf das neue Format um. Im Test werden aber alle URL’s korrekt umgeleitet. Wichtig: durch den Parameter “permanent” erfolgt die Weiterleitung mit dem HTTP-Statuscode 301, auf Deutsch: dem Anfragenden wird neben der neuen Adresse mitgeteilt, dass die Seite permanent “verzogen” ist. Für Suchmaschinen äußerst wichtig zu wissen.

Für Verbesserungsvorschläge bin ich jederzeit offen – zumindest optimieren kann man den regulären Ausdruck mit Sicherheit…

User-centered services

Mit identi.ca ist ein weiterer Offener Service an den Start gegangen – das war jedoch mit Sicherheit nicht der letzte Schritt in Richtung dezentralisierte, offene und User-zentrierte Services. Auf der Website von Evan Prodromou, “Erfinder” von identi.ca, finden sich Gedanken zu offenen sozialen Netzwerken. Es wird wirklich Zeit für offene Alternativen zu studiVZ, Facebook und co.!

Unter den Internet-Nutzern findet langsam ein Umdenken statt, wie eine kürzliche Erhebung feststellte. Wichtig ist auch weiterhin die Aufklärung im Bereich Datenschutz. Mit Sicherheit wissen beispielsweise die wenigsten Nutzer der gängigen Instant-Messaging-Services, wozu sie in den Nutzungsbedingungen zugestimmt haben – und tauschen trotzdem persönlichste Informationen über diese Netzwerke aus. Eine unwahrscheinlich gute Alternative im Bereich Instant Messaging ist Jabber bzw. XMPP. Dazu gibt es aber demnächst noch einen detaillierteren Artikel.

Einen passenden Artikel gegen “walled gardens” und für Dezentralisierung von Services findet man im Blog von Christian Car.

Update: Das Zitat von Evan passt einfach zu gut, um es nicht zu verlinken.

identi.ca – offenes Microblogging

In den letzten Tagen startete identi.ca, ein sehr vielversprechender Microblogging-Service im Twitter-Stil. Allerdings viel interessanter: die zugrundeliegende Software, laconi.ca, ist Open Source. Durch die Spezifikation OpenMicroBlogging hat jeder die Möglichkeit, die Software auf seinem Webserver selbst zu installieren und mit anderen Installationen zu vernetzen. Außerdem existiert bereits eine Jaber/XMPP-Integration sowie OpenID-Suport.

Die Software ist noch in einem recht frühen Stadium, die weitere Entwicklung bleibt auf jeden Fall spannend.

Midori: ein minimaler WebKit-Browser für Gnome

Gerade habe ich auf der Suche nach einem WebKit-Browser für Linux etwas interessantes gefunden: Midori. Ein minimaler GTK-Browser, der aber trotzdem überraschenderweise sehr praktische Funktionen mitbringt: beispielsweise einen Papierkorb für geschlossene Tabs und eine recht gute Suchmaschinenverwaltung mit Keywords! Obwohl er noch in einer Alpha-Version vorliegt, ein sehr interessanter Browser, zumindest zum Testen von Websites – und er ist auch in den Ubuntu-Paketquellen verfügbar.

Apache-Fehler: pcfg_openfile: unable to check htaccess file

Nachdem aus unerklärlichen Gründen ein Teil meines Webservers nicht mehr erreichbar war und der Browser immer meldete, dass der Zugriff auf das Verzeichnis nicht möglich sei, habe ich in den Apache-Error-Logs folgendes gefunden:

(13)Permission denied: /var/www/[...]/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable

Kam mir unbekannt vor – und obwohl die Fehlermeldung recht aussagekräftig war, kam ich erst hier auf die Spur: das Verzeichnis (bzw. schon ein Verzeichnis einige Ebenen tiefer) war für den Apache-User einfach nicht lesbar…