[how to] Radicale auf dem Raspberry Pi installieren (CardDAV-/CalDAV-Server)

Radicale Raspberry Pi Logo

Um seine Kalender und Kontake auf mehreren Geräten syncron zu halten, gibt es verschieden Möglichkeiten. Am einfachsten geht das warscheinlich mit Google, die unterstützen viele Formate und machen auch den Export der Daten verhältnismäßig einfach. Bei Apple und Microsoft wird es außerhalb des eigenen Systems etwas umständlich.

Wer auf den Upload in die "Cloud" verzichten möchte, kann sich sog. CalDAV- bzw. CardDAV-Server einrichten. Gerade weil eine Synchronisation nicht permanent erfolgen muss, bietet es sich an, diesen Server im heimischen LAN zu betreiben, wofür sich wiederum der Raspberry Pi oder ein ähnlicher Minicomputer hervorragend eignet.

Wer auf seinem RasPi bereits einen Webserver wie Apache oder nginx laufen hat oder Wert auf ein hübsches (Web-)Frontend legt, der sollte sich Baïkal genauer ansehen und auch ownCloud hat entsprechende Features an Bord.

In einem Podcast von Marcus 'monoxyd' Richter zum Thema private Cloud bin ich auf Radicale aufmerksam geworden, einen einfachen Kalender- und Kontakte-Server, der als Python-Skript auf fast jedem System läuft. Glaubt man der Website, dann läuft der sogar ohne Konfiguration und Installation. Da dann aber ein paar Sachen doch nicht so klappen, wie ich mir das vorgestellt hatte und ich keine 100%ige out-of-the-box-Lösung gefunden habe, nochmal für mich selbst, falls ich mal kein Backup gemacht habe und für alle Suchenden:


[neuste Version von Github holen, Radicale installieren, Ordner anlegen, Konfig-Datei schreiben:]

git clone git://github.com/Kozea/Radicale.git
cd Radicale
sudo python setup.py install
sudo mkdir /etc/radicale
sudo nano /etc/radicale/config

Achtung! Die folgende Config funktioniert nur, wenn auch die nachfolgenden Teile diese Tutorials ausgeführt werden. Ansonsten bitte lesen, verstehen und Pfadangaben anpassen...

[server]
# CalDAV server hostnames separated by a comma
# IPv4 syntax: address:port
# IPv6 syntax: [address]:port
# For example: 0.0.0.0:9999, [::]:9999
# IPv6 adresses are configured to only allow IPv6 connections
hosts = 0.0.0.0:5232
# Daemon flag
daemon = True
# File storing the PID in daemon mode
pid = /home/radicale/radicale.pid
# SSL flag, enable HTTPS protocol
ssl = True
# SSL certificate path
certificate = /etc/ssl/server.crt
# SSL private key
key = /etc/ssl/server.key
# SSL Protocol used. See python's ssl module for available values
protocol = PROTOCOL_SSLv23
# Ciphers available. See python's ssl module for available ciphers
ciphers =
# Reverse DNS to resolve client address in logs
dns_lookup = True
# Root URL of Radicale (starting and ending with a slash)
base_prefix = /
# Possibility to allow URLs cleaned by a HTTP server, without the base_prefix
can_skip_base_prefix = False
# Message displayed in the client when a password is needed
realm = Radicale - Password Required

[encoding]
# Encoding for responding requests
request = utf-8
# Encoding for storing local collections
stock = utf-8

[auth]
# Authentication method
# Value: None | htpasswd | IMAP | LDAP | PAM | courier | http | remote_user | custom
type = htpasswd

# Htpasswd filename
htpasswd_filename = /etc/radicale/users
# Htpasswd encryption method
# Value: plain | sha1 | crypt
htpasswd_encryption = sha1

[rights]
# Rights backend
# Value: None | authenticated | owner_only | owner_write | from_file | custom
type = owner_write

[storage]
# Storage backend
# Value: filesystem | multifilesystem | database | custom
type = filesystem

# Folder for storing local collections, created if not present
filesystem_folder = /home/radicale/collections

[logging]
# Logging configuration file
# If no config is given, simple information is printed on the standard output
# For more information about the syntax of the configuration file, see:
# http://docs.python.org/library/logging.config.html
config = /etc/radicale/logging
# Set the default logging level to debug
debug = False
# Store all environment variables (including those set in the shell)
full_environment = False

[System-User radicale anlegen, htpasswd installieren, Benutzer eines Kalenders erstellen, SSL-Zertifikate erzeugen, Autostart-Skript schreiben:]

sudo adduser --quiet --system --group --disabled-password radicale

sudo apt-get install apache2-utils
sudo htpasswd -sc /etc/radicale/users mustermann
sudo openssl genrsa -out /etc/ssl/server.key 2048
sudo openssl req -new -x509 -days 365 -key /etc/ssl/server.key -out /etc/ssl/server.crt
sudo nano /etc/init.d/radicale

#! /bin/bash
### BEGIN INIT INFO
# Provides:          radicale daemon
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: radicale server daemon
# Description:       Daemon script to run a radicale permanent peer
#                    Placed in /etc/init.d.
### END INIT INFO
# Author: Nicolas Bernaerts 
# Version:
#  V1.0, 06/09/2013 - Creation
#  V1.1, 09/09/2013 - Use under-priviledged system user
#  V1.2, 15/12/2014 - Changes for radicale
#  V1.3, 26/01/2015 - Fix in do_start if pid file was not deleted

# description variables
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="radicale server"
NAME="radicale"
USER=$NAME
DAEMON=/usr/local/bin/$NAME
ROOT=/home/$NAME
PIDFILE=$ROOT/$NAME.pid

# Exit if radicale program is not installed
if [ ! -x "$DAEMON" ] ; then
  echo "Binary $DAEMON does not exist. Aborting"
  exit 0
fi

# Exit if radicale user home directory doesn't exist
if [ ! -d "$ROOT" ]; then
  echo "User $USER does not exist. Aborting"
  exit 0
fi

# Function that starts the daemon/service
#  0 - daemon started
#  1 - daemon already running
#  2 - daemon could not be started
do_start()
{
  # If needed, start the daemon
  start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $USER --exec $DAEMON --test
  RETVAL="$?"
  if [ "$RETVAL" = "1" ];
  then
    echo "$NAME already running"
  else
    start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $USER --exec $DAEMON
    RETVAL="$?"
    [ "$RETVAL" = "0" ] &&  echo "$NAME started"
  fi

  return "$RETVAL"
}

# Function that stops the daemon/service
#  0 - daemon stopped
#  1 - daemon already stopped
#  2 - daemon could not be stopped
do_stop()
{
  # Stop the daemon
  start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
  RETVAL="$?"
  [ "$RETVAL" = "0" ] && echo "$NAME stopped"
  [ "$RETVAL" = "1" ] && echo "$NAME was not running"

  # remove pid file
  rm -f $PIDFILE

  return "$RETVAL"
}

# deal with different parameters : start, stop & status
case "$1" in
  #  start service
  start)
    do_start
    ;;
  # stop service
  stop)
    do_stop
    ;;
  # restart service
  restart)
    do_stop
    do_start
    ;;
  # unknown command, display help message
  *)
    echo "Usage : $SCRIPTNAME {start|stop|restart}" >&2
    exit 3
    ;;
esac

[ausführbar machen, Runlevel hinzufügen, Server starten]

sudo chmod +x /etc/init.d/radicale
sudo update-rc.d radicale defaults
sudo service radicale start

Nun sollte der Server laufen und mit den entsprechenden Clients auf Smartphone und PC können nun Kalender unter https://[ip]:5232/mustermann/[kalendername].ics/ bzw. Kontakte unter https://[ip]:5232/mustermann/[kontakttgruppe].vcf/ gespeichert und synchronisiert werden.


Kommentare

Gravatar von Erl
Hallo, ich wollte mir radicale auf einem Banana Pi installiern. Bitte ändere "Radicale" in "radicale" -> sudo python Radicale/setup.py install Annsonsten läuft da noch einiges bei mir schief. Mit dem Code-Block klappt es auch nicht. Schaut mal hier -> http://forum-bananapi.de/Thread-Radicale-f%C3%BCr-Adressbuch-und-Kalender P.S.: Bitte lösche meinen ersten Kommentar
Erl |
Gravatar von deed
Hallo Erl,
also Radicale muss groß geschrieben werden. Aber ich habe den Fehler bei gefunden: versuch es mal mit cd Radicale und dann mit sudo python setup.py install. Ich habe das Tutorial entsprechend angepasst.

Gruß
deed |
Gravatar von Oliver
Hallo, ich habe nach deiner Anleitung radicale installiert auf dem Pi. Leider kann ich via Evolution keine Termin eintragen. erhalte immer die Fehlermeldung dsa die Legitimation gescheitert sei. Nutzername und Passwort sind definitiv korrekt. Allerdings verwirrt mich in der Anleitung die URL [https://] esist doch CalDav.
Oliver |
Gravatar von deed
Hallo Oliver,
CalDAV ist eine Erweiterung zum HTTP, insofern hat das https:// schon seine Berechtigung (siehe WP). Wo dein Problem genau liegt, kann ich aus der Ferne nicht sagen. Ob deine Daten stimmen, kannst du ausprobieren, indem du mit dem Browser https://raspi.ip:5232 aufrufst, dann solltest du deine Daten eingeben können und dann müsste dort 'Radicale works' stehen.
Wenn das funktioniert, könntest du noch überprüfen, ob deine URL stimmt, dort muss, wo im Beispiel mustermann steht, dein Nutzername hin, sonst geht es nicht.
Sag doch Bescheid, obs geklappt hat, oder nicht.

Gruß
deed |
Gravatar von Hardy
viell hilft ein: sudo chown -R Username /etc/radicale/
Hardy |
Gravatar von Marcus
Vielen Dank für die schöne Anleitung. Um Schreibzugriffe auf die SD-Karte zu vermeiden, habe ich an meinem Raspi einen USB-Stick angeschlossen. Für Programminstallationen habe ich eine Möglichkeit, um auf die SD-Karte zu schreiben. Welche Dateien legt Radicale wo an? Wo kann ich deren Pfade einstellen, so dass Radicale schreibend nur auf den Stick zugreift. Wo ist der Speicherort für die Kalender- und Adressbuchdateien? Marcus
Marcus |
Gravatar von Felix
Hallo, danke für das Tutorial... ich habe aber ein Problem: wenn ich ganz zum Schluss sudo service radicale start eingebe, kommt als Antwort: Job for radicale.service failed. See 'systemctl status radicale.service' and 'journalctl -xn' for details. In systemctl status radicale.service wird ausgegeben: ? radicale.service - LSB: radicale server daemon Loaded: loaded (/etc/init.d/radicale) Active: failed (Result: exit-code) since Mon 2015-11-30 12:31:07 UTC; 13s ago Process: 8989 ExecStart=/etc/init.d/radicale start (code=exited, status=203/EXEC) und bei journalctl -xn erscheint No journal files were found. Wenn mir jemand einen Tip geben könnte, wäre ich recht dankbar...
Felix |
Gravatar von Felix
Edit: Offenbar habe ich aus irgendeinem Grund keinen Schreibzugriff mehr auf die SD-Karte... Vielleicht hängt das zusammen. Werde das System nochmal neu aufsetzen.
Felix |

Kommentar schreiben
Folgende HTML-Tags sind erlaubt:
  • <a href="" title=""></a>
  • <abbr title=""></abbr>
  • <br />
  • <blockquote cite=""></blockquote>
  • <code></code>
  • <em></em>
  • <strike></strike>
  • <strong></strong>