dav.domain.tld
Statt 5 Apps können Sie für sich und den engeren Kreis auch Kalender, Kontakte und Aufgaben selbst hosten.
Mit verschachtelten Gruppen in LDAP hat das den Vorteil, dass Sie auch einen Login für die ganze Gruppe einrichten können und so eigene, aber auch geteilte Kalender, Aufgaben und Kontakte nutzen können.
Das ist zwar in größerer Software auch möglich, braucht aber dort extra Gruppen und hier mit wenig Aufwand auf dem Server machbar, denn wir nutzen für den Login Dovecot mit.
apt install radicale python3-radicale-dovecot-auth
Wir aktivieren radicale auf allen Interfaces, denn es läuft ohne root-Rechte und leitet Logins nur weiter. Sie können radicale halbwegs bedenkenlos direkt im Internet einsetzen.
/etc/radicale/config
[server]
hosts = 0.0.0.0:5232
Wir brauchen auch hier zwingend ein 🗝️ LetsEncrypt-Zertifikat. Dazu kommt, dass radicale nicht mit root-Rechten läuft (was eigentlich sehr schön ist) und daher keine Schlüssel lesen kann.
Deshalb erstellen wir in LetsEncrypt einen renewal deploy-hook der den Schlüssel nach jeder Aktualisierung kopiert und radicale neu startet:
Holen Sie explizit für dav.domain.tld ein eigenes Zertifikat:
root@server:/etc/letsencrypt# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/ns1.krei.se.rfc2136.ini -d 'dav.domain.tld.'
In /etc/letsencrypt/live/dav.domain.tld
liegen nur Symlinks, kopieren wollen wir aber immer den aktuellen Schlüssel
/etc/letsencrypt/renewal-hooks/deploy/radicale.sh
#!/bin/bash
# $RENEWED_DOMAINS enthält die aktualisierten Domains mit Leerzeichen getrennt (i.d.R. nur eine)
# $RENEWED_LINEAGE enthält den Pfad zu /etc/letsencrypt/live/domain.tld
if grep --quiet "dav.domain.tld" <<< "$RENEWED_DOMAINS"; then
# Unbedingt -L nutzen um Symlinks zu folgen (dereferenzieren), sonst kopieren Sie nur den Symlink!
cp -L $RENEWED_LINEAGE/fullchain.pem /etc/radicale/dav.domain.tld.fullchain.pem
cp -L $RENEWED_LINEAGE/privkey.pem /etc/radicale/dav.domain.tld.privkey.pem
chown radicale:radicale /etc/radicale/dav.domain.tld.*.pem
# Schlüssel ist Standard 600, Zertifikat 644 was uns hier genügt.
# chmod 660 /etc/ejabberd/ssl.*.pem
systemctl restart radicale
fi
Checken, dass es auf eine neue Zeile endet und das Skript mit chmod +x radicale.sh
ausführbar machen.
📝 Wer den Deploy testen will braucht unter Debian Bookworm mit Certbot 2.1.0 derzeit noch certbot certonly -d 'service.domain.tld'
📝 Ab Certbot 3 gibt es wohl --run-deploy-hooks
in Verbindung mit --dry-run
um einen Deploy-Hook zu testen. Da sich certbot manuell nur über pip updaten lässt lassen wir diesen Edge-Case hier weg.
/etc/radicale/config
[server]
ssl = True
certificate = /etc/radicale/dav.domain.tld.fullchain.pem
key = /etc/radicale/dav.domain.tld.privkey.pem
Radicale kann sich per Plugin auch direkt gegen LDAP oder per IMAP authentifizieren, diese Plugins sind aber nicht in Debian als Standard enthalten, weshalb ich hier nur das Plugin python3-radicale-dovecot-auth abdecke, denn nur dieses wird von Debian automatisch aktuell gehalten.
Das Plugin erwartet, dass Dovecot einen lokalen Unix-Socket oder einen Netzwerk-Socket für den service auth bereitstellt - was wir in der Regel nur für localhost oder VPN-Clienten erlauben (da unverschlüsselt).
Läuft dav.domain.tld auf derselben Maschine wie mail.domain.tld (wovon ich mal stark ausgehe) ist das also kein Problem, für größere Installationen entweder mal über das IMAP-Plugin nachdenken oder die Server per VPN verbinden.
/etc/radicale/config
[auth]
type = radicale_dovecot_auth
# Unix
# auth_socket = unix:/var/spool/postfix/private/auth - muss von radicale lesbar sein, group setzen!
# Inet - einfacher, aber auth_socket muss leer sein
auth_socket =
auth_host = 127.0.0.1
auth_port = 26
/etc/radicale/config
[storage]
# Storage backend
# Value: multifilesystem | multifilesystem_nolock
#type = multifilesystem
# Folder for storing local collections, created if not present
#filesystem_folder = /var/lib/radicale/collections
Der Standard-Speicherort für Radicale ist /var/lib/radicale - allerdings scheint Debian hier root:root als User zu haben.
root@server:~# chown -R radicale:radicale /var/lib/radicale
Löst dieses Problem. Wer den Speicherort für Backups intuitiver haben will, kann das ändern.
Zum Anlegen von Kalendern und Kontaktlisten lohnt sich den internen Webserver anzuschalten:
/etc/radicale/config
[web]
# Web interface backend
# Value: none | internal
type = internal
Nicht vergessen: systemctl enable radicale && systemctl start radicale
Damit Clienten keine 100 Zeichen Pfade eingeben müssen empfielt sich auf dem Name- und Webserver der KOMPLETTEN DOMAIN SRV-Records und eine Text-Datei zu hinterlegen
SRV _caldavs._tcp dav.domain.tld 10 100