Uff, da hab ich mal wieder länger ringen müssen. Aus ominösen Gründen wollte ich mal wieder eine Instanz meiner bevorzugten Blogsoftware aufsetzen. Weil sich aber die Platte des Servers mittlerweile ganz gut mit Instanzen füllt, sollte diesmal eine Shared-Installation her, bei der sich früher oder später mal alle Instanzen eine Code-Basis teilen (weniger mangels Platz, sondern wegen des Pflegeaufwandes). Soweit der Plan...
Nun gibt es dafür eine Anleitung, über der dick und fett steht: "WARNING: THIS FEATURE IS EXPERIMENTAL!". Experimentell ist es in der Tat, vor allem wenn die Anleitung und meine Vorstellung davon, was gewisse Dinge bedeuten, aufeinander treffen. Wenn man dann noch zusätzlich mod_vhost mit in den Ring schmeißt, dann ist das Chaos fast perfekt. Aber von vorn.
Ziel der Aktion war folgendes: eine Subdomain blogs.example.com unter der man einfach und ohne Probleme neue Blogs anlegen kann. Dazu sollte nur eine Serendipity-Installation verwendet werden (kein Bock da mehrere zu pflegen). Gut, der Anfang ist einfach: mod_vhost ist schon aktiv, einen neuen VirtualHost im Apachen anlegen (ServerName blogs.example.com, ServerAlias *.blogs.example.com) und im DNS *.blogs.example.com auf die IP des VirtualHost zeigen lassen. In dem VirtualHost Ersetzt man nun noch DocumentRoot durch folgende Zeilen (vorausgesetzt die Bloginstallation liegt am Ende mal unter /home/blogs.example.com/:
UseCanonicalName Off
VirtualDocumentRoot /home/blogs.example.com/subdomains/%1
Nun kann man ganz einfach durch Anlegen eines neuen Verzeichnisses in /home/blogs.example.com/subdomains eine neue Subdomain anlegen. (Beispiel: test.blogs.example.com wird mit der Konfiguration auf /home/blogs.example.com/subdomains/test abgebildet). Ausprobieren, ob das Konstrukt funktioniert und dann weitermachen.
Nächster Schritt: die Installation von Serendipity. Man lädt das normale Package runter (die LITE-Installation bringt die Dateien nicht mit, die man für die Shared-Installation-Geschichte braucht) und entpackt es nach /home/blogs.example.com/s9y. WICHTIG: der Pfad MUSS als letzten Teil s9y haben. Entpackt man die Dateien standardgemäß, dann landen sie in einem neuen Verzeichnis namens serendipity. Dessen Inhalt muss man nach s9y verschieben. Der Pfad ist im Code hart verdrahtet. Wenn man das Verzeichnis anders benennt, dann darf man sich auf unerklärliche Internal Server Errors freuen.
Zuguterletzt muss man dem Apache noch sagen, wo er sich seine PHP-Dateien zusammensuchen soll. Tut man das nicht, dann findet der Deployment-Code (siehe unten) die Dateien der Shared Installation nicht. Dazu trägt man in den VirtualHost noch folgende Zeile ein (ob /usr/share/php und /usr/share/pear hier wirklich notwendig sind, weiß ich nicht. Eigentlich stehen die bei Debian im "Master Value" für include_path. Vielleicht weiß da jemand ja mehr...):
php_value include_path ".:/usr/share/php:/usr/share/pear:/home/blogs.example.com:/home/blogs.example.com/s9y:/home/blogs.example.com/s9y/bundled-libs"
Außerdem hilft es, wenn man dem Apache noch erlaubt die .htaccess-Dateien, die Serendipity so mitbringt auch zu interpretieren. Dazu muss man in den Block <Directory /home/blogs.example.com/subdomains>...<Directory> in der Apache-Config bei AllowOverride All eintragen. Damit darf die .htaccess innerhalb der Subdomain-Verzeichnisse alle möglichen Änderungen vornehmen. Wer das einschränken will muss rausfinden, was genau benötigt wird und das dann dort entsprechend angeben.
Nun kann man mit folgendem Skript recht einfach eine neue Bloginstanz anlegen:
#! /bin/sh
BASE_DIR=/home/blogs.example.com
if [ x$1 == x ]; then
echo "Please supply a subdomain-name for the blog.";
exit 1;
fi
mkdir /home/$BASE_DIR/subdomains/$1
$(
cd /home/$BASE_DIR/subdomains/$1
cp -r ../../s9y/deployment/* .
ln -s ../../s9y/templates .
ln -s ../../s9y/htmlarea .
)
chown -R www-data.www-data /home/$BASE_DIR/subdomains/$1
su - postgres -c "createdb $1blogsexamplecom"
su - postgres -c "createuser -S -D -R -P -E $1blogsexamplecom"
Das Skript tut eigentlich nicht viel: es legt ein passendes Verzeichnis an um die Subdomain zu aktivieren, kopiert die Deployment-Dateien von Serendipity (ein paar kleine PHP-Dateien, die am Ende mal dafür sorgen, dass aus der Shared-Installation die gemeinsamen Dateien angesprungen werden), verlinkt templates und WYSIWYG-Editor passend und überträgt die Rechte an den Webserver-User. Die letzten beiden Zeilen legen noch die Datenbank und den passenden User zum neuen Blog an (Passwort wird erfragt). Das ist natürlich nur für die bei mir verwendete PostgreSQL gültig. Wer was anderes verwendet muss hier entsprechend anpassen.
Tja, wenn das alles fehlerfrei durchgelaufen ist, dann kann man eigentlich schon die Domain http://<name>.blogs.example.com besuchen. Dort wird man vom Installationsskript von Serendipity begrüßt, welches den eben angelegten DB-Nutzer wissen will und dann seine Arbeit erledigt. Für das (doch eigentlich recht einfache) Vorgehen hab ich jetzt doch 2 Stunden gebraucht um's auszutüfteln..
P.S: Das in der Originalanleitung erwähnte open_basedir muss man leider weglassen, weil es nicht zusammen mit mod_vhost spielen mag. Speziell der Subdomain-spezifische Teil des Pfades würde hier Probleme machen.