Vor einiger Zeit habe ich DAViCal auf meinem Raspberry Pi installiert, damit ich meinen Kalender und meine Kontakte lokal in meinem Neztwerk syncen kann. Dabei hatt DAViCal den Vorteil, dass es nur wenig Ressourcen benötigt. Allerdings hat sich gezeigt, dass das Webfront-End InfCloud, das ich verwendet habe, seine Macken hat. Daher habe ich mich entschlossen auf meinem Raspberry ownCloud 8.1 zu installieren.

01| nginx und PHP installieren

Da nginx bietet mehr Optionen als lighttpd und benötigt weniger Ressourcen als der Apache. Also habe ich mich für nginx entschieden. Sollte bereits ein anderer Web-Service laufen, muss der ggf. zunächst deaktiviert oder deinstalliert werden. Mit dem Kommando update-rc.d apache2 disable  wird z.B. ein automatischer Start des Apache unterbunden.

Die Installation basierend auf nginx ist nicht die einfachste Methode die ownCloud auf den Raspberry zu bekommen. Der einfachste Weg wohl ist die vom ownCloud-Team empfohlene Installation per OpenSuse Repository. Diese setzt allerdings auf Apache auf, so dass ich hier nicht weiter darauf eingehe. Neben der oben genannnten Anleitung owncloud.org gibt es zahlreiche andere Beschreibungen im Internet (siehe z.B. raspberry.tips).

Die grundlegende Installation des nginx (inkl. PHP) ist denkbar einfach:

sudo apt-get update
sudo apt-get install nginx
sudo apt-get install php5 php5-cgi php5-cli php5-common php5-curl php5-dev php5-fpm php5-gd php5-intl 
sudo apt-get install php5-ldap php5-mcrypt php5-mysql php5-pgsql php5-sqlite
sudo apt-get install php-apc php-crypt-blowfish php-pear php-xml-parser

02| nginx konfigurieren

Die nginx-Konfiguration, die im  ownCloud 8.1 Administrationshandbuch vorgeschlagen wird,  habe ich als Ausgangsbasis verwendet und in der Datei /etc/nginx/sites-available/owncloud  gespeichert. Anschließend werden zuerst die grundlegenden Parameter angepasst:

...
server { 
        listen 443 ssl;

        # legt den Server-Namen est unter dem die ownloud erreichbar sein soll
        # (see http://nginx.org/en/docs/http/server_names.html)
        server_name your.server.name;
  ...
        # Path to the root of your installation
        root /var/www/;

        # set max upload size
        client_max_body_size 2G;
  ...
}

Soll die ownCloud später in einem separaten Pfad liegen (z.B. https://raspberry/owncloud), dann müssen in der Konfiguration auch noch alle Weiterleitungen (rewrite) entsprechend angepasst werden.

        rewrite ^/caldav(.*)$ /owncloud/remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /owncloud/remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /owncloud/remote.php/webdav$1 redirect;
...
        location / {
                # The following 2 rules are only needed with webfinger
                rewrite ^/.well-known/host-meta /owncloud/public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /owncloud/public.php?service=host-meta-json$

                rewrite ^/.well-known/carddav /owncloud/remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /owncloud/remote.php/caldav/ redirect;
...
        }

Für eine SSL/TLS-Verschlüsselung muss wie auch für den DAViCal-Server ein Schlüssel und ein Zertifikat erstellt werden. Ich verwende für die Schlüsselverwaltung XCA und habe das Vorgehen in einem eigenen Artikel beschrieben: Private CA für interne Web-Server erstellen. Für nginx muss der private Schlüssel und das zugehörige Zertifikat in separaten Dateien für dei Konfigurationsparameter  ssl_certificate_key  vorliegen. Ich habe den Server-Key daher in der Datei /etc/nginx/ssl/server.key  gespeichert und die Berechtigungen auf den Schlüssel entsprechend eingeschränkt (chmod 400 server.key ). Das zum Schlüssel gehörende Zertifikat wird über den Konfigparameter ssl_certificate  festgelegt. Hier erwartet nginx eine Datei, die alle Zertifikate der Zertifikatskette enthält. Dabei muss das erste Zertifikat in der Datei das passende Zertifikat zum Schlüssel sein. Alle weiteren Zertifikate (z.B. Intermediate-CA- und CA-Zertifikate) kommen dann danach. Eine solche Datei kann beispielsweise folgendermaßen aus einzeldateien erzeugt werden:

cat server.crt intermediate_ca.crt root_ca.crt > /etc/nginx/ssl/server.bundle.crt

Danach können folgende Zeilen in der nginx-Konfig ergänzt werden:

...
server { 
        listen 443 ssl;
   ...
        ssl_certificate /etc/nginx/ssl/server.bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
   ...
}

Danach sollte der nginx per TLS erreichbar sein ohne eine Fehlermeldung im Browser zu erzeugen (voraussgetzt die Root-CA ist bereits im Browser installiert; siehe auch Private CA erstellen).

Für eine sichere TLS-Verbindung sollten die vom Server unterstützten Cipher-Suiten eingeschränkt werden:

ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # auf TLS einschränken

# Ciphers from bettercrypto.org
ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256$

Normalerweise werden die unten aufgeführten Security-Header schon in der vorgeschlagenen Konfiguration von ownCloud berücksichtigt. Um auf Nummer Sicher zu gehen, ist eine kurzer Gegencheck zu empfehlen:

# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;

Um die HTTPS-Performance zu verbessern sollten folgende Parameter gesetzt werden:

ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;

Wenn DH-Suiten mit einer Schlüssellänge > 1024 Bit verwendet werden sollen, dann kann wie bei der DAViCal Installation zusätzlich noch ein spezielles DH-File erzeugt werden:

openssl dhparam -out dh2048.pem -outform PEM -2 2048

Das Kommando erzeugt einen File für 2048Bit. Sollten 2048-Bit nicht ausreichen und lieber auf 4096 -Bit zurückgegriffen werden, so kann das Kommando entsprechend angepasst werden. Ich empfehle das Kommando auf einem System mit mehr Rechenleistung auszuführen und die Datei anschließend zu kopieren, da dier Erzeugung der Datei auf dem Raspberry einige Zeit in Anspruch nehmen kann. Mit der folgende Zeile wird die Datei in die Konfiguration aufgenommen:

ssl_dhparam /etc/nginx/ssl/dh2048.pem;
Damit die Konfiguration aktiv wird muss noch ein symbolischer Link auf die Datei im Verzeichnis angelegt werden:

ln -s /etc/nginx/sites-available/owncloud /etc/nginx/sites-enabled/owncloud

03| PHP konfigurieren

Eigentlich muss bei PHP nicht mehr viel angepasst werden. In der Regel möchte man in der ownCloud jedoch auch Dateien hochladen können, die größer als 513MB sind. Daher müssen an unterschiedlichen Stellen die Werte für die Parameter upload_max_filesize  und post_max_size  angepasst werden.

03.a| Maximale Upload-Größe anpassen

Da bei nginx php-fpm  genutzt wird, sind die Parameter in der Datei /etc/php5/fpm/php.ini zu ändern. Bei mir habe ich eine Upload-Größe auf 2 GB eingestellt:

upload_max_filesize = 2G
post_max_size = 2G

Da der ownCloud CRON jobs php-cli verwendet muss ggf. auch noch die Datei /etc/php5/cli/php.ini angepasst werden. Zusätzlich wird die Datei-Upload-Größe auch noch .htaccess  im Root-Verzeichnis der ownCloud-Installationeingstellt werden:

php_value upload_max_filesize 2G
php_value post_max_size 2G

Für eine nginx-Installation ist das leider immer noch nicht ausreichend, da bei nginx die PHP-Parameter in der .htaccess  per Default nicht berücksichtigt werden. Die einfachste Lösung: die Parameter in der Datei .user.ini im ownCloud-Root-Verzeichnis anpassen. Damit sollte dann auch die der Upload für große Dateien möglich sein. Alternativ kann auch die PHP-Modul (PECL-Extension)  htscanner  installiert werden,  das die PHP-Einstellungen in der .htaccess  ausliest.  Die PECL-Erweiterung htscanner kann folgendermaßen installiert werden:

sudo apt-get install php-pear php5-dev
sudo pecl install htscanner

Wurde das Modul entsprechend fehlerfrei übersetzt muss es abschließend noch aktiviert werden. Dazu wird die Datei  /etc/php5/mods-available/htscanner.ini  mit folgendem Inhalt angelegt:

; configuration for php htscanner module
; priority=20
extension=htscanner.so

Ein Link auf diese Datei sorgt dafür, dass das Modul beim nächsten Start von PHP-fpm geladen wird:

ln -s /etc/php5/mods-available/htscanner.ini /etc/php5/fpm/conf.d/20-htscanner.ini

Mit einem Service-Restart wird das Modul dann geladen:

service php5-fpm restart

03.b| Systempfade in PHP-fpm aktivieren

Manchmal erscheint nach der Installation folgende Fehlermeldung auf der Administrationsseite:

PHP scheint zur Abfrage von Systemumgebungsvariablen nicht richtig eingerichtet zu sein. Der Test mit getenv (“PATH”) liefert nur eine leere Antwort zurück. Bitten überprüfe die Installationsdokumentation auf Hinweise zur PHP-Konfiguration sowie die PHP-Konfiguration Deines Servers, insbesondere dann, wenn Du PHP-FPM einsetzt.
Um diese Meldung zu beseitigigen müssen in der Datei /etc/php5/fpm/pool.d/www.conf lediglich folgende Zeilen durch entfernen des Semikolons aktiviert werden:

;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

Danach muss nur noch php5-fpm neu gestartet werden:

sudo /etc/init.d/php5-fpm restart

Weitere Informationen in der Dokumentation zur ownCloud.

04| MySQL installieren und konfigurieren

Grundsätzlich kann ownCloud auch ohne eine vollwertige Datenbank betrieben werden. In diesem Fall greift die ownCloud dann auf SQLite zurück, was für eine normale Umgebung zuhause eigentlich ausreichend sein sollte. Ich habe mich allerdings für die Verwendung von ownCloud mit MySQL entschieden:

sudo apt-get install mysql-server mysql-common mysql-client php5-mysql

Bei der Installation sollte direkt ein Passwort für den root-Zugriff auf die Datenbank angegeben werden. Dieses Passwort bitte gut merken – es wird gleich noch benötigt. Wenn die Installation abgeschlossen ist muss die Datenbank noch eingerichtet werden. Dazu zunächst mit mysql -u root -p  eine Verbindung zur Datenbank aufbauen und mit dem root-Passwort aus der Installation an der Datenbank anmelden. Danach muss eine Datenbank und ein User angelegt werden. Danach müssen dem User noch entsprechende Berechtigungen zugeordnet werden:

CREATE DATABASE owncloud;

CREATE USER 'owncloud'@'localhost' IDENTIFIED BY '<insert_secure_password_here>';

GRANT ALL PRIVILEGES ON owncloud.* TO 'owncloud'@'localhost';

FLUSH PRIVILEGES;
exit;

Damit ist die Datenbank für die ownCloud vorbereitet und es kann mit der ownCloud-Installation begonnen werden.

05| ownCloud installiern und konfigurieren

Zwar kann ownCloud auch per apt-get installiert werden, wenn das entsprechende Repository eingebunden wird (siehe ownCloud 8.1 Administrationshandbuch). Da ich allerdings auf nginx setze habe ich die owncloud nach der Anleitung auf owncloud.org manuell installiert:

  1. Archiv inkl. sh256-Checksum von owncloud.org herunterladen:
    cd /var/www
    
    wget https://download.owncloud.org/community/owncloud-x.y.z.tar.bz2 
    wget https://download.owncloud.org/community/owncloud-x.y.z.tar.bz2.sha256
    
  2. Checksumme des Archivs prüfen:
    sha256sum -c owncloud-x.y.z.tar.bz2.sha256 < owncloud-x.y.z.tar.bz2
  3. Ist die Prüfsumme OK, dann das Archiv entpacken:
    tar xvfj owncloud-8.1.3.tar.bz2
  4. Berechtigungen des owncloud-Verzeichnis anpassen:
    sudo chown -R root:root owncloud
    sudo find /var/www/owncloud/ -type f -print0 | sudo xargs -0 chmod 0640
    sudo find /var/www/owncloud/ -type d -print0 | sudo xargs -0 chmod 0750
    
    sudo chown -R root:www-data /var/www/owncloud/
    sudo chown -R www-data:www-data /var/www/owncloud/apps/
    sudo chown -R www-data:www-data /var/www/owncloud/config/
    sudo chown -R www-data:www-data /var/www/owncloud/data/
    sudo chown -R www-data:www-data /var/www/owncloud/themes/
    
    sudo chown root:www-data /var/www/owncloud/.htaccess
    sudo chown root:www-data //ar/www/owncloud/data/.htaccess
    
    sudo chmod 0644 /var/www/owncloud/.htaccess
    sudo chmod 0644 /var/www/owncloud/data/.htaccess

Danach kann auch schon der Setup-Assistent im Browser unter der URL https://<IP des RasPi>/owncloud  aufgerufen werden. In dem Dialog kann dann der Admin-Account für die ownCloud angelegt werden. Im Abschnitt Speicher und Datenbank kann das Verzeichnis zur Speicherung der ownCloud-Daten angegeben werden. Hier könnte zum Beispiel auch ein Pfad zu einer externen Festplatte angegeben werden, wenn z.B. auch Dateien auf der Owncloud gespeichert werden sollen und nicht nur Kontakte und Termine. Im Abschnitt Datenbank einrichten muss jetzt nur noch MySQL ausgewählt und die Informationen für den Verbindungsaufbau zur Datenbank angegeben werden:

  • User: owncloud
  • Passwort: <passwort_des_db_users>
  • Datenbank: owncloud
  • Server: localhost

Mit dem Button “Installation abschließen” läuft die Konfiguration dann hoffentlich problemlos durch. Damit die Kalender und Kontakte verwaltet werden können müssen zu guter Letzt nur noch die Apps “Calender” und “Contacts” über den +-Button im Datei-Menü aktiviert werden.

06| ownCloud-Probleme beseitigen

Nach der Installation treten gerne ein paar Warnungen im Menü “Adminsitration” auf. Diese können folgendermaßen behoben werden:

06.a| Caching aktivieren

Es wurde kein PHP Memory Cache konfiguriert. Konfiguriere zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer Dokumentation.
Damit das Caching aktiviert werden kann muss zunächst das entsprechende PHP-Modul installiert werden (falls das nicht bereits oben schon passiert ist):

sudo apt-get update
sudo apt-get install php-apc

Anschließend wird nginx neu gestartet (service nginx restart) und folgende Zeile in der ownCloud-Config (config/config.php) hinzugefügt:

‘memcache.local’ => ‘\OC\Memcache\APC’,

Detaillierte Information zum Caching sich im ownCloud-Blog.

06.b| HTTP Strict Transport Security aktivieren

“The “Strict-Transport-Security” HTTP header is not configured to least “15768000” seconds. For enhanced security we recommend enabling HSTS as described in our security tips.”
Wenn die nginx Konfiguration korrekt durchgeführt wurde (siehe Abschnitt 01), sollte diese Meldung eigentlich nicht mehr auftauchen. Kommt die Fehlermeldung dennoch, dann sollte kurz überprüft werden, ob SSL in aktiviert wurde und der Eintrag

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";

in dem SSL-Abschnitt der entsprechenden Konfig-Datei vorhanden ist.