Baïkal und RaspberryPi

Permalink

Nachdem ein Raspberry Pi grundlegend eingerichtet ist geht es daran die gewünschten Services bereitzustellen. Für Kalender und Adressbücher habe ich die Software Baïkal entdeckt. Diese ermöglicht es Termine und Kontakte von mehreren Personen zu verwalten und über die Protokolle CalDAV und CardDAV mit verschiedensten Geräten zu synchronisieren.

Webserver und PHP

Baïkal basiert auf PHP und speichert die Daten mittels SQLight (MySQL geht aber auch). Dadurch bedingt muss ein Webserver, ein PHP-Interpreter und die Bibliotheken für die Datenbank installiert sein. Wie das mit dem Server Nginx auf einem Raspberry Pi, gelingt hat Jan Karres in seinem Blogbeitrag Raspberry Pi: Webserver Nginx installieren sehr schön dargestellt. Ich empfehle daher diese Anleitung zu befolgen bevor es hier weitergeht.

Zusätzlich zu Nginx als Webserver und PHP-FPM benötigen wir noch SQLight. Die nötigen Pakete können wir ganz einfach installieren:

sudo apt-get install sqlite php5-sqlite

Netzwerk vorbereiten

Um Baïkal möglichst problemlos betreiben zu können empfehle ich die Software unter einer eigenen IP-Adresse laufen zu lassen. Dazu muss die Datei /etc/network/interfaces wie folgt ergänzt werden.

auto eth0:1
iface eth0:1 inet static
  address 192.0.2.11
  netmask 255.255.255.0
iface eth0 inet6 static
  address 2001:DB8::11
  netmask 32

Hierdurch wird ein virtuelles Netzwerkinterface mit Namen eth0:1 angelegt und diesem Interface sowohl eine neue IPv4- als auch eine neue IPv6-Adresse zugewiesen. Unter diesen Adressen kann man dann Baïkal in Nginx einrichten.

TLS

Um die Kommunikation mit Nginx zu verschlüsseln braucht es ein Zertifikat. Ein solches lässt sich recht einfach erstellen. Die folgenden Befehle legen erst einen Schlüssel und darauf basierend ein selbst signiertes Zertifikat an. Dieses Zertifikat verwendet man dann in der Definition des Nginx-Hosts die später erstellt wird.

sudo mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
sudo openssl genrsa -out baikal.key 4096
sudo openssl req -new -sha256 -key baikal.key -out baikal.csr
sudo openssl x509 -req -sha256 -days 3650 -in baikal.csr -signkey baikal.key -out baikal.crt

Installation

Nach den obigen Vorbereitungen nun zu eigentlichen Installation. Auch hier hat Jan Karres wieder Vorarbeit geleistet und einen passenden Artikel veröffentlicht. Ich habe jedoch ein paar Dinge anders gemacht und gehe daher noch einmal gesondert auf die Installation ein:

cd /usr/share/nginx/
sudo wget http://baikal-server.com/get/baikal-regular-0.2.7.tgz
sudo tar -xvzf baikal-regular-0.2.7.tgz
sudo mv baikal-regular/ baikal/
sudo chown -R www-data:www-data baikal/
sudo find baikal/ -type d -exec chmod 755 {} \;
sudo rm baikal-regular-*.tgz

Diese sieben Befehle wechseln in das Verzeichnis in dem Nginx die Webseiten speichert, laden dort die Version 2.7 von Baïkal herunter, entpacken dieses Archive, benennen es um, wechseln den Besitzer des Ordners und setzen ein paar rechte. Der letzte Befehl löscht das Download-Archive wieder, Ordnung muss sein.

Baïkal benötigt Schreibrechte für die Datenbank mit den Einträgen und die Konfigurationsdateien. Glücklicherweise sind diese Dateien in einem Ordner Specific versammelt und so lässt sich die Rechteausweitung auf diesen beschränken:

sudo chmod 755 Specific/
sudo chmod 755 Specific/db/
sudo chmod 755 Specific/db/db.sqlite

Baïkal enthält bereits eine Konfigurationsdatei für Nginx. Diese kopiert man nach /etc/nginx/sites-available.

 sudo cp Specific/virtualhosts/baikal.nginx /etc/nginx/sites-available/baikal

Die Datei muss allerdings noch ein wenig angepasst werden. Unter anderem passt die Angabe zum PHP-Interpreter nicht. Die Angabe fastcgi_pass muss wie folgt angepasst werden:

fastcgi_pass unix:/var/run/php5-fpm.sock;

Außerdem muss der block mit den Servereinstellungen durch zwei neue Blöcke ersetzt werden. Der erste dieser Blöcke leitet HTTP-Requests auf verschlüsseltes HTTPS weiter. Der Zweite lässt Nginx auf eben dieses Protokoll hören. Hier kommt das oben erzeugte Zertifikat zum Einsatz.

server { 
  listen 192.0.2.11:80;
  listen [2001:DB8::11]:80;
  server_name 192.0.2.11;
  rewrite ^ https://$server_name$request_uri? permanent; # enforce https 
}

server {
  listen 192.0.2.11:443 ssl;
  listen [2001:DB8::11]:443 ssl;
  ssl_certificate /etc/nginx/ssl/baikal.crt;
  ssl_certificate_key /etc/nginx/ssl/baikal.key;
  ...

Die dritte Anpassung betrifft den Speicherort von Baïkal. Dieser weicht auf dem Pi von der Vorgabe ab und muss daher geändert werden:

 root  /usr/share/nginx/baikal/html;    

In obigen Beispielen müssen natürlich die IP-Adressen angepasst werden. Danach kann Baïkal aktiviert werden. Dazu wird ein Link zur Konfigurationsdatei im Ordner /etc/nginx/sites-enabled angelegt und Nginx neu gestartet.

sudo ln -s /etc/nginx/sites-available/baikal /etc/nginx/sites-enabled/baikal
sudo /etc/init.d/nginx restart

Ersteinrichtung

Es ist soweit: Unter der URL https://192.0.2.11/admin/install/ kann man mit der Nutzung von Baïkal beginnen. Nach ein paar allgemeinen Fragen kann man den ersten Benutzer einrichten und schon ist der Server einsatzbereit.

Auf zum Client

Baïkal bietet kein Webinterface um auf die Kalender oder Adressbücher zuzugreifen. Hierfür braucht man entsprechende Client-Software. Ich benutze auf dem PC das Gespann aus Thunderbird und Lightning (für Kalender) ergänzt um das Plugin SOGo Connector. Unter Android die beiden Apps CalDAV-Sync und CardDAV-Sync. Es gibt aber weitere Alternativen die die beiden Protokolle CardDAV und CalDAV unterstützen.

Die nötigen URL’s die man bei der Konfiguration braucht lauten wie folgt:

  • CalDav (allgemein): https://192.0.2.11/cal.php/calendars/[username]/[cal name]/
  • CalDav (für iOS/OS X): https://192.0.2.11/cal.php/principals/[username]/
  • CardDav (allgemein): https://192.0.2.11/card.php/addressbooks/[username]/[card name]/
  • CarDav (für iOS/OS X): https://192.0.2.11/card.php/principals/[username]/

Die IP und die in eckigen Klammern gesetzten Variablen sind natürlich anzupassen.

Backup

Damit nichts verloren geht sollte man natürlich ein Backup machen. Baïkal speichert alle veränderlichen Daten im Ordner Specific. Darin enthalten sind die SQLight-Datei mit der eigentlichen Datenbank. Dazu kommen zwei PHP-Dateien mit der Konfiguration. In diesen werden die Angaben gespeichert die man im Webinterface von Baïkal eingibt.

Vor dem Backup sollte man kurz den Webserver anhalten damit keine aktiven Verbindungen im Moment des Backups Änderungen vornehmen.

Das folgende, ganz einfache, Script erledigt das Backup. Es schließt dabei auch die Konfiguration von Nginx inklusive des SSL-Zertifikats ein. Da auch der Key für dieses Zertifikat im Backup enthalten ist sollte man dieses sicher verwahren. In der vorliegenden Fassung werden die Dateien nach /var/backups/ geschrieben. Von dort aus kann man sie dann jederzeit an einen sicheren Ort kopieren.

#!/bin/bash

mkdir /var/backups/nginx
mkdir /var/backups/nginx/ssl
mkdir /var/backups/nginx/sites-available
chmod -R 600 /var/backups/nginx
find /var/backups/nginx/ -type d -exec chmod 700 {} \;
mkdir /var/backups/baikal
mkdir /var/backups/baikal/Specific
mkdir /var/backups/baikal/Specific/db
chmod -R 600 /var/backups/baikal
find /var/backups/baikal/ -type d -exec chmod 700 {} \;

/etc/init.d/nginx stop

cp /etc/nginx/ssl/baikal.* /var/backups/nginx/ssl/
cp /etc/nginx/sites-available/baikal /var/backups/nginx/sites-available/baikal
cp /usr/share/nginx/baikal/Specific/db/db.sqlite /var/backups/baikal/Specific/db/db.sqlite
cp /usr/share/nginx/baikal/Specific/*.php /var/backups/baikal/Specific/

/etc/init.d/nginx start