Adventskalender 23. Dezember 2023 - Jenseits des Adventskalenders

Smalltalk
Antworten
Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Adventskalender 23. Dezember 2023 - Jenseits des Adventskalenders

Beitrag von paedubucher » 23.12.2023 11:00:36

Jenseits des Adventskalenders

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 Debianradicale. 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
Virtuelle Python-Umgebung einrichten und Radicale installieren

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 Debianpython3.11-venv benötigt:

Code: Alles auswählen

$ sudo apt install -y python3.11-venv
Das Setup wird mit dem neu erstellen Benutzer radicale durchgeführt, wozu beim Erstellen des Benutzers die Bash als Login-Shell festgelegt worden ist. So wechseln wir zu diesem Benutzer:

Code: Alles auswählen

$ sudo su - radicale
Die Daten sollen in /home/radicale/data zu liegen kommen:

Code: Alles auswählen

$ mkdir ~/data
In seinem $HOME-Verzeichnis wird eine virtuelle Umgebung im Unterverzeichnis app/ angelegt, aktiviert und zur Installation des entsprechenden Packages verwendet (das Präfix (env) vor dem Prompt gibt an, dass eine virtuelle Umgebung aktiv ist):

Code: Alles auswählen

$ mkdir app
$ cd app
$ python3 -m venv env
$ . env/bin/activate
(env) $ pip install Radicale
Erster Test

So wird es Zeit, Radicale versuchshalber zu starten:

Code: Alles auswählen

(env) $ python -m radicale --storage-filesystem-folder=~/data
In einem andere Terminal soll geprüft werden, ob das funktioniert:

Code: Alles auswählen

$ curl localhost:5232
Redirected to /.web
Das sieht schon einmal vielversprechend aus. Doch stoppen wir den Service wieder mit [Ctrl]-[C], um ihn zuerst zu konfigurieren.

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
Die systemd-Konfiguration wird neu geladen und Radicale gestartet:

Code: Alles auswählen

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now radicale.service
$ sudo systemctl is-active radicale.service
active
Proxy mit Authentifizierung

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 Debiannginx zum Einsatz kommen:

Code: Alles auswählen

$ sudo apt install -y nginx
Dazu legen wir folgende Konfiguration an (/etc/nginx/sites-available/default):

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;
    }
}
Eine Passwortdatei soll mithilfe von htpasswd aus Debianapache2-utils erstellt werden:

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
So sind wir bereit, den Proxy zu laden:

Code: Alles auswählen

$ sudo systemctl reload nginx.service
Ein Test mit curl sieht vielversprechend aus:

Code: Alles auswählen

$ curl -u paedubucher:********* http://localhost
Redirected to /.web
So können wir uns nun im Browser unter http://localhost einloggen und dort unseren ersten Kalender erstellen.

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:
  1. Führe das beschriebene Setup lokal aus und teste Radicale mit einem entsprechenden Client (z.B. mit Thunderbird). Erstelle testhalber mindestens einen Termin.
  2. Erkundige das Verzeichnis /home/radicale/data. Was lässt sich dort alles wiedererkennen? Kann der Termin einfach gefunden werden?
  3. Wie liesse sich ein Setup mit mehreren Benutzern bewerkstelligen?
  4. Was könnte an der nginx-Konfiguration noch verbessert werden?
Mit dem eigenen Kalenderserver und entsprechenden Terminen (mit Erinnerung!) sollten im neuen Jahr keine Termine mehr verpasst werden ‒ auch nicht für das Posten von Adventskalender-Türchen.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
mn77de
Beiträge: 155
Registriert: 23.11.2003 16:53:53
Wohnort: Übersee
Kontaktdaten:

Re: Adventskalender 23. Dezember 2023 - Jenseits des Adventskalenders

Beitrag von mn77de » 23.12.2023 12:55:29

Guter Beitrag, danke dafür.
Bis heute war mir zwar Caldav irgendwie ein Begriff, mit der genaueren Funktion hab' ich mich allerdings noch nie weiter beschäftigt.
Werde ich mir mal ansehen. :THX:
OpenSource! :THX:

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Adventskalender 23. Dezember 2023 - Jenseits des Adventskalenders

Beitrag von paedubucher » 23.12.2023 19:46:53

mn77de hat geschrieben: ↑ zum Beitrag ↑
23.12.2023 12:55:29
Guter Beitrag, danke dafür.
Bis heute war mir zwar Caldav irgendwie ein Begriff, mit der genaueren Funktion hab' ich mich allerdings noch nie weiter beschäftigt.
Werde ich mir mal ansehen. :THX:
Bei CalDAV bin ich aus dem Dateiformat noch nicht so schlau geworden bzw. aus den ganzen Datumsangaben. Ich würde gerne Termine, die über ein Jahr zurückliegen automatisch löschen, da ich bei solchen Sachen eher zur Effizienz als zur Nostalgie neige. Es gibt aber eine Vielzahl von Datumsfeldern, die wohl auch mit der Software zusammenhängt, von der aus Termineinladungen erstellt worden sind.

Vielleicht kann ich das über die Festtage hier mal analysieren und genauer auseinandernehmen.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Antworten