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.