DAV sync mit Baikal

Ich möchte meine Adressen und Kalender Daten im Android Smartphone nicht aus der Hand geben. Deshalb suche ich schon lange nach einer praktikablen Backup/Sync. Lösung mit eigenem Server, die viele gängige Clients unterstützt. Ich betrachte hier nur die Android und Mac OS X Clients.

In Jahr 2012 habe ich mit dem Programm Zarafa und Z-Push angefangen, siehe ActiveSyncZarafa, da zu dieser Zeit für Android standardmäßig nur Active Sync zu Verfügung stand, und Zarafa mit Z-Push das kostenlos erlaubte. CalDAV und CardDAV freie Client Programme gab es zu dieser Zeit noch nicht für Android. Das hat zwar im Prinzip funktioniert, es gab aber immer wieder Probleme, und die Datensicherung war auch schwierig.

Bezüglich der Methode Active Sync habe ich sonst nichts brauchbares gefunden.

Dann wurde die Methode CalDAV / CardDAV erprobt, was erfolgreich war.

Ein erste Versuch wurde mit Owncloud 6 gestartet. Das war nicht zuverlässig.

Dann wurde der CalDAV / CardDAV Server Radicale (version 0.9) ausprobiert. Das war nicht zuverlässig.

Baikal ist ein kleiner, einfacher CardDAV / CalDAV Server (basierend auf SabreDAV), der nicht mehr braucht als eine normale PHP Installation mit Datenbankanbindung (SQLite3 oder MySQL). Da haben erste sync Versuche mit gängigen Clients funktioniert. Nur der SOGo Connector unter Thunderbird hat nicht funktioniert.

Der benutze Android Kalender Client ist DAVdroid (von bitfire web engineering).

Der benutze Android Kontakte Client ist DAVdroid (von bitfire web engineering).

Die Android Kontakte kann man mit der eingebauten Export/Import Möglichkeit exportieren (*.vcf) und wieder importieren.

Die Mac OS X Kontakte kann man sichern mit Menü Ablage->Exportieren->Kontakte Archiv ... unter dem Namen Kontakte - 08.08.2016.abbu. Das Datum wird vom System vorgeschlagen. Sinnvollerweise speichert man den File in Ordner Dokumente ab.

Die Android Kalender haben leider keine eingebaute Export/Import Möglichkeit. Da hilft aber die App iCal Import/Export 2.2 weiter (*.ics).

Den Mac OS X Kalender kann man sichern mit Menü Ablage->Exportieren->Kalender Archiv ... unter dem Namen Kalender & Erinnerungen 08.08.2016, 16:43.icbu. Das Datum wird vom System vorgeschlagen. Sinnvollerweise speichert man den File in Ordner Dokumente ab.

/!\ Wichtig zu wissen: Der Server hat immer recht. Wenn man also bei einem Client einen Kalender Eintrag, oder einen Kontakt löscht, wird bei nächster sync Gelegenheit bei allen verbundenen Clients das gleiche gemacht. Also ist es empfehlenswert, vor größeren Änderungen auf allen Clients lokal eine Datensicherung zu machen.

/!\ Ein Maus Klick auf ein Bild vergrößert es.

Baikal Installation

Nach ersten Versuchen mit dem Flat und Regular Paket (Version .0.2.7), die irgendwie unvollständig waren, habe ich mir die Github Version installiert. Bei der Github Seite war auch eine gute Anleitung mit dabei. Der Baikal Server wurde als virtual host bei dem Apache2 Web Server (unter Ubuntu 14.04) eingebunden. Bei der Test Installation wurde aus dem Github das Master-Archiv heruntergeladen und entpackt. Dann muss noch der composer installiert werden (PHP Versionsverwaltung). Um git zu nutzen waren folgende Schritte notwendig:

# ab Ubuntu 16.04
# Installiere PHP7.0 Pakete
$ sudo apt-get install  php7.0-sqlite3 sqlite3

# source code holen
$ cd /var/www
$ sudo git clone https://github.com/jeromeschneider/Baikal.git baikal 

# download composer
$ cd baikal
$ sudo curl -sS https://getcomposer.org/installer | sudo php
All settings correct for using Composer
Downloading 1.2.2...

Composer successfully installed to: /var/www/baikal/composer.phar
Use it: php composer.phar

# installiere
$ sudo php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing sabre/vobject (2.1.5)
    Downloading: 100%

  - Installing sabre/dav (1.8.10)
    Downloading: 100%

Writing lock file
Generating autoload files

# Rechte setzen
$ cd /var/www
$ sudo chown -R www-data:www-data baikal

# Erlaube den Gruppen Mitgliedern ein "cd" in die Ordner zu machen.
$ sudo find baikal -type d -print0 | xargs -0 sudo chmod 775

# Erlaube der Gruppe die Files zu ändern.
$ sudo chmod -R g+w baikal

# Prüfe, ob apache2 module "rewrite" enabled ist
$ ls /etc/apache2/mods-enabled/rew*
/etc/apache2/mods-enabled/rewrite.load

  # wenn nicht vorhanden, dann:
  $ sudo a2enmod rewrite
  $ sudo service apache2 restart

# Apache2 virtual host
$ cd /etc/apache2/sites-available
$ sudo ln -s /var/www/baikal/Specific/virtualhosts/baikal.apache2
# In baikal.apache2, ersetze die Referenzen zu dav.mydomain.com mit dem eigenen domain name (baikal)
    DocumentRoot /var/www/baikal/html
    ServerName baikal
    <Directory "/var/www/baikal/html">

# Aktiviere den neuen virtual host 
# legt einen Link an, in sites-enabled zu sites-available/baikal.apache2
$ sudo a2ensite baikal.apache2

# Web Server Apache2 neu starten
$ sudo service apache2 reload

# sperre Ordner "baikal" gegen Anzeige
$ touch /var/www/baikal/index.html

Dann kann man mit dem administrieren anfangen:

# Web Browser auf Adresse <server-IP>/baikal/html
# Man sieht jetzt:
  Baïkal Install Tool is locked.
  To unlock it, create (or re-create if it exists already) an empty file named ENABLE_INSTALL 
  (uppercase, no file extension) in the Specific/ folder of Baïkal.

$ cd /var/www/baikal/html/admin
$ touch Specific/ENABLE_INSTALL

# Lade die Web Seite neu, jetzt erscheint die Administration Maske
  Baikal Install tool

# "admin" Passwort eingeben

Es wurde nicht die DAV.xxx Subdomain verwendet, sondern der normale Pfad, um beim testen flexibler zu sein.

Baikal upgrade

Durch den upgrade von Ubuntu 14.04 auf Version 16.04 musste auch Baikal auf einen aktuellen Stand gebracht werden. Zum Glück gibt es eine Upgrade Anleitung. Dazu muss man das Archiv baikal-0.4.6.zip (2016-08) herunterladen, auspacken und installieren. Es ist auch ein Upgrade Wizzard integriert, der bei einem Unterschied der Versionsnummern als erstes aufgerufen wird, und die Datenbank erweitert. Jetzt ist das Terminal gefragt:

attachment:Baikal_Upgrade_wizard_680_2016-11-12.png

$ cd /var/www
# backup alte Daten
$ mv baikal baikal27

# Archiv download kopieren
$ sudo cp ~/Downloads/baikal.0.4.6.zip /var/www/

# Archiv entpacken
$ sudo unzip baikal-0.4.6.zip
# Programm "composer" ist bereits integriert.

# Rechte anpassen, für apache2
$ sudo chown -R www-data:www-data baikal

# kopiere Ordner "Specific" von der Datensicherung
$ sudo cp -r baikal27/Specific baikal

Dann mit dem Web Browser aufrufen http://192.168.17.72/baikal/html/admin/ (IP-Adresse anpassen). Es erscheint nach einer Wartezeit (Datenbank überarbeiten), die von der Größe der Datenbank und der Geschwindigkeit des Rechners abhängt, der Upgrade Wizard, siehe Bild rechts. Während der Wartezeit gibt es nur einen leeren Bildschirm, und leider keinen Hinweis auf die laufende Aktivität.

Mit Klick auf den grünen button Access the Baikal admin kann man dann die Baikal Konfiguration ändern. Normalerweise ist das aber nicht erforderlich.

Dann hat es bei mir mit der Synchronisation sofort funktioniert. An den CalDAV und CardDAV clients mussten keine Änderunge vorgenommen werden.

Baikal administrieren

Baikal kann sehr schön mit einer Web-Maske administriert werden. Man kann keine Kalender oder Kontakt Daten ändern. Was man ändern/einrichten kann ist:

Um an die Administration Web-Maske zu kommen, muss man folgende URL im Web Browser eingeben:

http(s)://<SERVER>/baikal/html/admin

Dann erscheint das Dashboard (Armaturenbrett) mit Informationen zu allen wichtigen Zahlen.

Weitere Web-Masken sind:

Kontakte, Bilder

Wenn unter Android einem Kontakt ein Bild hinzugefügt werden soll, ist es sinnvoll, es vor dem hinzufügen zum Kontakt, mit einem Bild Bearbeitung Programm auf 96 x 96 Pixel zu beschneiden. Sonst gibt es ein Problem bei der Synchronisation mit Baikal.

Sync Handhabung

Eine aktuelle Datensicherung ist sehr wichtig, da bei der Synchronisation sehr schnell etwas verloren gehen kann.

  1. Nach dem Installieren von Baikal ist die Datenbank erst einmal leer.
  2. Beim Client mit den meisten und aktuellen Daten macht man eine Datensicherung in einen *.vcf und *.ics File.
  3. Dann wird auf diesem Client ein CalDAV und CardDAV Konto für den Baikal Server eingerichtet.

  4. In dieses Konto importiert man dann die Datensicherung. Diese Daten werden normal sofort auf den Server synchronisiert.
  5. Jetzt richtet man am zweiten und folgenden Clients ein CalDAV und CardDAV Konto ein. Entweder erfolgt die Daten Synchronisierung automatisch, oder man muss sie per Hand anstoßen.
  6. Wenn ich jetzt auf einem Client einen Daten Eintrag ändere, hinzufüge oder lösche, wird das sofort, oder nach einem voreingestellten Takt auf den Server synchronisiert, und dann an die anderen Clients per Abruf verteilt.

Android Clients

Es gibt einige CalDAV und CardDAV Client Programme in dem Play Store. Aber es gibt nur wenige freie Programme.

Mac OS X Clients

Die Internet Account Einstellung hat sich ein paar Mal geändert. Deshalb die Beschreibung nach Betriebsystem Version:

(High-)Sierra 10.12

/!\ Update 2017-11-30

/!\ Wenn bei der Abfrage des Anmelde Passworts das Passwort nicht akzeptiert wird, ist bei der App Schlüsselbund der Ordner Lokale Objekte gestört. Mit diesem Tipp funktioniert es wieder:

/!\ Bei den Apps Kalender und Kontakte wurde bei Einstellungen->Accounts bei dem Feld Beschreibung nach der IP-Adresse hinzugefügt -baikal, damit das Server Programm benannt ist. Bei der ersten Benutzung muss man ein paar Minuten warten, bis auf Grund der großen Datenmenge die Synchronisation abgeschlossen ist.

El Capitan 10.11

Leider ist das Einrichten vom Internet-Account für CalDAV und CardDAV nicht einfach, wenn man nicht den Mac OS X Server hat. Mit der Betriebssystem Version El Capitan 10.11 ist es noch schwieriger geworden. Erst mit dem Update auf die Version 10.11.1 lässt sich das Protokoll CalDAV ohne Server Modifikation einrichten.

In El Capitan 10.11.1: Menü: Systemeinstellungen->Internet-Accounts->Andere Accounts hinzufügen

Leider gibt es beim Einrichten der CardDAV Synchronisation mehrere Probleme.

Web Server Redirect

Das wird beschrieben für den Apache2 Web-Server unter Ubuntu 14.04. In vielen Foren und Blogs liest man, die Direktive Redirect in den File .htaccess zu schreiben, in dem HTTP root directory. Durch die Voreinstellung AllowOverride None in der Apache2 Konfigurationsdatei /etc/apache2/apache2.conf wird aber der File .htaccess nicht mehr ausgelesen und berücksichtigt, siehe Handbuch.

Deshalb ist es sinnvoll, die Direktive Redirect in die Apache2 Konfigurationsdatei zu schreiben, siehe Handbuch.

# edit file /etc/apache2/apache2.conf
# setup for the HTTP root directory
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        Redirect 301 /.well-known/carddav /baikal/html/card.php
        Redirect 301 /.well-known/caldav /baikal/html/cal.php
</Directory>

Apple IOS Clients

Es wurde IOS 10.3 benutzt, mit folgender Anleitung.

/!\ Update 2018-10: Seit IOS 12 muss immer mit SSL gearbeitet werden.

Daten Export

SabreDAV erlaubt mit einem plugin den Export aller Calendar und Contact Daten in einen xxx.ics oder xxx.vcf File.

/!\ Die folgende Änderung der files cal.php und card.php nicht bei der aktuellen Version 0.4.6 machen.

Unglücklicherweise ist das noch nicht integriert in Baikal (version 0.2.7), aber es kann leicht nachgerüstet werden, wie folgt:

# für die Calendar Daten:
# Editiere file cal.php, entweder in baikal/cal.php, oder in baikal/html/cal.php
# Füge eine Zeile ein, hinter den anderen plugins, in der Nähe des File Endes.
$server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());

# für die Contact Daten:
# Editiere file card.php, entweder in baikal/card.php, oder in baikal/html/card.php
# Füge eine Zeile ein, hinter den anderen plugins, in der Nähe des File Endes.
$server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin());

# exportiere Calendar Daten, via web browser:
https://<SERVER>/baikal/html/cal.php/calendars/<USER>/default?export
# benenne den file Namen: Kalender_<USER>_baikal.ics

# exportiere Contact Daten, via web browser:
https://<SERVER>/baikal/html/card.php/addressbooks/<USER>/default?export
# benenne den file Namen: Kontakte_<USER>_baikal.vcf

Um das in der Praxis einfacher zu machen, ein Beispiel Shell Script zur Datensicherung. Das Benutzer Passwort muss jeweils per Hand eingegeben werden. Der Shell Script muss in dem Ordner der Datensicherung sein, und dort aufgerufen werden.

# DO NOT COPY THIS LINE
#!/bin/bash
# program baikal_backup.sh
# 2014-12-17 RudolfReuter
# backup Baikal addressbook and calendar
USER=reuterru
URL_A=http://192.168.17.72/baikal/html/card.php/addressbooks/$USER/default?export
URL_C=http://192.168.17.72/baikal/html/cal.php/calendars/$USER/default?export
PATH_A=contacts_$USER'_'$(date "+%Y-%m-%d_%H-%M").vcf
PATH_C=calendar_$USER'_'$(date "+%Y-%m-%d_%H-%M").ics
wget  --user=$USER --ask-password $URL_A -O $PATH_A
wget  --user=$USER --ask-password $URL_C -O $PATH_C

USER=reuter.ingeb
URL_A=http://192.168.17.72/baikal/html/card.php/addressbooks/$USER/default?export
URL_C=http://192.168.17.72/baikal/html/cal.php/calendars/$USER/default?export
PATH_A=contacts_$USER'_'$(date "+%Y-%m-%d_%H-%M").vcf
PATH_C=calendar_$USER'_'$(date "+%Y-%m-%d_%H-%M").ics
wget  --user=$USER --ask-password $URL_A -O $PATH_A
wget  --user=$USER --ask-password $URL_C -O $PATH_C

echo Job done
# EOF

# use on Mac OS, get your passwords at hand
$ cd /Volumes/DAT/Users/rudi/Documents/Baikal/
$ ./baikal_backup.sh

Bei der Datensicherung, speziell dem Kalender (zum Beispiel 680 kB, 35 Sekunden Transfer), kann es vorkommen, dass es nach 30 Sekunden zu einem PHP timeout Fehler kommt. Das sieht dann im Terminal so aus:

Connecting to 192.168.17.72:80... connected.
HTTP request sent, awaiting response... 401 Unauthorized
Reusing existing connection to 192.168.17.72:80.
HTTP request sent, awaiting response... 500 Internal Server Error
2016-11-12 11:44:00 ERROR 500: Internal Server Error

Also habe ich error log von apache2 nachgesehen, ob es eine passende Meldung gibt:

$ tail /var/log/apache2/error.log
[Sat Nov 12 11:44:00.661317 2016] [:error] [pid 2457] [client 192.168.17.234:50671] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /var/www/baikal/vendor/sabre/vobject/lib/Document.php on line 263

Mit einem Information File phpinfo.php, im Ordner /var/www/ kann man die Konfiguration von PHP abrufen, und dann anpassen (30 -> 180 Sekunden):

# edit file: phpinfo.php
<?php
phpinfo();
?>
# EOF

# localhost/phpinfo.php lokal im Web Browser eingeben

#---- Timeout anpassen:
# Pfad vom configuration file
Loaded Configuration File /etc/php/7.0/apache2/php.ini 
# Edit configuration file
  CORE
max_execution_time 30 -> 180

$ sudo service apache2 restart

Troubleshooting

Nach der Installation ist der erste Test, der Aufruf der Basisseite:

# Web Browser auf Adresse <server-IP>/baikal/html
# Man sieht jetzt:
  Baïkal is running allright.

Um sich den Inhalt der Datenbank anzusehen, kann man sich phpliteadmin installieren, download siehe Links. Neben dem Programm Archiv sollte man sich auch die Themen herunterladen (CSS). Ich habe das Thema default/phpliteadmin.css benutzt.

Im Konfiguration File ist die Voreinstallung vom Password "admin". Da der File phpliteadmin.config.sample.php unter Windows erstellt wurde, sollte man das "End Of Line" Zeichen mit fromdos umstellen, zu installieren mit:

$ sudo apt-get install tofrodos

$ fromdos phpliteadmin.config.php

# Edit "password" und "directory"
  $password = '***';
  $directory = 'baikal/Specific/db';

# kopiere file phpliteadmin.php, phpliteadmin.css, und phpliteadmin.config.php nach /var/www/

# passe den Benutzer an:
$ sudo chown www-data:www-data /var/www/php*

# Aufruf in Web Browser: SERVER/phpliteadmin.php

attachment:Baikal_phpLiteAdmin_search.png

Daten suchen/editieren

Man kann mit phpLiteAdmin.php auch Inhalte suchen oder editieren. Wenn es mehrere Adressbücher gibt, werden die Daten in den Tabellen calendarobjects und cards zusammengefasst.

Wenn man in Kontakten sucht, klickt man die Tabelle cards an, und sucht (Reiter Search) dann im Feld carddata mit LIKE %...% nach dem Text, zum Beispiel %Rudolf% im Feld Value.

Bei den Kalender Eintragungen sucht man in der Tabelle calendarobjects zum Beispiel im Feld calendardata. Wenn mehrere Kalender vorhanden sind muss man noch das Feld calenderid berücksichtigen. Den Kalender Text Eintrag findet man man im Feld calenderdata hinter der Bezeichnung SUMMARY.

Eine interesante Information ist die Anzahl der Kontakte in den einzelnen Adressbüchern. Das kann man in der Baikal Administrator Seite leider nicht sehen. Dort gibt es nur eine Gesamtsumme der Kontakte, was bei mehreren Adressbüchern keine Kontrolle erlaubt.

  1. Baikal auf Synology (2016-03)

Übersicht Groupware

DAV Server

DAV Clients

Groupware Server

Tools

List of pages in this category:

-- RudolfReuter 2014-06-26 07:48:16


Go back to CategoryAndroid or FrontPage ; KontaktEmail (ContactEmail)

DAVsyncBaikal (last edited 2019-01-28 10:49:49 by RudolfReuter)