Dateiablage (und viel mehr) mit Nextclound

Kurzbeschreibung

Eigentlich kann eine Kurzbeschreibung Nextcloud nicht annähernd gerecht werden. Verglichen mit den anderen Anwendungen, die ich ausprobiert habe, ist Nextcloud eher ein Schwergewicht. Hier eine kurze Übersicht der Features, auf die ich ein Auge geworfen hatte:

Eine Reihe der vorinstallierten Apps habe ich deaktiviert, überhaupt nicht zum Laufen gebracht habe ich Nextcloud Office. Aber meine Anwendungsfälle sind mehr als erfüllt, insbesondere in Kombination mit dem Nextcloud Desktop Client den es u.a. auch für mein Xubuntu gibt (Paket nextcloud-desktop) und der die Synchronisation von Cloud-Ordnern mit lokalen Ordnern ermöglicht.

Einrichtung

Es gibt offizielle Docker-Images in verschiedenen Geschmacksrichtungen, ich verwende nextcloud:apache, das ca. 950 Megabyte umfasst. Um genau zu sein verwende ich sogar ein eigenes Image, das auf dem offiziellen basiert und aus folgendem Dockerfile entsteht:

FROM nextcloud:apache
COPY setssl.sh /usr/local/bin/
RUN /usr/local/bin/setssl.sh admin@filebox filebox

Der Grund dafür ist, dass die Unterstützung von HTTPS auf dem "offiziellen" Weg vergleichsweise umständlich ist, Let's Encrypt involviert und deshalb eine Erreichbarkeit aus dem Internet erfordert, die ich für die ersten Experimente so nicht haben wollte. Stattdessen verwende ich ein selbst-signiertes Zertifikat nach dieser Anleitung. Von dort stammt auch das Shellskript setssl.sh, das den Apache 2 für SSL konfiguriert:

# setssl.sh
# USAGE: setssl.sh <email> <domain>

echo 'SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
SSLCompression off
SSLSessionTickets Off' > /etc/apache2/conf-available/ssl-params.conf
echo "<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
            ServerAdmin $2
            ServerName $1
" > /etc/apache2/sites-available/default-ssl.conf
echo '
            DocumentRoot /var/www/html

            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined

            SSLEngine on

            SSLCertificateFile    /etc/ssl/nextcloud/cert.pem
            SSLCertificateKeyFile /etc/ssl/nextcloud/key.pem

            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                            SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                            SSLOptions +StdEnvVars
            </Directory>
    </VirtualHost>
</IfModule>' >> /etc/apache2/sites-available/default-ssl.conf
a2enmod ssl >/dev/null
a2ensite default-ssl >/dev/null
a2enconf ssl-params >/dev/null

Das ganze kann man in eine docker-compose.yaml verpacken, sodass das Starten und Stoppen wieder zum (einfachen) Einzeiler wird:

services:
  app:
    build: .
    ports:
      - "9443:443"
    volumes:
      - ./data:/var/www/html
      - ./certs:/etc/ssl/nextcloud

Danach muss nur noch ein Zertifikat erstellt und im Verzeichnis certs/ platziert werden, schon kann der Dienst mit docker-compose up -d gestartet werden. Begrüßt wird man von einer Startseite, auf der die Zugangsdaten für den Admin-Account festgelegt werden. Weiterhin erscheint eine Performance-Warnung wegen der defaultmäßig verwendeten SQLite-Datenbank. Für das erste Rumspielen ist das okay, für eine produktive Umgebung möchte man vielleicht etwas anderes verwenden (siehe unten). Aber die erste Installation sollte man eh zum Kaputtbasteln und Wegwerfen vorsehen, denn Nextcloud bietet viele Konfigurationsmöglichkeiten und Zusatzanwendungen, die man erstmal kennenlernen muss. Das Schöne an diesem Setup ist, dass man innerhalb weniger Sekunden wieder mit einer komplett frischen Installation aufsetzen kann:

$ docker-compose down
$ sudo rm -rf data
$ docker-compose up -d

Hier meine "Komplettlösung" für die ersten Handgriffe:

Viele der Apps haben benutzerspezifische Einstellungen, in denen zu stöbern sich sehr lohnen kann. Am besten Zettel und Stift bereithalten und notieren, was man ausprobiert hat, um später bewerten zu können, ob es was gebracht hat und ob man es in einer späteren Installation wieder tun möchte; so einfach wie jetzt wird es nie wieder; wenn man seine Nextcloud erstmal mit Daten betankt hat, wird man nicht mehr so leichtfertig neu aufsetzen wollen.

Für das produktive Setup sollte man sich Gedanken über eine andere Datenbank machen. Ich habe nur kurz mit SQLite vs. MariaDB herumgespielt und tatsächlich keine relevanten Unterschiede in den Ladezeiten bemerkt. Allerdings ist das ein Test-Setup mit sehr wenigen Daten und Nextcloud selbst sagt mehr als deutlich, dass man etwas "anständiges" benutzen soll, spätestens wenn man einen Client zur Synchronisation nutzen möchte. Außerdem, so meine Überlegungen, wird die einmal eingerichtete und beladene Instanz bestimmt eine ganze Weile leben und evtl. mal auf eine schnellere Maschine umziehen, bei der dann eine "echte" Datenbank plötzlich die Performance-Vorteile ausspielen kann, die jetzt auf einem RaspberryPi 3 durch andere Begrenzungen (CPU, RAM) nicht auffallen.

Folgende docker-compose.yaml, die der Dokumentation des offiziellen Nextcloud-Docker-Images entstammt, definiert eine Anwendung, die aus MariaDB und Nextcloud besteht und beide miteinander bekannt macht (Passwörter entsprechend einfüllen):

services:
  db:
    image: mariadb:10.5
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
  app:
    build: .
    ports:
      - "9443:443"
    links:
      - db
    volumes:
      - ./nextcloud:/var/www/html
      - ./certs:/etc/ssl/nextcloud
    environment:
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

Der erste Start dauert ein gutes Stück länger, aber danach läuft alles wie gewohnt (außer dass die nervigen Performance-Warnungen nicht mehr kommen).

Fazit

Ich werde Nextcloud nicht benutzen. Das mag nach der ausführlichen Anleitung überraschen (die ich tatsächlich auch schon geschrieben hatte, bevor ich mich gegen Nextcloud entschieden habe), liegt aber auch weniger an der Software als an der verwendeten Hardware: der Raspberry Pi 3 packt es einfach nicht.

Wie gesagt: ich gehe davon aus, dass es ein reines Performance-Problem ist. Ein Raspberry Pi 3 ist keine Wundermaschine und 1 Gigabyte RAM ist in diesem Kontext lächerlich wenig. Ich nehme an, mit einem Raspberry Pi 4 sähe das schon ganz anders aus, insbesondere in der 4- oder 8-Gigabyte-Version.

An sich scheint Nextcloud auf dem Raspberry Pi durchaus zu funktionieren: ich bin im Laufe meiner Recherchen auf das Projekt NextcloudPi gestoßen, bei dem ein Nextcloud-Setup inklusive weiterer nützlicher Anwendungen (fail2ban, Redis, ...) erarbeitet wurde, direkt für den "Bare Metal"-Einsatz auf dem Raspberry Pi. Wer jetzt weniger am Docker-Szenario hängt, sich aber gerne mit Nextcloud beschäftigen möchte, der sollte sich das mal genauer ansehen.


Zurück zur Hauptseite