Radicale mit Docker einrichten

Wie man einen leichtgewichtigen CalDAV- und CardDAV-Server selbst hosten kann

Möchte man seine Kalender und Adressbücher nicht auf den Servern von Google oder Apple lagern, aber dennoch nicht darauf verzichten, diese Daten über verschiedene Geräte hinweg zu synchronisieren und damit auf Smartphone, Tablet und Computer den gleichen Datenstand zu haben, gibt es verschiedene alternative Dienste. Zu den wahrscheinlich am bekanntesten Alternativen zählt wahrscheinlich Nextcloud. Nextcloud ist nicht nur eine Cloud-Lösung zum synchronisieren von Dateien und Dokumenten, sondern bietet auch die Möglichkeit, seine Kalender und Adressbücher zentral zu verwalten und über die Protokolle CalDAV und CardDAV zu zwischen verschiedenen Endgeräten zu synchroniseren.

Wer jedoch lediglich einen schlanken CalDAV- und CardDAV-Server möchte, der könnte mal einen Blick auf Radicale werfen. Radicale ist ein Programm, das ausschließlich den Zweck hat, einen CalDAV- und CardDAV-Server zur Verfügung zu stellen. Es bietet weder eine aufwendige Benutzeroberfläche, noch eigene Client-Anwendungen, ist dadurch aber sehr schlank und Ressourcen schonend. Ein Aspekt, den ich bei Radicale ganz interessant finde, ist, dass die Daten nicht in einer Datenbank gespeichert werden, sondern dass Radicale für jeden Kalender und jedes Adressbuch einen Ordner auf dem Server anlegt und dort alle Kontakte als vcf-Dateien und Kalendereinträge als ics-Dateien abspeichert. Damit ist es prinzipiell möglich, die Dateien auch direkt in ein kompatibles Programm zu importieren.

Auch wenn ich von Radicale durchaus angetan bin, möchte ich dennoch darauf hinweisen, dass die zuletzt veröffentlichte Version (2.1.11) aus dem November 2018 stammt. Seither gab es auch nur Mitte 2019 ein paar Commits im GitHub-Repository von Radicale . Ich weiß also nicht, wie gut die Software noch gepflegt wird. Ein weiterer Punkt, den man bedenken sollte, ist, dass Radicale zwar auf den CalDAV- und CardDAV-Protokollen aufbaut, diese aber – bewusst - nicht vollumfänglich integriert, da das Ziel des Entwicklers war, eine möglichst einfache und schlanke Anwendung zu bauen.

Installation mit Docker

Radicale lässt sich einfach über die Kommandozeile auf einem Linux-System installieren. Ich beschreibe im Folgenden jedoch, wie man Radicale als Docker-Container installieren kann. Zum Zeitpunkt, als ich den Artikel verfasst habe, gab es zwar keinen fertigen Docker-Container, aber der Entwickler hat auf GitHub ein Dockerfile zur Verfügung gestellt, mit dem man sich einfach einen Docker-Container erstellen kann.

Zunächst lädt man sich also das Dockerfile herunter:

$ wget https://raw.githubusercontent.com/Kozea/Radicale/master/Dockerfile

Alternativ kann man natürlich auch den Inhalt des Dockerfiles einfach in ein leeres Textdokument kopieren und dieses im Verzeichnis seiner Wahl unter dem Namen Dockerfile (ohne Dateiendung) abspeichern.

Aus dem Dockerfile lässt sich dann mit einem Befehl ein Docker-Container erstellen, indem man im Terminal in den entsprechenden Ordner wechselt und den folgenden Befehl eingibt, wobei der Name des Containers (hier spectechular/radicale) und der Tag (hier latest) beliebig vergeben werden können.

$ docker build -t spectechular/radicale:latest .

Als nächstes sollte man Verzeichnisse für die Radicale-Konfiguration und Kalender- und Adressbuch-Daten erstellen (z. B. /srv/radicale/config und /srv/radicale/data).

Benutzer anlegen

Radicale ermöglichst es, für mehrere Benutzer eigene Kalender und Adressbücher anzulegen. Da man über die rudimentäre Benutzeroberfläche von Radicale keine Nutzer anlegen und verwalten kann, muss man dies über das Terminal machen. Radicale-Benutzer werden mit dem folgenden Befehl angelegt, woraufhin man nach einem Passwort gefragt wird und dieses anschließend noch einmal bestätigen muss. Die users-Datei habe ich bei mir im Ordner mit der Radicale-Konfiguration (/srv/radicale/config/users) abgespeichert. user1 ist der Name des Benutzers, der beliebig angepasst werden kann.

$ htpasswd -B -c /srv/radicale/config/users user1
New password:
Re-type new password:

Nach dem gleichen Prinzip können weitere Radicale-Benutzer angelegt werden, wobei das Argument -c nicht mehr notwendig ist, da die users-Datei bereits mit dem ersten Benutzer angelegt worden ist:

$ htpasswd -B /srv/radicale/config/users user2
New password:
Re-type new password:

Um die Nutzer für Radicale verfügbar zu machen, muss die Konfiguration noch entsprechend angepasst werden. Hierzu wechselt man im Terminal in das zuvor angelegte Config-Verzeichnis und lädt mit dem folgenden Befehl die Standard-Config von GitHub herunter:

$ wget https://raw.githubusercontent.com/Kozea/Radicale/master/config

In der Konfigurationsdatei werden nun die folgenden Zeilen ergänzt (wichtig: hier wird nicht der Pfad auf dem Server genutzt, sondern der Pfad, in dem das Verzeichnis /srv/radicale/config/ im Docker-Container eingebunden wird!):

[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/users
# encryption method used in the htpasswd file
htpasswd_encryption = bcrypt

SSL-Zertifikat erstellen

Ist der Radicale-Server nur aus dem lokalen Netzwerk heraus erreichbar, ist eine SSL-verschlüsselte Verbindung eigentlich nicht notwendig. Möchte man jedoch Kalender- und Kontakte-Apps von macOS nutzen, habe ich die Erfahrung gemacht, dass diese Probleme mit nicht-verschlüsselten Verbindungen haben. Für meine Zwecke reicht jedoch ein selbst-signiertes SSL-Zertifikat, das sich mit dem folgenden Befehl generieren lässt:

$ sudo openssl req -nodes -newkey rsa:2048 -keyout /srv/radicale/config/radicale.key.pem -out /srv/radicale/config/radicale.cert.pem -x509 -days 3650

Das so erstellte Zertifikat wird mit dem obigen Befehl im Verzeichnis /srv/radicale/config/ abgespeichert und hat eine Gültigkeitsdauer von 10 Jahren.

Um die SSL-Verschlüsselung mit Radicale nutzen zu können, wird nun noch der folgende Abschnitt in der Config-Datei ergänzt (wichtig: auch hier wird nicht der Pfad auf dem Server genutzt, sondern der Pfad, in dem das Verzeichnis /srv/radicale/config/ im Docker-Container eingebunden wird!)

[server]
hosts = 0.0.0.0:5232
ssl = True
certificate = /etc/radicale/radicale.cert.pem
key = /etc/radicale/radicale.key.pem

docker-compose.yml erstellen

Als letztes erstelle ich immer noch eine docker-compose.yml mit dem folgenden Inhalt. Hier werden auch die beiden erstellten Verzeichnisse (/srv/radicale/config und /srv/radicale/data) eigenen Verzeichnissen im Container zugewiesen:

version: "2"

services:

  radicale:
    image: spectechular/radicale:latest
    container_name: radicale
    hostname: radicale
    restart: always
    volumes:
     - /srv/radicale/data:/var/lib/radicale
     - /srv/radicale/config:/etc/radicale
    ports:
      - "5232:5232"

Mit dem Befehl docker-compose up -d wird der Container gestartet und nach kurzer Zeit lässt sich die Weboberfläche von Radicale unter der IP-Adresse des Servers gefolgt von dem vergebenen Port aufrufen.

/img/radicale/radicale_login.png

Login-Seite von Radicale

Nach dem Login hat man lediglich die Möglichkeit, neue Kalender und Adressbücher anzulegen bzw. vorhandene zu importieren. Das Bearbeiten einzelner Kalender- oder Adressbucheinträge ist nur über die jeweilige Client-Software auf dem Smartphone oder Computer möglich.

Die folgenden Beiträge könnten Dich auch interessieren: