re:oyd (8): OwnCloud@Pogoplug V2

Unser Server läuft soweit, also geht es jetzt daran, OwnCloud zu installieren.

  1. Dafür wechseln wir zunächst in unser Webserververzeichnis
    cd /srv/http
  2. Dann laden wir die neueste OwnCloud Version herunter
    wget http://owncloud.org/releases/owncloud-4.5.5.tar.bz2
  3. die wir anschließend entpacken
    tar -xjf owncloud-4.5.5.tar.bz2
  4. und zu guter letzt noch den Besitzer der Dateien anpassen
    chown -R http:http /srv/http/owncloud/

Unser OwnCloud-Server sollte dann am Ende unter https://royd.dnsd.me/owncloud/ erreichbar sein. Damit OwnCloud läuft, müssen wir aber noch unseren Webserver und unsere php-Installation anpassen. Beginnen wir mit den Änderungen an der
nginx-Konfigurationsdatei (/etc/nginx/nginx.conf) (ACHTUNG, nur ausschnittsweise Darstellung der Datei):

server {
       listen       443;
       client_max_body_size 1000M; # UPLOAD-DATEIGRÖSSE
       #...
       location / {
            server_name   royd.dnsd.me; #ACHTUNG server_name IN DER GESAMTEN DATEI ANPASSEN!
            root   /srv/http;
            index index.php index.html index.htm;

            rewrite ^/cloud/.well-known/host-meta /public.php?service=host-meta last;
            rewrite ^/cloud/.well-known/carddav /remote.php/carddav/ redirect;
            rewrite ^/cloud/.well-known/caldav /remote.php/caldav/ redirect;
            rewrite ^/cloud/apps/calendar/caldav.php /remote.php/caldav/ last;
            rewrite ^/cloud/apps/contacts/carddav.php /remote.php/carddav/ last;
            rewrite ^/cloud/apps/([^/]*)/(.*.(css|php))$ /index.php?app=$1&getfile=$2 last;
            rewrite ^/cloud/remote/(.*) /remote.php/ last;
            #error_page 403 /cloud/core/templates/403.php;
            #error_page 404 /cloud/core/templates/404.php;

            try_files $uri $uri/ @webdav;
            }

            # Direkten Zugriff auf Daten unterbinden
            location ~ /(data|config|.ht|db_structure.xml|README) {
                        deny all;
            }

    location @webdav {
                    fastcgi_split_path_info ^(.+.php)(/.*)$;
                    unix:/var/run/php-fpm/php-fpm.sock;
                    fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;
                    fastcgi_param HTTPS on;
                    fastcgi_param HTTP_AUTHORIZATION $http_authorization;
                    fastcgi_param htaccessWorking true;
                    include fastcgi_params;
     }
}

Als nächstes müssen wir noch in der php-Konfigurationsdatei (/etc/php/php.ini) einige Zeilen auskommentieren. Das Rautezeichen # muss vor den folgenden Zeilen gelöscht werden:

xmlrpc.so
zip.so
gd.so
pdo_sqlite.so
sqlite3.so
extension=iconv.so
extension=openssl.so

Zu guter Letzt starten wie noch nginx und php-fpm neu

systemctl restart nginx
systemctl restart php-fpm

Jetzt sollte sich OwnCloud über https://royd.dnsd.me/owncloud/ einrichten lassen. Und natürlich muss noch der entsprechende Mac-Client heruntergeladen und eingerichtet werden. Wer für sein abzugleichendes OwnCloud-Verzeichnis auf dem Mac noch ein passendes Icon sucht, hier gibt es zwei die benutzt werden könnten:

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/SidebariCloud.icns
/Programme/owncloud/Resources/ownCloud.icns

OwnCloud muss zwischendurch diverse Aktualisierungen durchführen. Standardmäßig wird dafür AJAX verwendet, um diese bei Seitenaufruf auszuführen. Wir können diese Aufgabe allerdings auch in einen Cron-Job auslagern.

  1. Dafür muss im Administrationsmenü von OwnCloud unter Cron-Jobs die Einstellung von AJAX auf CRON umgestellt werden.
  2. Anschließend fügen wir einen entsprechenden Cron-Job der jede Minute ausgeführt wird in ArchLinux ein:
    crontab -e
    * * * * * php -f /srv/http/cloud/cron.php
    

EDIT: Gerade diesen Blog gefunden, wo das gleiche Projekt verfolgt wird.

EDIT2: Weiterführender Link zum Thema nginx und OwnCloud.

re:oyd (7): Dynamisches DNS@Pogoplug v2

Damit unsere Server bei wechselnder IP-Adresse (aufgrund der 24h Zwangstrennung) von außen erreichbar bleibt, bietet es sich an, einen Anbieter von DDNS Services zu nutzen. Der wohl bekannteste, DynDNS bietet leider keine kostenlosen Accounts mehr an. Es gibt aber Alternativen, etwa DNSdynamic. Glück hat, wer einen Router sein eigen nennt, der mit entsprechenden kostenlosen Anbietern zusammenarbeitet. Mein Netgear DGND3800B kennt leider bisher nur DynDNS. Eine Anfrage beim Support stellt zwar in Aussicht, dass ein zukünftiges Firmeware-Update weitere Anbieter hinzufügen wird, aber bis dahin muss Abhilfe geschaffen werden. Da der pogoplug als Server ja sowieso den ganzen Tag läuft, kann er auch gleich die IP-Adresse bei DNSdynamic auf dem aktuellen Stand halten. Dafür brauchen wir nur ein Account, ein bisschen bash-Programmierung und eine cron-job.

  1. Als erstes richten wir unseren Account bei DNSdynamic ein: Accoutname: „MEIN@ACCOUNT.DE“, Passwort: „PASSWORT“, URL: „royd.dnsd.me“ – ist doch gut zu merken ;-)
  2. Eine Datei myDNSdynamic.ip ohne Inhalt und eine Datei updateIP.sh mit folgendem Inhalt im Verzeichnis „/usr/sbin“ erstellen:
    #!/bin/sh
    FILE="/usr/sbin/myDNSdynamic.ip"; #DATEI IN DER DIE JEWEILS LETZTE IP GESPEICHERT WIRD
    MYOLDIP=`head -n 1 $FILE`;
    MYIP=$(wget -O - -q icanhazip.com); #AKTUELLE IP ABRUFEN
    if [ "$MYIP" != "$MYOLDIP" ]  #WENN SICH IP GEÄNDERT HAT, BEI DNSDYNAMIC AKTUALISIEREN
            then
            echo $MYIP > $FILE; 
            URL="https://www.dnsdynamic.org/api/?hostname=royd.dnsd.me&myip="${MYIP};
            wget -O - -q --user MEIN@ACCOUNT.DE --password PASSWORT $URL;
    fi 
    
  3. Die gerade erstellte Datei ausführbar machen:
    chmod +x /usr/sbin/updateIP.sh
  4. Und jetzt noch einen cron-job erstellen, der die Datei alle 5 Minuten aufruft:
    crontab -e

    Folgenden Inhalt einfügen:

    */5 * * * * /bin/sh /usr/sbin/updateIP.sh

re:oyd (6): SSL web/php@Pogoplug v2

Da private Dateien auf unserem Server gespeichert und übertragen werden sollen, macht es Sinn, alle Verbindungen über SSL abzusichern. Infos wie das geht, finden sich etwa hier oder hier.
Zunächst brauchen wir die notwendigen Schlüssel, um eine sichere SSL-Verbindung aufbauen zu können. Normalerweise werden diese extern zertifiziert, wir zertifizieren uns die Schlüssel jedoch selber (das führt allerdings dazu, dass alle Browser uns später beim Aufrufen unsere Serverwebseite darauf hinweisen werden, dass die Identität des Schlüssels nicht festgestellt werden kann und daher nicht vertrauenswürdig sei).

  1. Als erstes wechseln wir in das Verzeichnis, wo später die Schlüssel liegen sollen:
    cd /etc/nginx/
  2. Dann erstellen wir den privaten Schlüssel:
    openssl genrsa -des3 -out server.key 1024
  3. Jetzt das Certificate Signing Request erstellen:
    openssl req -new -key server.key -out server.csr
  4. Um Nginx automatisch mit SSL starten zu können, ohne jedes mal unsere Passwort angeben zu müssen:
    cp server.key server.key.org
    openssl rsa -in server.key.org -out server.key
  5. Und zum Schluss signieren wir unsere Serverzertifikat mit einer Laufzeit von 10 Jahren:
    openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

Als nächsten müssen wir nginx mitteilen, dass wir ab jetzt eine SSL Zertifikat haben und ALLE Verbindungen über SSL aufbauen wollen. Dafür müssen wir die Konfigurationsdatei von nginx wie folgt (ACHTUNG, nur ausschnittsweise Darstellung der Datei) anpassen (/etc/nginx/nginx.conf):

server {
       listen       80;
       server_name  localhost; # SPÄTER MUSS HIER DER DYNDNS NAME HIN
       rewrite ^ https://$server_name$request_uri? permanent; # ALLE http Anfragen in https Anfragen ändern
        
       location / {
            root   /srv/http;
            index  index.php index.html index.htm;
       }
 
       location ~ \.php$ {
            root   /srv/http;
            fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock; 
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;
            fastcgi_param HTTPS on;
            include  fastcgi_params;
       }
}

server {
        listen  443;
        server_name  localhost;   # SPÄTER MUSS HIER DER DYNDNS NAME HIN
        ssl     on;
        ssl_certificate      /etc/nginx/server.crt;
        ssl_certificate_key  /etc/nginx/server.key;
        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            root   /srv/http;
            index index.php index.html index.htm;
        }

        location ~ \.php$ {
        root   /srv/http;
        fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock; 
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;
        fastcgi_param HTTPS on;
        include  fastcgi_params;
        fastcgi_param HTTP_AUTHORIZATION $http_authorization;
        fastcgi_param htaccessWorking true;
}

Jetzt nur noch nginx neustarten

systemctl restart nginx

und unser pogoplug-Server sollte alle Verbindungen über SSL absichern.