Raspberry Pi: Radicale CalDAV und CardDAV Server installieren
Seine Kontakte und Kalender bei Google und Co. zu synchronisieren ist nicht jedermanns Sache. Dank des CalDAV bzw. CardDAV Standards lässt sich ein solcher Service auch selbst betreiben und der Raspberrry Pi eignet sich, auf Grund dessen niedrigen Energiekonsums, für diesen Zweck exzellent. Möchte man neben Kontakte und Kalender auch Dateien synchronisieren so bietet es sich an die entsprechenden Funktionen von Owncloud zu verwenden. Wenn man hingegen nur Kontakte und den Kalender abgleichen möchte kann man neben Baïkal auch auf Radicale als CalDAV und CardDAV Server zurückgreifen. Wie man Radicale auf dem Raspberry Pi installiert erkläre ich im Folgenden.
Voraussetzung: Raspbian oder vergleichbare Distribution installiert
Zunächst müssen wir mittels des Paketmanagers APT das Paket python-dev installieren, damit die verwendete Software später ordentlich funktioniert.
sudo apt-get install python-dev
Anschließend müssen wir Radicale von dessen Projektseite als Source Package herunterladen und entpacken. Zum Zeitpunkt als dieser Artikel verfasst wurde war Version 0.9 aktuell.
wget http://pypi.python.org/packages/source/R/Radicale/Radicale-0.9.tar.gz
tar xzvf Radicale-*.tar.gz
Außerdem sollten wir bcrypt für Python installieren, damit die Authentifizierung von Radicale später besser abgesichert ist. Zum Zeitpunkt als dieses Tutorial erschien war Version 0.4 aktuell.
wget http://py-bcrypt.googlecode.com/files/py-bcrypt-0.4.tar.gz
tar xzvf py-bcrypt-0.4.tar.gz
cd py-bcrypt-0.4
sudo python setup.py build && sudo python setup.py install
cd ..
Damit bcrypt in Radicale verwendet wird müssen wir folgende Zeilen in das Script einfügen. In dem Editor nano kann man mittels STRG + W suchen und mittels STRG + X, Y und Enter speichern.
nano Radicale-*/radicale/auth/htpasswd.py
import bcrypt
einfügen nach der Zeile
import os
außerdem müssen folgende Zeilen an das Ende der Datei eingefügt werden
def _bcrypt(hash_value, password): """Check if ``hash_value`` and ``password`` match using bcrypt method.""" hash_value = hash_value.encode("ascii") password = password.encode(config.get("encoding", "stock")) return bcrypt.checkpw(password, hash_value)
Jetzt können wir das in Python geschriebene Radicale installieren.
cd Radicale-*
sudo python setup.py install
Nachdem die Software installiert ist müssen wir einen Ordner für die Konfigurationen der Software anlegen und in diesem eine Konfigurationsdatei erzeugen.
sudo mkdir /etc/radicale
sudo nano /etc/radicale/config
[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 = # SSL flag, enable HTTPS protocol ssl = True # SSL certificate path certificate = /etc/radicale/ssl/server.crt # SSL private key key = /etc/radicale/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 # Usernames used for public collections, separated by a comma public_users = public # Usernames used for private collections, separated by a comma private_users = private # Custom authentication handler custom_handler = # Htpasswd filename htpasswd_filename = /etc/radicale/users # Htpasswd encryption method # Value: plain | sha1 | crypt | bcrypt htpasswd_encryption = bcrypt # LDAP server URL, with protocol and port ldap_url = ldap://localhost:389/ # LDAP base path ldap_base = ou=users,dc=example,dc=com # LDAP login attribute ldap_attribute = uid # LDAP filter string # placed as X in a query of the form (&(...)X) # example: (objectCategory=Person)(objectClass=User)(memberOf=cn=calenderusers,ou=users,dc=example,dc=org) # leave empty if no additional filter is needed ldap_filter = # LDAP dn for initial login, used if LDAP server does not allow anonymous searches # Leave empty if searches are anonymous ldap_binddn = # LDAP password for initial login, used with ldap_binddn ldap_password = # LDAP scope of the search ldap_scope = OneLevel # IMAP Configuration imap_hostname = localhost imap_port = 143 imap_ssl = False # PAM group user should be member of pam_group_membership = # Path to the Courier Authdaemon socket courier_socket = # HTTP authentication request URL endpoint http_url = # POST parameter to use for username http_user_parameter = # POST parameter to use for password http_password_parameter = [git] # Git default options committer = Radicale <[email protected]> [rights] # Rights backend # Value: None | authenticated | owner_only | owner_write | from_file | custom type = owner_only # Custom rights handler custom_handler = # File for rights management from_file file = ~/.config/radicale/rights [storage] # Storage backend # Value: filesystem | multifilesystem | database | custom type = filesystem # Custom storage handler custom_handler = # Folder for storing local collections, created if not present filesystem_folder = ~/.config/radicale/collections # Database URL for SQLAlchemy # dialect+driver://user:password@host/dbname[?key=value..] # For example: sqlite:///var/db/radicale.db, postgresql://user:password@localhost/radicale # See http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html#sqlalchemy.create_engine database_url = [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 # Additional HTTP headers #[headers] #Access-Control-Allow-Origin = *
Da wir Radicale mit einer SSL verschlüsselten Verbindung verwenden werden müssen wir hierfür ein selbst signiertes Zertifikat anlegen. Dabei werden bei letzterem Befehl mehrere Fragen gestellt. Bei Country Name geben wir DE (ggf. abweichend) und bei Common Name die IP-Adresse des Raspberry Pis oder, falls verwendet, die DynDNS Domain an. Alle anderen Felder können wir mittels Enter überspringen.
sudo mkdir /etc/radicale/ssl
cd /etc/radicale/ssl
sudo openssl genrsa -out server.key 4096
sudo openssl req -new -x509 -sha256 -days 3650 -key server.key -out server.crt
Aus Sicherheitsgründen legen wir für Radicale den Benutzer radicale an in den wir anschließend wechseln. Die gestellten Fragen beim Anlegen des Benutzers können mittels Enter übersprungen werden.
sudo adduser --disabled-login radicale
Benutzer wechseln
sudo su radicale
Jetzt müssen wir ein Script anlegen mit dem wir später neue Benutzer anlegen können. Dieses eigene Script wird nötig, da wir bcrypt zur Verbesserung der Sicherheit verwenden.
cd ~
nano add-user.py
#!/usr/bin/env python import bcrypt from optparse import OptionParser parser = OptionParser() parser.add_option("-u", "--user", dest="username", help="Username") parser.add_option("-p", "--password", dest="password", help="Password which will be hashed using bcrypt") parser.add_option("-w", "--workfactor", dest="workfactor", default="12", help="Workfactor of bcrypt, the higher the more secure") (options, args) = parser.parse_args() if options.username == None or options.password == None: parser.print_help() else: hashed = bcrypt.hashpw(options.password, bcrypt.gensalt(int(options.workfactor))) with open("/etc/radicale/users", "a") as configfile: configfile.write(options.username + ":" + hashed + "\n") print "Radicale user created"
Es ist nun an der Zeit mittels folgenden Kommandos den CalDAV und CardDAV Server zu starten. Wenn dies ordentlich funktioniert erhält man keinerlei Ausgabe.
radicale
Damit Radicale automatisch beim Booten des Raspberry Pis startet müssen wir den Befehl zum Starten am Ende der Datei /etc/rc.local vor „exit 0“ eintragen, wozu wir jedoch zunächst den Benutzer radicale verlassen müssen.
exit
sudo nano /etc/rc.local
# Start radicale su -c radicale radicale
Damit ist der Radicale CalDAV und CardDAV Server installiert und einsatzbereit. Bevor wir jedoch synchronisieren können müssen wir noch einen oder mehrere Benutzer anlegen.
Das zuvor angelegte Script zum Anlegen eines Benutzers führen wir nun aus. Dabei muss man USERNAME durch den gewünschten Benutzernamen und PASSWORD durch das gewünschte Passwort ersetzen. Der Befehl muss als ein Benutzer mit sudo-Rechten ausgeführt werden (Standard pi).
sudo python /home/radicale/add-user.py -u USERNAME -p PASSWORD
Endgültig fertig! Wir können die Kalender und Kontakte nun auf den Geräten synchronisieren. Wie man verschiedenste Clients einrichtet wird in der Radicale Dokumentation schön erklärt.
Zugriff außerhalb des eigenen Netzwerks
Portfreigabe im Router
Soll der soeben installierte Dienst auch außerhalb des eigenen Netzwerkes verfügbar sein, so müssen folgende Ports im Router freigegeben werden. Wie man freigibt, beschrieb ich in dem Artikel Portforwarding bei Fritz!Box und Speedport.
76 Kommentare. Hinterlasse eine Antwort
Danke für die Anleitung hab ich ja schon lange gewartet drauf
In Step 4 hast du ein Fehler
nano Radicale-*/radicale/auth/htpasswd.py
1
import bcrypt
einfügen nach der Zeile
1
import bcrypt
zweimal import bcrypt
Danke. Ist verbessert. Das ging mir durch die Lappen 😉
Hi,
ich wüde zum Schutz der Zertifikate noch folgende Befehle ausführen.
sudo chmod 600 /etc/radicale/ssl/server.key
sudo chmod 600 /etc/radicale/ssl/server.crt
Wie schlägt sich Radicale im Vergleich zu Baikal?
Gruß
Michi
Das ist keine gute Idee, da Radicale unter dessen Benutzer ausgeführt wird und folglich nicht die nötigen Rechte hätte auf die Dateien zuzugreifen. Klar, könnte man auch anderes lösen (Besitzrechte ändern), aber in der Regel sollte das auf einem Raspberry Pi wirklich kein Problem darstellen.
Beim Versuch Benutzer anzulegen kommt:
File „/home/radicale/add-user.py“, line 14
parser.print_help()
^
IndentationError: expected an indented block
Da musst du beim Kopieren der Datei etwas falsch gemacht habe. Versuch es doch noch einmal 😉
Da sind bei mir je ein Tabulator in Zeile 14 und 17 beim kopieren verloren gegangen. Jeweils unter „if“ und „else“.
Einfach einfügen, dann gehts 🙂
Hallo, danke für die tolle Anleitung. Habe jedoch auch ein Problem. Wenn ich neue Benutzer anlegen will, erhalte ich: [sudo] password for radicale: . Habe ich übersehen, wo das Passwort definiert wird? Freilassen geht nicht.
Hab den letzten Schritt angepasst, da war ich unaufmerksam. Jetzt funktioniert es 🙂
Hallo auch ich habe den Fehler von Markus:
sudo python /home/radicale/add-user.py -u ytest -p ytest
>
File „/home/radicale/add-user.py“, line 14
parser.print_help()
^
IndentationError: expected an indented block
Hat Jemand eine Lösung?
Ich denke du hast da was falsch kopiert. Habe es gerade selbst ausprobiert und es hat problemlos funktioniert. Versuche doch noch einmal die Datei neu anzulegen.
Hi,
bei Step 4 muss es doch heißen sudo ./setup.py install oder?
🙂
Ich nehme an du meinst bei step 5, aber nein, mit Python Scripts läuft das etwas anders 😉
Hallo, erstmal SUPER Anleitung! Danke.
Allerdings ist mir aufgefallen dass im letzten Schritt bei
sudo python /home/radicale/add-user.py -u USERNAME -p PASSWORD
er das Passwort nur korrekt übernimmt wenn ich es in „“ setze. Ansonsten interpretiert er es als Code und folglich kann ich mich nicht einloggen.
Hallo,
Danke für die Anleitung!
habe soweit alles zum Laufen bekommen, wollte dann mehrere user anlegen, dabei gibt es aber probleme:
zum einen scheint das add-user.py die weiteren user, die man anlegt, alle weiter in die 1.te zeile zu schreiben, habe das manuell korrigiert, weiss aber nicht ob die datei (users) die namen + passwörter jetzt im richtigen format enthält?!
In Lightning klappt das hinzufügen von Kalendern des ersten users, die des 2.ten klappen nicht mehr. Ist das jetzt ein Problem von Lightning?? Lightning fragt ja beim ersten user das passwort noch ab, beim 2.ten allerdings nicht mehr. kein Wunder dass es dann nicht geht??
Mit nur einem User klappt es sehr gut, konnte das Konto sogar auf einem windows phone einrichten. Allerdings liessen sich hier Termine nicht mehr löschen?
war als nicht – linux user ganz überrascht, dass es doch relativ einfach einzurichten war, wenn auch einige Hürden übersprungen werden mussten. Mit dem einrichten von mehreren usern komme ich jetzt aber nicht weiter.
was würdet Ihr denn für so jemanden wie mich (in linux unerfahren, möchte Kalender + Kontakte zwischen Lightning (Windows) und Mobil (im Moment Windows Phone) synchronisieren (für mehrere Personen), aber möglichst mit eigener Lösung (keine MS oder andere Cloud), und sollte möglichst einfach einzurichten sein? gibt es da eine empfehlenswerte Alternative zu Radicale?
Danke, Stefan
Auch ich hatte einige Schwierigkeiten bei mehreren Usern, liess sich dann aber lösen: Im Script zum Anlegen der User muss die Zeile angepasst werden, in der der Benutzer in die Datei geschrieben wird:
configfile.write(options.username + „:“ + hashed + „\n“)
Durch das Einfügen von + „\n“ (der Rest bleibt gleich) wird die Zeile beendet und der nächste Benutzer wird in einer neuen Zeile in die Datei users eingetragen.
Ich wollte für mehrere Personen je einen Kalender haben, wobei alle Personen alle Kalender lesen dürfen und habe in der Konfigurationsdatei die Berechtigung angepasst:
[rights]
type = owner_write
Nur der Owner kann einen Kalender anlegen und beschreiben (das gilt wohl auch bei der Einstellung owner_only).
Daher muss auf jeden Fall immer der owner angemeldet sein, um einen Kalender aus Lightning heraus anzulegen. Beim ersten Kalender geht’s problemlos. Zum Anlegen jedes weitern Kalenders muss man Thunderbird nur einmal beenden (das Passwort aber nicht speichern!!!) und neu starten. Diesmal mit einem anderen Benutzer anmelden und dessen neuen Kalender anlegen.
Habe die Verbesserung des Scripts im Artikel eingepflegt. Danke!
Hallo und Danke für die tollen Aleitungen!
Ich habe nun mehrfach eine Installation nach Tutorial vorgenommen (mit Radicale 0.0.10) und bekomme bei Thunderbird/Lightning unter Ubuntu immer folgende Fehlermeldung:
Server Replied with 500 / MODIFICATION_FAILED / Status-Code: 2147746065, Die Anfrage kann nicht verarbeitet werden.
Bin für Hilfe sehr dankbar!
Auf meiner Fehlersuche habe ich es mit und ohne SSL versucht. Mit eingeschaltetem SSL hat mich Thunderbird anfangs wegen der Unsicherheit meines eigens erstellten Zertifikates gewarnt, sodass ich annehme, dass der Server von Python gestartet richtig läuft.
Nach Eingabe von sudo netstat -plnt erfolgt folgende Zeile:
tcp 0 0 0.0.0.0:5232 0.0.0.0:* LISTEN 2084/python
sudo ps aux | grep radicale ergibt folgende Antwort:
radicale 2084 0.1 1.1 22084 8436 ? Sl Feb15 3:30 /usr/bin/python /usr/local/bin/radicale
Versuche gerade die Synchronisation innerhalb meines Netzwerkes (um weniger Fehlerquellen zu haben) und habe auch schon einen anderen an sich laufenden Pi ausprobiert, ohne Erfolg.
Allerdings kann ich den Ordner, der in der config-Datei für Speicherung in einer Datei angegeben ist ~/.config/collections nicht finden und dieser wird meiner Meinung nach offensichtlich nicht angelegt.
Auf meinem Android-Phone bekomme ich ebenfalls keine Verbindung.
Danke für Eure Hilfe,
Dirk
Klingt so als würde der Server eine Fehler zurückwerfen. Schau mal ob du Logfiles von Radicale findest du darin eine nähere Fehlerbeschreibung.
Hallo Dirk.
die Dateien die du suchst, findest du sehr wahrscheinlich unter /home/radicale/.config/collections
Vielen Dank für die Hilfe und für Mittdenken.
Genau dieses Verzeichnis („/.config“) finde ich weder unter dem Hauptuser noch unter dem angelgten radicale-user.
Ich finde auch keine logfiles von Radicale. Diese hatte ich selber angelegt, wie es in der Dokumentation beschrieben steht und hatte radicale –debug ausgeführt, was jedoch nicht geholfen hat. In dem selbst angelegten Logfile ist auch kein Eintrag nach dem Versuch einen Kalender in Thunderbird zu erstellen.
Komme irgendwie nicht weiter…
Hey,
danke für die Anleitung.
Nochmal die Frage von Michi oben wiederholt, wie verhält sich Radicale im Vergleich zu Baikal? Letzteres habe ich aktuell laufen und würde wissen, welche Vor-/Nachteile es gibt 🙂
Hallo,
so wie ich das verstanden habe ist es aktuell mit Baikal nicht möglich Kalender mit mehreren Nutzern zu verwalten.
Rechtemanagement ist ebenfalls nicht möglich.
Für Familienkalender etc. bietet sich daher Radicale eher an.
Außerdem ist Baikal PHP-basiert und Radicale Python, was ich auf einem RPi bevorzugen würde.
Gruß,
Dirk
Dirk hat die wesentlichen Aspekte meiner Meinung nach schon auf den Punkt gebracht. Ich würde momentan auch eher zu Radicale greifen, da es meiner Erinnerung nach auch wesentlich weniger buggy war.
Hallo, hat jemand schon mal die Synchronisation von unter ios8 Kontakten hinbekommen? Kalender geht, aber die Kontakte nicht…Ich habe auch keinen Ansatz zum Suchen…
Ich habe nur Erfahrung mit iOS6, aber es gibt mehrere Sachen zu beachten:
– die url muss auf ‚.vcf/‘ enden, also z.B. https://192.168.2.100:5232/gavor/kontakte.vcf/
– iOS integriert die Kontakte nur, wenn schon Kontakte vorhanden sind, d.h. du müsstest vom Desktoprechner o.ä. einen Testkontakt anlegen und dann sollte unter iOS in der Kontakte-App oben links ‚Gruppen‘ stehen
– man kann unter iOS keine Kontakte verschieben 🙁
Hey Deed, danke, ich teste das mal.
Ich nutze Easy Backup (kostet), um iOS Kontakte zu sichern und zu verschieben. Klappt prima.
Gruß, Gavor
Hallo
Die Beschreibung ist ja sehr umfangreich, vielen Dank dafür.
Ich habe mit dem Script add-user.py Probleme. Das Programm habe ich per Copy and Paste geholt (mehrfach) und auch direkt eingegeben. Die Fehlermeldung ist immer dieselbe:
File „/home/radicale/add-user.py“, line 18
with open(„/etc/radicale/users“, „a“) as configfile:
IndentationError: unexpected indent
Wurde das Programm zwischendurch mal geändert?
Die Python Version auf meinem Raspberry ist 2.7.3, ich habe es aber auch mit Python 3 probiert.
Vielen Dank
Robert
Nach der Antwort von Jan läuft das Programm jetzt.
Die Einrückungen führe ich hier jetzt mal an (mit Zeile und Tab):
08:help…
10:help…
14:parser.print_help()
16:hashed…
17:bcrypt…
18:with…
19:configfile…
20:print…
Nochmals vielen Dank
Robert
Die eingegebenen Tabs werden wohl interpretiert, daher nochmal anders:
08, 10, 14, 16, 18 und 20: 1 Tabulator
17 und 19: 2 Tabulatoren
Hallo Jungs,
super Anleitung. Wie mache ich aber die Kalender öffentlich zum lesen, aber zum bearbeiten passwortgeschützt?
Danke!
Schau dir am besten mal Rights Management in der Radicale Dokumentation an. Dort sind die Möglichkeiten des Rechtesystems ganz schön beschrieben.
Hallo,
erst mal : prima Anleitung, hat fast gut funktioniert. Allerdings bekomme ich beim Start von radicale jede menge Fehler.
Zuerst einmal habe ich radicale 0.10 benutzt. ansonsten die Anleitung befolgt.
sSTarte ich nun radicale kommen 8 Fehler der Art:
File „/usr/local/bin/radicale“, line 32, in radicale.__main.run()
File „/usr/local/lib/phyton2.7/dist-packages/radicale__main__.py“, line 54, in configure_from_file (filename, debug)
usw. denke das zeigt 2 Dinge
1. Ich habe nur wenig Ahnung von LINUX (versuche mch gerade daran…)
2. Ich habe irgendwas falsch gemacht – wahrscheinlich etwas triviales.
Kann mir mal einer auf die Sprünge helfen damit?
Danke im Vorraus Pete.
Schreib mit bitte die ganzen Fehler, denn nur so habe ich eine sinnvolle Chance dir zu helfen.
Ich bekomme mit dem von Raspbian zur Verfügung gestellten Paketen in Version 0.9 ebefalls Fehler, hier der Output:
Traceback (most recent call last):
File „/usr/bin/radicale“, line 32, in
radicale.__main__.run()
File „/usr/lib/python2.7/dist-packages/radicale/__main__.py“, line 93, in run
log.start()
File „/usr/lib/python2.7/dist-packages/radicale/log.py“, line 45, in start
logging.config.fileConfig(filename)
File „/usr/lib/python2.7/logging/config.py“, line 78, in fileConfig
handlers = _install_handlers(cp, formatters)
File „/usr/lib/python2.7/logging/config.py“, line 156, in _install_handlers
h = klass(*args)
File „/usr/lib/python2.7/logging/__init__.py“, line 901, in __init__
StreamHandler.__init__(self, self._open())
File „/usr/lib/python2.7/logging/__init__.py“, line 924, in _open
stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: ‚/var/log/radicale/radicale.log‘
Dazu muss ich anfügen, dass ich die Änderungen in der htpasswd.py erst nach der Installation eingefügt habe. Da Python zur Laufzeit kompiliert wird, sollte es daran aber nicht liegen, oder?
Versuch mal folgendes. Evl. wurde nur das Logfile nicht initiiert.
mkdir /var/log/radicale
touch /var/log/radicale/radicale.log
Hallo, sorry – war dienstlich unterwegs…..
hier das ergebnis nach anlegen des Log verzerzeichnisses und der Datei. Gruß Peter
Traceback (most recent call last):
File „/usr/local/bin/radicale“, line 32, in
radicale.__main__.run()
File „/usr/local/lib/python2.7/dist-packages/radicale/__main__.py“, line 93, $
log.start()
File „/usr/local/lib/python2.7/dist-packages/radicale/log.py“, line 54, in st$
configure_from_file(filename, debug)
File „/usr/local/lib/python2.7/dist-packages/radicale/log.py“, line 40, in co$
logging.config.fileConfig(filename)
File „/usr/lib/python2.7/logging/config.py“, line 78, in fileConfig
handlers = _install_handlers(cp, formatters)
File „/usr/lib/python2.7/logging/config.py“, line 156, in _install_handlers
h = klass(*args)
File „/usr/lib/python2.7/logging/__init__.py“, line 901, in __init__
StreamHandler.__init__(self, self._open())
File „/usr/lib/python2.7/logging/__init__.py“, line 924, in _open
stream = open(self.baseFilename, self.mode)
IOError: [Errno 13] Permission denied: ‚/var/log/radicale/radicale.log‘
Traceback (most recent call last):
Hallo,
habe nun das ganze gelöscht und mit radicale 0.9 nach Anleitung wiederholt. Dort gibt es bei dem start von radicale KEINE Fehler und die installation klappt soweit gut.
sry. Also dann…..
traceback (most recent call last):
File „/usr/local/bin/radicale“, line 32, in
radicale.__main__.run()
File „/usr/local/lib/python2.7/dist-packages/radicale/__main__.py“, line 93, $
log.start()
File „/usr/local/lib/python2.7/dist-packages/radicale/log.py“, line 54, in st$
configure_from_file(filename, debug)
File „/usr/local/lib/python2.7/dist-packages/radicale/log.py“, line 40, in co$
logging.config.fileConfig(filename)
File „/usr/lib/python2.7/logging/config.py“, line 78, in fileConfig
handlers = _install_handlers(cp, formatters)
File „/usr/lib/python2.7/logging/config.py“, line 156, in _install_handlers
h = klass(*args)
File „/usr/lib/python2.7/logging/__init__.py“, line 901, in __init__
StreamHandler.__init__(self, self._open())
File „/usr/lib/python2.7/logging/__init__.py“, line 924, in _open
stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: ‚/var/log/radicale/radicale.log‘
Gruß Peter
Scheint ein schwerwiegenderes Problem zu sein – Vielleicht hat jemand das schon am Laufen und kann mal etwas zu dem Problem sagen? Wäre sehr dankbar.
Gruß Peter
Hallo,
danke für die Anleitung. Nach ersten Problemen,
ist es mir gelungen, den Server aufzusetzen.
Ich hoffe, dass ich mit folgender Frage hier richtig bin.
Ich habe vor, den Kalender auf dem Pi, durch ein Script mit Terminen zu füllen.
Kennt jemand einen Linux-Client, mit dem ich dies umsetzten kann?
Eine API für Kalenderdateien wäre natürlich auch eine Lösung.
Hat jemand einen Tipp für mich?
Grüße Alexander
Suche bei der Suchmaschine deines Vertrauens am besten mal nach „caldav import“. Unter diesem Stichwort findest du zahlreiche Lösungen.
Hallo,
vielen Dank für die Antwort.
Inzwischen habe ich herausgefunden, dass man die .ics Datei unter /home/radicale/.config/radicale/collections/[user]/[Kalendername].ics findet.
Diese ics Datei ist nach dem Format RFC 2445 iCalendar erstellt worden und enthält in meinem Fall alle Informationen über Ereignisse im Kalender.
Nun kann man, mit Hilfe eines Script’s, die Datei auslesen und Änderungen vornehmen.
Grüße Alexander
Um nachfolgenden Usern die Suche im Netz zu ersparen: Ich hatte Probleme mit einer leeren Sync-Liste in DAVDroid:
Ich hatte ein wenig Schwierigkeiten Radicale mit DAVDroid zu synchronisieren.
Zum einen bekam ich die Verbindung nur mit einer von der Dokumentation abweichenden Adresse (ohne Radicale):
„https://[server]:5232/[username]/“
Zum Anderen – und das betrifft scheinbar auch andere Clients – ist DAVDroid scheinbar nicht in der Lage selbstständig die Kalender und Kontakt Datei zu erstellen! Jedenfalls war bei mir nach erfolgreicher Verbindung die Liste mit zu synchronisierenden Elementen leer.
Die Dateien liegen im Home Verzeichniss von Radicale-User im Ordner des mit dem add-user.py erstellten Users:
~/.config/radicale/collections/[username]
und können mit
touch [kalendername].ics
touch [kontaktdateiname].vcf
erstellt werden. Das hat bei mir auch wunderbar funktioniert!
————–
Warum auch immer das nicht in der Radicale Dokumentation unter DAVDroid steht, unter dem Punkt „InfCloud, CalDavZAP & CardDavMATE“ habe ich gerade folgendes gefunden, was wohl ebenfalls geholfen hätte:
[…]
„InfCloud, CardDavMATE and CalDavZAP cannot create calendars and/or address books. They need to be created before first login. Each user needs to have minimum of one calendar and/or one adressbook even if only using shared addresses and/or calendars. Client will not login, if the user collections don’t exists.“
[…]
„You can easily create them by directly calling the URL’s from your browser:
http(s)://host.example.com:5232/user/calendar.ics/
http(s)://host.example.com:5232/user/addresses.vcf/
Replace „http(s)“ with the correct protocol, „host.example.com:5232“ with you host:port where Radicale is running,
„user“ with the correct login name or the shared resource name i.e. ‚public‘,
„calendar.ics“ and „addresses.vcf“ with the collection names you want to use
and do NOT forget the ‚/‘ at line end.“
[…]
strg+f tags: [Ordnerliste Leer] [DAVDroid] [keine Element zum synchronisieren]
LG
Vielen Dank für die super Anleitung. Wirklich sehr hilfreich. Allerdings habe ich ein Problem beim Schreiben der User/Passwort-Kombination in die ‚users‘ Datei. Ich habe den Code so kopiert wie hier angeben und nur den Pfad zu ‚users‘ angepasst. Die Datei wird auch größer, wenn ich das Skript ausführe, aber leider ist sie komplett leer und enthält nicht die neu erstellten User.
Ich würde mich über ein paar Tipps, woran das liegen könnte, freuen.
Anscheinend ist es irgendein Update-Problem des Servers gewesen. Ich habe das ganze am nächsten Tag nochmal ausprobiert. Jetzt läuft es so wie es soll und die User-Passwort Paare werden in die users-Datei geschrieben und gespeichert.
Hallo,
prima Anleitung, vielen Dank dafür!
Ich habe mich nach dem Testen von radicale dazu entschlossen, doch lieber eine andere Software zu nutzen.
Könntest du mir sagen, wie ich radicale wieder sauber deinstallieren kann?
Eine kleine Anleitung hierzu findet du bei stackoverflow.
Perfekt!
Herzlichen Dank, dass du dein Wissen teilst!!
Hallo Jan,
ich suche nach einer Möglichkeit Kontakte und Kalender zwischen meinem iPhone, meinem Mac und meinem PC zu synchronisieren.
Auf meinem iPhone benutze ich die Standart-Apps (Kalender, Kontakte)
Auf meinem Mac benutze ich Outlook for Mac 2016 (unterstützt weder CalDAV noch CardDAV)
Auf meinem PC benutze ich ebenfalls Outlook 2010 (unterstützt Stock auch nicht diese beiden Protokolle)
Es ergibt sich folgendes Problem
Auf dem iPhone, geht ja Cal- und CardDAV, auf dem PC mit Outlook würde es auch gehen mit einem Zusatzprogramm wie cFOS und EVO Collaborator for Outlook. Damit hätte ich zumindest schonmal zwei Geräte synchron. Jedoch finde ich leider nichts wie ich Outlook auf dem Mac mit Cal- bzw. CardDAV synchron halten kann.
Ich habe dann an einen Exchange Server oder an einen LDAP-Server gedacht.
Wenn du ein Zusatzprogramm für den Mac wüsstest dann wäre ich die sehr verbunden.
Als Synchronisierungssoftware würde ich dann OwnCloud oder Baikal-Server nehmen. Oder hast du eine Bessere Idee?
Ich danke dir schonmal im Voraus und hoffe du hast eine Lösung für mich
Mit freundlichen Grüßen
Domi
Leider klappt die Installation mit Radicale 1.0.1 nicht. Zweimal versucht, jedesmal die folgende Fehlermeldung:
radicale@raspberrypi /etc/radicale $ radicale
Traceback (most recent call last):
File „/usr/local/bin/radicale“, line 4, in
__import__(‚pkg_resources‘).run_script(‚Radicale==1.0.1‘, ‚radicale‘)
File „/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py“, line 699, in run_script
self.require(requires)[0].run_script(script_name, ns)
File „/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py“, line 1624, in run_script
exec(script_code, namespace, namespace)
File „/usr/local/lib/python2.7/dist-packages/Radicale-1.0.1-py2.7.egg/EGG-INFO/scripts/radicale“, line 29, in
File „build/bdist.linux-armv6l/egg/radicale/__init__.py“, line 51, in
File „build/bdist.linux-armv6l/egg/radicale/auth/__init__.py“, line 28, in
File „build/bdist.linux-armv6l/egg/radicale/config.py“, line 105, in
File „/usr/lib/python2.7/ConfigParser.py“, line 305, in read
self._read(fp, filename)
File „/usr/lib/python2.7/ConfigParser.py“, line 512, in _read
raise MissingSectionHeaderError(fpname, lineno, line)
ConfigParser.MissingSectionHeaderError: File contains no section headers.
file: /etc/radicale/config, line: 1
‚1\n‘
Was läuft da falsch?
Guenter
Bitte ersatzlos streichen 😉
Hatte eine Datei nicht einwanfrei kopiert/installiert. Jetzt läuft am Prompt ‚radicale‘ ohne Problem, aber leider klappt es per Browser Zugriff nicht.
Mal sehen …
Danke für’s Tutorial … GREAT!
Günter
Erst mal vielen Dank an Jan für seine vielen, extrem hilfreichen Anleitungen rund um den Raspberry Pi!
Beim Einrichten von radicale (v 1.0.1) mithilfe dieser Anleitung bin ich auf folgendes Problem gestoßen:
– Radicale lässt sich ohne Fehlermeldung starten, es kann aber keine Verbindung aufgebaut werden.
– Beim Start mit „daemon = False“ in der config habe ich folgende Fehlermeldung erhalten:
Traceback (most recent call last):
File „/usr/local/bin/radicale“, line 5, in
pkg_resources.run_script(‚Radicale==1.0.1‘, ‚radicale‘)
File „/usr/lib/python2.7/dist-packages/pkg_resources.py“, line 499, in run_script
self.require(requires)[0].run_script(script_name, ns)
File „/usr/lib/python2.7/dist-packages/pkg_resources.py“, line 1235, in run_script
execfile(script_filename, namespace, namespace)
File „/usr/local/lib/python2.7/dist-packages/Radicale-1.0.1-py2.7.egg/EGG-INFO/scripts/radicale“, line 32, in
radicale.__main__.run()
File „/usr/local/lib/python2.7/dist-packages/Radicale-1.0.1-py2.7.egg/radicale/__main__.py“, line 133, in run
make_server(address, port, Application(),
File „/usr/local/lib/python2.7/dist-packages/Radicale-1.0.1-py2.7.egg/radicale/__init__.py“, line 135, in __init__
auth.load()
File „/usr/local/lib/python2.7/dist-packages/Radicale-1.0.1-py2.7.egg/radicale/auth/__init__.py“, line 43, in load
„auth.%s“ % auth_type, globals=globals(), level=2)
File „/usr/local/lib/python2.7/dist-packages/Radicale-1.0.1-py2.7.egg/radicale/auth/htpasswd.py“, line 131, in
raise RuntimeError((„The htpasswd_encryption method ‚bcrypt‘ requires “
RuntimeError: The htpasswd_encryption method ‚bcrypt‘ requires availability of the passlib module with bcrypt support.
– Die Lösung des Problems war daher einfach das Packet passlib zu installieren:
sudo apt-get install python-passlib
Jetzt funktioniert die Synchronisation fehlerfrei.
Vielen Dank noch einmal an Jan.
Hallo Stefan,
vielen Dank für deinen Hinweis!
Ich stand bei der aktuellen Radicale-1.0.1 Version ebenfalls vor dem gleichen Problem. Nun läuft alles.
Gruß
Stefan
auch besten dank von mir. das gleiche problem trat mit radicale 1.1.2 auch auf.
HI, danke für die Anleitung. Leider funktioniert radicale bei mir nicht so gut wie baikal zuvor. Zum einen ist es unglaublich langsam und zum anderen kann ich nur eine einzige Telefonnummer unter Android erreichen bzw. angeben. Bei der baikal Lösung waren ganz normal weitere Adressfelder hinzufügbar. Hat das Problem noch jemand?
Hiho,
ich dachte ich mache mal ein Upgrade von version 0.10 auf 1.1. Leider funktioniert der Sync nun nicht mehr. Wenn ich bspw. einen neuen Termin anlege, bekomme ich beim syncen die Meldung „forbidden“. Was ich gemacht habe: Einfach die neue Version drüber installiert (also nur Step 2, Step 4, Step 5).
Leider habe ich keine „Upgrade Anleitung“ gefunden. Irgendwas scheint sich mit den Rechten geändert zu haben. Leider verstehe ich nicht, was genau ich nun ändern muss, damit es wieder funktioniert.
Hat hier einer ne Lösung für mich?
Seit dem ersten Erscheinen dieser sehr guten Anleitung sind mehrere Versionsänderungen ins Land gegangen.
Ich möchte deshalb nur kurz berichten, dass die Anleitung auch weiter funktioniert. Denn ich habe es gerade für folgende Kombination zum Laufen bekommen:
Raspbian Jessie
Radicale 1.1.1
bcrypt 1.1.0
Allerdings ist es für bcrypt notwendig, noch zwei Sachen vorher zu installieren:
sudo apt-get install libffi-dev
sudo apt-get install python-passlib (darauf hat Stefan G schon hingewiesen, s.o.)
Danke an Jan und viel Erfolg denen, die Radicale installieren wollen.
Gruß
Andreas
Hallo,
habe gemäß ANleitung auf einem frisch aufgesetzten Raspberry Pi mit Raspian Jessie Radicale 1.1.1 installiert, erhalte beim Start aber folgende Fehlermeldungen:
Traceback (most recent call last):
File „/usr/local/bin/radicale“, line 4, in
__import__(‚pkg_resources‘).run_script(‚Radicale==1.1.1‘, ‚radicale‘)
File „/usr/lib/python2.7/dist-packages/pkg_resources.py“, line 534, in run_script
self.require(requires)[0].run_script(script_name, ns)
File „/usr/lib/python2.7/dist-packages/pkg_resources.py“, line 1445, in run_script
exec(script_code, namespace, namespace)
File „/usr/local/lib/python2.7/dist-packages/Radicale-1.1.1-py2.7.egg/EGG-INFO/scripts/radicale“, line 32, in
File „build/bdist.linux-armv6l/egg/radicale/__main__.py“, line 93, in run
File „build/bdist.linux-armv6l/egg/radicale/log.py“, line 54, in start
File „build/bdist.linux-armv6l/egg/radicale/log.py“, line 40, in configure_from_file
File „/usr/lib/python2.7/logging/config.py“, line 77, in fileConfig
formatters = _create_formatters(cp)
File „/usr/lib/python2.7/logging/config.py“, line 113, in _create_formatters
flist = cp.get(„formatters“, „keys“)
File „/usr/lib/python2.7/ConfigParser.py“, line 607, in get
raise NoSectionError(section)
ConfigParser.NoSectionError: No section: ‚formatters‘
Habe die Config-Datei mehrfach geprüft und finde keine Abweichung zur Anleitung. libffi-dev und python-passlib sind ebenfalls installiert.
Lässt sich aus den Fehlermeldungen eine Ursache ablesen?
Danke!
Hallo,
erstmal vielen Dank an Jan für die gut gemachte Anleitung. Ich habe alles wie beschrieben auf einem Raspi3 mit Raspian Jessie (radicale 1.1.1) eingerichtet und ich konnte über Lightning und ein Tablet (DavDroid) mit diversen Kalender-Apps (aCalendar, Jort, SolCalendar, BussinessCal2, etc.. darauf zugreifen. Hat alles wunderbar funktioniert. Nach ein paar Tagen habe ich dann auf meinem Smartphone ebenfalls DavDroid installiert und wollte auf radicale zugreifen, was allerdings misslang. Auch die anderen Anwendungen konnten radicale nicht mehr erreichen. In der Shell zeigt mir radicale –debug die exakt gleiche Fehlermeldung die Manuel auch angezeigt bekommt.
Hat jemand eine Idee woher dieser Fehler kommen könnte?
Hallo,
erstmal vielen Dank an Jan für die gute Anleitung.
Ich habe das gleiche Setup wie Manuel, es lief auch alles wunderbar. Nach ein paar Tagen allerdings startete radicale nicht mehr und ich erhielt genau diese Fehlermeldung.
Scheinbar wird die Sektion „formatters“ nicht gefunden. Hat jemand eine Idee woran das liegen könnte?
Nabend,
ich hab eben mal auf einem frischen Raspbian die Anleitung abgearbeitet, leider passiert nach Punkt 10… nichts.
ps aus | grep -i radi
zeigt keinerlei Ergebnis (außer dass es sich natürlich selbst findet) aber egal wie ich mich verbiege, radicale taucht nicht auf.
Ne Idee wieso?
Geht mir genauso…
Ich hatte ein ähnliches Problem. Das kann unterschiedliche Ursachen haben. Starte mal radicale mit der Option „-f“ (im Vordergrund, also nicht als deamon), dann werden etwaige Fehlermeldungen angezeigt (die zum Teil nicht im Log stehen).
Hallo,
wie viele andere von dir auch, ein super Tutorial.
Leider nicht zu 100% funktionstüchtig, was an unterschiedlichen Dingen liegen kann. Zum einen läuft die Geschichte bei mir nicht auf einem Raspberry-Pi, sondern auf einem Cubieboard 4 unter Ubuntu.
Zum anderen war davor radicale 0.8 per apt installiert. Darum befinden sich möglicherweise „ungewollte“ Konfigurationsdateien auf dem Rechner.
Jedenfalls bringt/brachte sowohl radicale in seiner Version 1.1.1 wie auch 0.8 nach dem Befehl
radicale -f
die Fehler
File „/usr/bin/radicale“, line 32, in
radicale.__main__.run()
File „build/bdist.linux-armv7l/egg/radicale/__main__.py“, line 150, in run
File „build/bdist.linux-armv7l/egg/radicale/__init__.py“, line 134, in __init__
File „build/bdist.linux-armv7l/egg/radicale/auth/__init__.py“, line 43, in load
File „build/bdist.linux-armv7l/egg/radicale/auth/htpasswd.py“, line 135, in
File „/usr/lib/python2.7/dist-packages/passlib/utils/handlers.py“, line 456, in encrypt
self.checksum = self.calc_checksum(secret)
File „/usr/lib/python2.7/dist-packages/passlib/utils/handlers.py“, line 1147, in calc_checksum
return self.calc_checksum(secret)
File „/usr/lib/python2.7/dist-packages/passlib/handlers/bcrypt.py“, line 237, in _calc_checksum_pybcrypt
self.to_string(native=False))
File „/usr/local/lib/python2.7/dist-packages/bcrypt-2.0.0-py2.7-linux-armv7l.egg/bcrypt/__init__.py“, line 57, in hashpw
raise TypeError(„Unicode-objects must be encoded before hashing“)
TypeError: Unicode-objects must be encoded before hashing
Komischerweise ist /var/log/radicale/radicale.log „sauber“. Das Programm startet einfach nicht…
Was ich schon probiert habe:
– sudo apt-get purge radicale
– sudo find / -name radicale | xargs sudo rm -rf (Nach vorangehendem Check, was gelöscht wird, natürlich)
– Tutorial von vorne beginnen.
Hat jemand eine Idee, was das bedeuten könnte? Sieht eher nach einem Problem mit Pyhton aus, oder?
Viele Grüße und herzlichen Danke im voraus
Markus
PS: Ich habe daran gedacht, das ganze OS neu aufzusetzen. Aber die Maschine ist ein Server, der aktiv genutzt wird, darum scheidet das leider aus.
Ich habe das ganze nun mit Radicale 1.1.1 zum Laufen bekommen.
Ich habe Step 3 durch:
pip install bcrypt
ersetzt (das installiert bcrypt 3.1.1=https://pypi.python.org/pypi/bcrypt/3.1.1 — ich blicke nicht, ob das eine Weiterentwicklung des hier verwendeten Pakets ist). Step 4 habe in unverändert gelassen (mein bcrypt Paket wird gleich eingebunden wie das in der Anleitung verwendete).
In der Adressierung des Servers muss ich „http://“ durch „https://“ ersetzen.
Ich hoffe das hilft anderen Verbündeten…
Bei mir läuft Radicale auf einem Raspi.
Synchronisierung klappt auch bisher ganz gut mit Android und Windowsphone.
1. Allerdings habe ich nicht verstanden, wie das mit den Usern funktioniert:
Ich habe auf dem Raspi nach dem ersten User einen zweiten angelegt – ohne Fehlermeldung. Allerdings kann ich im collections-Verzeichnis keine Spur davon finden.
Muss der Radicale-Seerver zum Anlegen eines Users angehalten sein ? Wenn ja, wie hält man ihn sauber an ?
2. In Android kann ich ein Caldav-Konto anlegen, über das mehrere Kalender verwaltet werden können.
Geht das mit WindowsPhone (10) nicht ? Muss ich da für jeden Kalender ein Konto anlegen ?
Danke für die schöne Anleitung. Nun stehe ich nur vor der Frage, ob ich mein laufendes Openelec-System durch Raspbian ersetzen soll/muß, wenn ich Caldav installieren will, oder ob es auch Tricks gibt, Caldav auf einem Openelec-System zu installieren und laufen zu lassen.
Gibt’s dazu Erfahrungen?
Hallo,
bis Step 3 hatte allse funktioniert, allerdings liegt „py-bcrypt-0.4.tar.gz“ nicht mehr unter
http://py-bcrypt.googlecode.com/files/
Auflösen des Hostnamen »py-bcrypt.googlecode.com (py-bcrypt.googlecode.com)«… 64.233.166.82, 2a00:1450:400c:c09::52
Verbindungsaufbau zu py-bcrypt.googlecode.com (py-bcrypt.googlecode.com)|64.233.166.82|:80… verbunden.
HTTP-Anforderung gesendet, warte auf Antwort… 404 Not Found
2017-02-01 17:53:39 FEHLER 404: Not Found.
Mit
wget https://pypi.python.org/packages/68/b1/1c3068c5c4d2e35c48b38dcc865301ebfdf45f54507086ac65ced1fd3b3d/py-bcrypt-0.4.tar.gz#md5=dd8b367d6b716a2ea2e72392525f4e36
konnte ich „py-bcrypt-0.4.tar.gz“ dann aber beschaffen (und natürlich auch entpacken)
„sudo python setup.py build && sudo python setup.py install“ führte aber zu folgender Anzeige und Fehlermeldung:
running build
running build_py
running build_ext
building ‚bcrypt._bcrypt‘ extension
arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c bcrypt/bcrypt.c -o build/temp.linux-armv7l-2.7/bcrypt/bcrypt.o
unable to execute ‚arm-linux-gnueabihf-gcc‘: No such file or directory
error: command ‚arm-linux-gnueabihf-gcc‘ failed with exit status 1
Nun muß nach weiteren Hilfsquellen suchen….
Hallo
habe die gleiche Fehlermeldung. Kann mir jemand weiterhelfen?
Danke
Ok, habe meine Fehler gefunden.
sudo python setup.py build && sudo python setup.py install
ist 1 Befehl und nicht 2 🙁
[…] https://jankarres.de/2015/01/raspberry-pi-radicale-caldav-und-carddav-server-installieren/ […]
hallo und danke für das tutorial.
es ist ja mittlerweile schon ein paar jährchen alt und schmeißt mir bei step 5 folgenden fehler:
>sudo python setup.py install
Traceback (most recent call last):
File „setup.py“, line 39, in
from setuptools import setup
ImportError: No module named setuptools
weiß jemand rat?
habe die lösung selbst gefunden:
sudo apt-get install python-setuptools
Ein wirklich tolle Anleitung. Vielen Dank.
Gibt es irgendwo eine aktualisierte Version mit bcrypt 3.* und radicale2.*
Hallo,
über eine Aktualisierung des Artikels würde ich mich sehr freuen… Ich komme momentan bei Step 4 nicht weiter:
Radicale wurde heruntergeladen in Version 2.1.8; nun liegt eine eine Ordnerstruktur vor und ich finde den Ordner auth/ nicht mehr und auch nicht das Skript htpassword.py
Jemand eine Idee?