Ein Adventskalender ist eine schöne Sache, zumal auf dem Debianforum, und kann uns auch nach der Adventszeit noch Freude bereiten. Doch hat der Dezember mehr als nur 24 Tage, und im neuen Jahr geht es wohl auch gleich weiter mit Terminen und anderen Verpflichtungen.
Ein guter Neujahrsvorsatz wäre es doch, keine Termine mehr zu verpassen. Hierzu hilft uns ein Kalender weiter, den wir selber betreiben und mit praktisch allen gängigen Clients (Thunderbird, Android-Apps) ansprechen können.
CalDAV
CalDAV ist eine Kalender-Erweiterung für WebDAV, welches selber eine Erweiterung von HTTP ist. Wer es genau wissen will, kann sich in die entsprechenden RFCs einlesen:
Radicale
Für CalDAV gibt es verschiedene freie Implementierungen. Eine, die unter Debian zur Verfügung steht, ist radicale. Neben Kalendern (CalDAV) können mit Radicale auch Kontakte (CardDAV) verwaltet werden. Es wird eine Vielzahl von Clients unterstützt.
Ich persönlich habe Radicale einmal vor 2-3 Jahren an einem Nachmittag privat auf einem Server aufgesetzt und verwende es seither täglich. Auch bei meinem früheren Arbeitgeber wurde es verwendet, gerade für firmenweit geteilte Kalender für Teamsitzungen oder Abwesenheiten.
Setup
Radicale ist in Python implementiert und kann als entsprechendes Paket bezogen werden. So soll hier die Installation mithilfe einer virtuellen Python-Umgebung demonstriert werden. Ausgangslage ist eine frische Installation von Debian 12 Bookworm (Hostname: bookworm).
Benutzer anlegen
Radicale soll mit einem eigenen Benutzer namens radicale ausgeführt werden, der hierzu mitsamt Gruppe erstellt wird:
Code: Alles auswählen
$ sudo useradd -m -d /home/radicale -U -s /usr/bin/bash radicale
Mithilfe einer virtuellen Python Umgebung können Pakete für verschiedene Anwendungen in unterschiedlichen Versionen installiert werden, ohne dass man bei Anpassungen die Stabilität anderer Anwendungen gefährden würde. Um eine virtuelle Python-Umgebung einrichten zu können wir zunächst das entsprechende Paket python3.11-venv benötigt:
Code: Alles auswählen
$ sudo apt install -y python3.11-venv
Code: Alles auswählen
$ sudo su - radicale
Code: Alles auswählen
$ mkdir ~/data
Code: Alles auswählen
$ mkdir app
$ cd app
$ python3 -m venv env
$ . env/bin/activate
(env) $ pip install Radicale
So wird es Zeit, Radicale versuchshalber zu starten:
Code: Alles auswählen
(env) $ python -m radicale --storage-filesystem-folder=~/data
Code: Alles auswählen
$ curl localhost:5232
Redirected to /.web
systemd-Unit erstellen
Erstellen wir eine systemd-Service-Unit, womit Radicale in Zukunft ausgeführt werden soll (/etc/systemd/system/radicale.service) ‒ jetzt sollten wir wieder mit einem anderen Benutzer arbeiten, der sudo verwenden kann:
Code: Alles auswählen
[Unit]
Description=Radicale CalDAV Server
Documentation=https://radicale.org/v3.html#documentation-1
After=network.target
[Service]
ExecStart=/home/radicale/app/env/bin/python -m radicale --storage-filesystem-folder=/home/radicale/data
User=radicale
Group=radicale
Restart=on-failure
[Install]
WantedBy=multi-user.target
Code: Alles auswählen
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now radicale.service
$ sudo systemctl is-active radicale.service
active
Radicale läuft auf Port 5232 und soll mit einem Proxy-Server unter Port 80 (und in einem produktiven Setup unter Port 443) ansprechbar gemacht werden. Der Reverse-Proxy soll sich auch gleich um die Authentifizierung kümmern. Als Reverse-Proxy soll nginx zum Einsatz kommen:
Code: Alles auswählen
$ sudo apt install -y nginx
Code: Alles auswählen
server {
listen 0.0.0.0:80;
location / {
auth_basic Restricted;
auth_basic_user_file /home/radicale/app/radicale.passwd;
proxy_pass http://localhost:5232;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
}
}
Code: Alles auswählen
$ sudo apt in stall apache2-utils
$ sudo su - radicale
$ htpasswd -c app/radicale.passwd paedubucher
New password: *********
Re-type new password: *********
Adding password for user paedubucher
$ exit
Code: Alles auswählen
$ sudo systemctl reload nginx.service
Code: Alles auswählen
$ curl -u paedubucher:********* http://localhost
Redirected to /.web
Mit einem Client wie Thunderbird kann nun Radicale ganz einfach als Netzwerkkalender eingebunden werden.
Übungen
Wer sich selber an Radicale versuchen will, kann folgende Übungen dazu erledigen:
- Führe das beschriebene Setup lokal aus und teste Radicale mit einem entsprechenden Client (z.B. mit Thunderbird). Erstelle testhalber mindestens einen Termin.
- Erkundige das Verzeichnis /home/radicale/data. Was lässt sich dort alles wiedererkennen? Kann der Termin einfach gefunden werden?
- Wie liesse sich ein Setup mit mehreren Benutzern bewerkstelligen?
- Was könnte an der nginx-Konfiguration noch verbessert werden?