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.

02.11.2020: Angepasst an Version 0.7.2 von Baïkal sowie an Debian 10 (gilt auch für Raspberry Pi OS).

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.

Die Kurzfassung ist mit folgenden drei Befehl gegeben:

sudo apt-get install nginx php-fpm
sed -i "s/worker_processes 4;/worker_processes 1;/g" /etc/nginx/nginx.conf
sed -i "s/worker_connections 768;/worker_connections 128;/g" /etc/nginx/nginx.conf

Zusätzlich zu Nginx als Webserver und PHP-FPM benötigen wir noch SQLight für PHP. Außerdem werden noch ein paar PHP-Funktions-Module benötigt. Die nötigen Pakete können wir ganz einfach installieren:

sudo apt-get install php-sqlite3 php-curl php-mbstring php-xml

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 eine neue Datei _/etc/network/interfaces.d/eth0_1 angelegt und wie folgt befüllt werden.

auto eth0:1
iface eth0:1 inet static
  address 192.0.2.11
  netmask 255.255.255.0
iface eth0:1 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 /opt
sudo wget https://github.com/sabre-io/Baikal/releases/download/0.7.2/baikal-0.7.2.zip
sudo unzip baikal*.zip -d .
sudo chown -R www-data:www-data baikal/
sudo find baikal/ -type d -exec chmod 550 {} \;
sudo find baikal/ -type f -exec chmod 440 {} \;
sudo rm baikal-regular-*.tgz

Diese sieben Befehle wechseln in das Verzeichnis opt (wie optional), laden dort die Version 0.7.2 von Baïkal herunter, entpacken dieses Archive, wechseln den Besitzer des Ordners und setzen ein paar Rechte. Der letzte Befehl löscht das Download-Archiv 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 zwei Ordner config und Specific versammelt. So lässt sich die Rechteausweitung auf diese beschränken:

sudo chmod u+w baikal/config/baikal.yaml
sudo chmod u+w baikal/Specific/db
sudo chmod u+w baikal/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/php7.3-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;

  return 301 https://$host$request_uri; # 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 in meinem Fall von der Vorgabe ab und muss daher geändert werden:

 root  /opt/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/dav.php/calendars/[username]/[cal name]/
  • CalDav (für iOS/OS X): https://192.0.2.11/dav.php/principals/[username]/
  • CardDav (allgemein): https://192.0.2.11/dav.php/addressbooks/[username]/[card name]/
  • CarDav (für iOS/OS X): https://192.0.2.11/dav.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 die Daten im Ordner Specific. Darin enthalten ist die SQLight-Datei mit der Datenbank. Dazu kommt eine Einstellungsdatei im Ordner config. 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/config
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 /opt/baikal/config/baikal.yaml /var/backups/baikal/config
cp /opt/baikal/Specific/db/db.sqlite /var/backups/baikal/Specific/db/db.sqlite

/etc/init.d/nginx start