c't 10/2018
S. 142
Praxis
Nextcloud ins NAS
Aufmacherbild

NAS mit Wolke

Nextcloud als Docker-Instanz im NAS einrichten

Die eigene Cloud macht unabhängig von Dienstleistern, denen man keine heiklen Daten anvertrauen mag. Als Nextcloud-Instanz in einem Docker-fähigen NAS bleiben die Daten sogar physisch innerhalb der eigenen vier Wände. Das einzurichten ist weniger kompliziert, als es klingt.

Wer einen für Docker geeigneten Netzwerkspeicher (NAS) besitzt, der muss nur ein wenig Zeit investieren, um ihn zum eigenen Cloud-Server für Familie, WG oder Kleinfirma aufzuwerten. Der Nextcloud-Dienst zum Synchronisieren von Dateien, Terminen und Kontakten wird mit einer (Dyn)DNS-Domain und Portfreigaben im Router auch von unterwegs aus nutzbar.

Wie das konkret geht, zeigen wir am Beispiel des Synology-NAS DiskStation DS218+ mit Firmware 6.1.6. Das Vorgehen gilt prinzipiell genauso – wenn auch mit Unterschieden in Details – für andere Geräte seiner Klasse [1].

Für diese Anleitung gehen wir davon aus, dass das NAS eingerichtet und aus dem Internet über einen DynDNS-Namen oder einen eigenen Domainnamen erreichbar ist. Die meisten Schritte können Sie mit dem Admin-Zugang über den Browser erledigen. Dabei verwenden wir die Menünamen der Systemsteuerung aus Synologys NAS-Betriebssystem DSM. Nur zwischendrin und zum Schluss sind zwei kurze einmalige Ausflüge auf die Kommandozeile nötig.

Eingehende Docker-Kenntnisse brauchen Sie nicht, die wichtigsten Grundlagen erklären wir en passant in Kürze. Häufige Fragen rund um Docker beantwortet der Artikel auf Seite 160 in diesem Heft.

Der erste Schritt ist, die Docker-Erweiterung aus Synologys Paketzentrum zu installieren. Anschließend erstellen Sie drei Container: eine SQL-Datenbank als Grundlage, die aktuelle Nextcloud-Version und das Docker-Tool Watchtower zum automatischen Updaten der Container.

Rufen Sie im NAS-Menü Docker über sein Icon auf. Per Klick auf „Registrierung“ können Sie die zum Erstellen der ersten beiden Container-Instanzen nötigen Images herunterladen. Sie finden sie ohne langwieriges Scrollen über das Suchfeld mit den Begriffen „mysql“ und „nextcloud“. Damit tauchen mehrere Treffer unterschiedlicher Umsetzungen auf.

Der Orden in Synologys Docker-Umsetzung markiert jene Images, um die sich Firmen kümmern, die mit dem Support ihr Geld verdienen. Im Docker-Hub heißen sie „official“ und gelten als gut gepflegt.

Wählen Sie aus den typischerweise als ersten erscheinenden Einträgen mit dem „Official“-Orden. Er kennzeichnet die Images von Firmen, die hinter den Tools stehen und mit Support dazu ihr Geld verdienen. Sie können hier also von gut gepflegten Images ausgehen.

Nextcloud nutzt eine externe Datenbank für seine Konfiguration und Informationen über den Dateibestand. Es versteht sich mit MySQL, MariaDB oder PostgreSQL. Wir haben das nicht unter Oracles Fuchtel stehende MariaDB gewählt.

Behalten Sie bei den Image-Downloads als Tag „latest“ bei, um die neueste Version zu erhalten. Der Download der insgesamt fast 1000 MByte dauert je nach Internetanbindung einige Zeit. Während Nextcloud noch lädt, können Sie schon mit dem vollständig heruntergeladenen Datenbank-Image loslegen.

Datenbank präparieren

Im Synology-Docker finden Sie die Images unter „Abbild“. Starten Sie dort die Datenbank. Die „Allgemeinen Einstellungen“ müssen Sie nur ändern, wenn Sie möglichst viel des im Grundausbau mit 2 GByte knappen NAS-RAM als Puffer für parallele Dateioperationen frei halten wollen: Eine schon länger laufende, für Nextcloud reservierte Datenbank belegte beim Autor rund 230 MByte. Ein sicherer RAM-Grenzwert für die Datenbank wäre also 500 MByte.

Über eine Zuordnung (Volume-Mapping) erfährt ein Docker-Container, wo auf den NAS-Freigaben (hier der Ordner docker/sql) er seine Nutzerdaten lagern darf. Den korrekten Mount-Pfad für Container-interne Zugriffe (hier /var/lib/mysql) findet man in der Image-Beschreibung auf dem Docker-Hub.

Bei den „Erweiterten Einstellungen“ aktivieren Sie zunächst den automatischen Neustart; dies gilt auch für die folgenden Container. Unter „Volume“ sagen Sie diesem Container, wo auf dem NAS-Speicherplatz er seine Daten inklusive Konfiguration ablegen darf. Mit diesem Volume-Mapping trennt Docker die Nutzerdaten von den Programmdateien des Containers, was unnötige Backups vermeidet. Fügen Sie einen Ordner namens sql hinzu, wählen Sie ihn aus und tragen Sie unter „Mount-Pfad“ das Ziel /var/lib/mysql ein.

Im „Netzwerk“-Reiter setzen Sie das Häkchen bei „Dasselbe Netzwerk wie Docker-Host verwenden“. Damit meldet sich die SQL-Datenbank auf ihrem Standardport unter der NAS-Adresse im LAN und Sie können sie auch für andere Zwecke verwenden. Das geht freilich nur, falls nicht die SQL-Erweiterung des NAS selbst aktiv ist. In dem Fall würden Sie den Netzwerkmodus auf „Bridge“ belassen und die Container-Datenbank auf einen freien Port mappen.

Als letzten Schritt fügen Sie unter „Umwelt“ – ein ungeschickt übersetztes „Environment“ – die Umgebungsvariable MYSQL_ROOT_PASSWORD hinzu und setzen ein Passwort ein. Jetzt ist die Datenbank zum Start per Klick auf „Übernehmen“ bereit.

Damit Nextcloud sie nutzen kann, legen Sie einen SQL-Nutzer nebst Passwort an und räumen diesem Nutzer passende Rechte ein. Rufen Sie den Container in der Übersicht über den Details-Knopf auf. Dort wählen Sie den Reiter „Terminal“ und klicken auf „Erstellen“. In der dann aufgehenden Root-Shell sind folgende Befehle nötig:

mysql -u root -p

create user 'nextcloud'@'localhost' :

.identified by 'passwort';

grant all privileges on nextcloud.* :

.to 'nextcloud'@'%' identified by :

.'passwort';

Mit dem % im letzten Befehl darf der Nutzer „nextcloud“ nicht nur vom Docker-Host aus, sondern von überall her zugreifen. So gelangen Sie für eventuelle Notoperationen auch aus dem LAN an die nextcloud-Datenbank. exit beendet das SQL-Dienstprogramm.

Dieser Weg ist zwar etwas aufwendiger, als Nextcloud einfach das Root-Passwort für die MariaDB-Instanz zu geben. Doch so kann man die SQL-Datenbank auch für andere Dienste im LAN mitbenutzen.

Nextcloud installieren

Den Nextcloud-Container erstellen Sie auf dem gleichen Weg wie die Datenbank. Falls Sie den RAM-Bedarf begrenzen wollen, setzen Sie das Limit ebenfalls auf 500 MByte. Legen Sie für das Volume-Mapping den Ordner cloud an und ordnen Sie ihm den Ziel-Pfad /var/www/html zu.

Der Nextcloud-Container muss in einem Docker-internen Netzwerk laufen, weil der Webserver des NAS schon den HTTP- und HTTPS-Port belegt. Der hat also HTTPS-Verbindungsanfragen als Reverse-Proxy per HTTP weiterzuleiten, wozu man dem Nextcloud-Container einen festen „lokalen Port“ zuordnet.

Beim „Netzwerk“-Reiter bleibt die Voreinstellung „bridge“ bestehen; unter „Port“ ändern Sie „Lokaler Port“ von „Automatisch“ auf „8080“. Hier lauscht später der Container mit der IP-Adresse des NAS.

Widerstehen Sie nach dem Klick auf „Übernehmen“ der Versuchung, mit dem Browser schon mal zu gucken, ob Nextcloud auf seine lokale Adresse im LAN reagiert. Dann würde Nextcloud sich als Trusted-Domain seine LAN-IP-Adresse statt des Domainnamens merken und Sie müssten umständlich seine Konfigurationsdatei korrigieren.

Richten Sie vorher zwei Reverse-Proxy-Einträge im NAS ein – Details folgen gleich – sowie zwei Portweiterleitungen für HTTP (80) und HTTPS (443) in Ihrem Router, die auf die LAN-Adresse des NAS mit den gleichen Ports zeigen.

Webzugriff im NAS umbiegen

Zugriffe auf die Standardports für HTTP (80) und HTTPS (443) leitet der ins NAS integrierte Webserver nginx standardmäßig auf die Ports für die Konfigurationsseite um (5000/5001). Weil sich die Standardports nicht von nginx trennen lassen, nutzen wir ihn weiter.

Bequemer kommt man kaum an Let’s-Encrypt-Zertifikate: Der NAS-Webserver nginx kümmert sich darum. Über Einträge in „Alternativer Name“ gelten sie auch für mehrere Domains gleichzeitig. Und schon meckern Browser und Apps nicht mehr über selbstsignierte Zertifikate, für die man sonst überall Ausnahmen anlegen müsste.

Das bringt zwei Vorteile: Erstens erledigt nginx auch HTTPS, was Nextcloud nicht von selbst tut. Zweitens kann man die Funktion des NAS zum Beziehen und Erneuern von Let’s-Encrypt-Zertifikaten verwenden, damit Browser und CalDAV/CardDAV-Tools keine Warnungen auswerfen.

Der Zugriff auf die NAS-Konfiguration statt auf die Cloud-Funktion geschieht später mittels gezielter Portangabe: http://NAS-Adresse:5000 beziehungsweise 5001 (HTTPS). Wer es bequemer haben möchte, kann die Cloud mit einer separaten Sub-Domain vom NAS trennen, beispielsweise cloud.example.com. Dann klappt weiterhin der Zugriff über die gewohnte Domain mit den Standardports.

Mit einem Reverse-Proxy-Eintrag im NAS leitet nginx HTTPS-Verbindungswünsche an den Nextcloud-Container weiter, der selbst nur HTTP spricht.

Erstellen Sie im Anwendungsportal einen Reverse-Proxy-Eintrag, der die HTTPS-Zugriffe abfängt. Dazu tragen Sie den gewünschten Domainnamen bei „Hostname“ ein und aktivieren HSTS und HTTP/2. Das Ziel heißt localhost mit dem Port 8080, wo Nextcloud lauscht. Ein zweiter Eintrag für HTTP (80) lenkt unverschlüsselte Zugriffe auf HTTPS um, indem Sie die Domain als Quelle mit Port 80 und als Ziel mit Port 443 eintragen.

Nextcloud-Grundeinstellung

Erst jetzt rufen Sie für die Nextcloud-Einstellungen die Cloud-Domain im Browser auf. Legen Sie dort nun ein Admin-Konto nebst Passwort ein, klicken aber dann auf „Speicher & Datenbank“.

Dort wählen Sie „MySQL/MariaDB“. Bei den Datenbankeinstellungen tragen Sie den Nutzernamen (nextcloud), das zugehörige Passwort und den Datenbanknamen (nextcloud) ein. Als Adresse geben Sie die interne LAN-Adresse des NAS mit dem SQL-Standardport an, also beispielsweise 192.168.178.42:3306. Localhost funktioniert hier nicht, weil wir die Docker-SQL-Datenbank ins LAN gesteckt haben. Jetzt können Sie auf „Installation abschließen“ klicken.

Nextcloud muss Hintergrund-Aufgaben erledigen. Das tut es in der Voreinstellung bei jedem Seitenaufruf, doch die bleiben häufig über lange Zeit aus, wenn niemand die Dienste nutzt. Deshalb konfigurieren wir es auf den Webcron-Betrieb, bei dem ein externer Server – hier das NAS – regelmäßig eine Nextcloud-System-Seite aufruft.

Loggen Sie sich dazu als Administrator bei Nextcloud ein. Das Konfigurationsmenü erreichen Sie über den Kreis mit dem Initial rechts oben. Hier stellen Sie unter „Einstellungen“ / „Grundeinstellungen“ die Hintergrund-Aufgaben auf „Webcron“ um.

Dann schauen Sie mit der „File Station“ des NAS, ob es schon eine Freigabe namens „web“ gibt, die die NAS-Erweiterung Webstation angelegt hat. Falls ja, landet hier ein gleich zu erstellendes einzeiliges Skript. Falls nein, legen Sie über „Neuen gemeinsamen Ordner“ eine Freigabe namens „webdienst“ an, auf die nur die Administratoren zugreifen dürfen, und zwar lesend und schreibend.

Nun erzeugen Sie mit Ihrem Lieblingseditor eine Datei namens webcron.sh und schreiben den Einzeiler curl http://localhost:8080/cron.php hinein. Diese Datei kopieren Sie mit der File Station in die web[dienst]-Freigabe.

Jetzt erstellen Sie in „Systemsteuerung“ / „Aufgabenplaner“ eine „Geplante Aufgabe“ als „Benutzerdefiniertes Skript“. Im Reiter „Zeitplan“ wählen Sie, dass die Aufgabe täglich alle 15 Minuten ausgeführt wird, und ändern die letzte Ausführung auf 23:45. Bei „Aufgabeneinstellung“ tragen Sie den vollständigen Pfadnamen des Skripts ein: /volume1/web[dienst]/webcron.sh.

Damit ist die Grundeinrichtung von Nextcloud abgeschlossen und Sie können es per Browser weiter erkunden, Erweiterungen installieren und Nutzer anlegen.

Auto-Updates

Eines der coolsten Docker-Tools heißt Watchtower. Es überwacht alle laufenden Container auf neuere Images, sich selbst eingeschlossen. Taucht ein frisches Image auf dem Docker-Hub auf, dann lädt Watchtower es herunter, stoppt den oder die laufenden Container, frischt sie auf und startet sie neu. Das klappt bei sorgfältig konstruierten Containern ohne Funktionsverlust: Watchtower bewahrt die Konfiguration, wenn sie separat gelagert ist. Das klappte beim Autor selbst mit einem Nextcloud-Major-Update von Version 12 nach 13 reibungslos.

Leider lässt sich Watchtower beim Synology-NAS nicht über die Docker-Oberfläche einrichten, weil es zum Steuern der Container erhöhte Rechte benötigt. Deshalb ist ein Ausflug auf die Kommandozeile nötig.

Aktivieren Sie im NAS in der Systemsteuerung unter „Terminal & SNMP“ den SSH-Zugang. Loggen Sie sich mit einem Tool wie PuTTY (siehe ct.de/yz1d) als Admin ein. Mit sudo su - und Eingabe des admin-Passwortes werden Sie Root und setzen diesen Einzeiler ab:

docker run -d --name watchtower :

.-v /var/run/docker.sock:/var/run:

./docker.sock v2tec/watchtower :

.--interval 86400 --cleanup

Der Interval-Parameter weist Watchtower an, nur einmal täglich statt alle 5 Minuten nach Updates zu suchen. Cleanup entsorgt alte Images und ersetzte Container, damit diese nicht die NAS-Platte(n) vollmüllen. Eine Ressourcenbegrenzung braucht Watchtower nicht, der Container belegt im Betrieb keine 20 MByte RAM.

Nützliche Nextcloud-Extras

Ab Werk scheint Nextcloud nur ein Dateilager, wenn auch ein sehr komfortabel per Browser und App nutzbares. Doch es hat viel mehr Potenzial: Admins finden in ihrem Menü den Punkt „+ Apps“. Damit lassen sich zahlreiche Erweiterungen aus 11 Kategorien nachrüsten. Drei besonders nützliche können wir hier nur kurz listen: Calendar (Termine), Contacts (Kontakte) und Notes (Notizen).

Clients wie Smartphones oder PC-Apps können Daten mit diesen Erweiterungen über Protokolle wie CalDAV, CardDAV und WebDAV synchronisieren. Dazu muss man in ihren Apps selten mehr eintragen als eine URL, die auf das Konto auf dem Nextcloud-Server zeigt, und seine Zugangsdaten.

Auf Android-Smartphones taugt unserer Erfahrung nach DAVDroid gut zum Synchronisieren von Kontakten und Terminen. Die im Play Store dafür fälligen 4 Euro sind sehr angemessen, denn Familien dürfen die App auch noch teilen. Sparbrötchen finden das Tool auch im alternativen App-Markt F-Droid und können bei Gefallen für die App-Pflege spenden.

Beim Mailprogramm Thunderbird nutzt man die Add-ons Lightning (Termine) und CardBook (Kontakte), um es zum Outlook-Äquivalent aufzubrezeln. Denn mit einer richtigen Tastatur unter den Fingern sind Adressänderungen oder Termineinträge viel schneller und komfortabler erledigt als per Wischen und Tippen. (ea@ct.de)