Thomas Kramer

IT-COW | All posts tagged 'Docker'

Aufsetzen eines Nextcloud-Servers mit SWAG als SSL-Reverse-Proxy

By Administrator at November 03, 2021 22:09
Filed Under:

Nextcloud eignet sich um einen eigenen, privaten Cloud-Server aufzusetzen. Man kann so etwas fertig mieten, aber ich habe meinen eigenen Server neu aufgesetzt. Als Virtualisierungsplattform benutze ich mittlerweile Proxmox mit einem NUC, auf dem ich einige Server-Anwendungen in Dockern laufen lasse.

 

Als erstes braucht man für seinen Server einen Eintrag in einem öffentlichen DNS-Server, wenn man ihn nicht über eine häufig wechselnde, öffentliche IP-Adresse ansprechen will. Wer eine Fritzbox benutzt kann es mit MyFritz versuchen, dem hauseigenen DNS-Dienst von AVM.

 

In meinem Fall habe ich es nun mit DuckDNS umgesetzt, einem kostenlosen DNS-Dienst. Die Benutzung von DuckDNS könne viel einfacher nicht sein. Zunächst muss man sich über einen externen Account einloggen, dazu gibt es mehrere Möglichkeiten wie GitHub, Reddit oder Twitter. Wer ein Android-Handy benutzt, kann sich auch mit seinem GMail-Account von Google einloggen.

 

Sobald man eingeloggt ist bekommt man ein sogenanntes Token zugeordnet, eine längere Buchstaben-/Zahlenkombination. Danach braucht man nur noch die gewünschten Domains zu reservieren, natürlich alle mit der Endung .duckdns.org:

image

Dabei sieht man dann auch, welche IP-Adresse man von seinem Internetprovider aktuell zugewiesen bekommen hat. Die registrierten Domänen zeigen alle auf diese IP-Adresse. Als Privatanwender muss man dabei berücksichtigen dass die eigene öffentliche IP-Adresse nicht fix ist, sondern häufiger wechselt.

 

Da der Dienst kostenlos ist und man ihn sich mit Millionen anderer Anwender teilen muss, ist die Wahrscheinlichkeit hoch dass man seinen gewünschten Domänennamen nicht bekommt und man eine unsinnige Buchstaben-/Zahlenkombination anhängen muss. Wer das nicht wünscht kann sich natürlich woanders auch eine eigene Domäne mieten, muss dann aber Geld bezahlen.

 

Wie erwähnt arbeitete ich mit Docker-Containern unter Linux. Mit dem Kommandozeilen-Befehl

docker ps

lässt sich grundsätzlich eine Übersicht aller laufenden Docker anzeigen, mit der Information welche Ports sie jeweils belegen, aus Host- und aus Docker-Sicht.

 

Nachfolgend beschreibe ich die Einrichtung der einzelnen Docker-Container für die Verwendung von Nextcloud. Alle Container sollen untereinander über den Namen kommunizieren können, anstatt nur über die IP-Adressen. Daher legt man zunächst ein sogenanntes “User defined Bridge Network” an:

docker network create lsio

 

Als ersten Container legt man den Reverse-Proxy SWAG für die SSL-Verschlüsselung an. SWAG holt automatisiert über Cronjobs die SSL-Zertifikate von der freien Zertifizierungsstelle Let’s Encrypt und benötigt dazu das Token von dem DuckDNS-Account. Am Rande will ich erwähnen dass SWAG nicht auf DuckDNS festgelegt ist.

 

docker create \
  --name=swag \
  --cap-add=NET_ADMIN \
  --net=lsio \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/Berlin \
  -e URL=$DOMAIN.duckdns.org \
  -e SUBDOMAINS=wildcard \
  -e VALIDATION=duckdns \
  -e DUCKDNSTOKEN=$TOKEN \
  -p 443:443 \
  -v $HOST_MAP_PATH:/config \
  --restart unless-stopped \
  ghcr.io/linuxserver/swag

 

Der Slash \ bedeutet dass der Befehl noch weiter über die nächste Zeile geht. Für $DOMAIN, $TOKEN und $HOST_MAP_PATH müsst Ihr natürlich eure eigenen Werte eintragen. Danach kommt die Einrichtung von MariaDB und Nextcloud dran. Grundsätzlich kann man auch alle drei Container über eine YAML-Datei auf einmal anlegen lassen, siehe die Dokumentation von SWAG. Die Parameter müsst Ihr trotzdem anpassen.

 

Der Container muss natürlich auch gestartet werden:

docker start swag

 

Grundsätzlich kann man mit dem Befehl

docker exec -it $Containername bash

eine Kommandozeile in die interne Sicht der Container öffnen. Manchmal muss man in den Containern noch Einstellungsdateien editieren, und nicht immer ist ein Texteditor vorinstalliert. Daher empfiehlt sich mit

apt-get update
apt-get install nano

die Paketquellen upzudaten und den Nano-Texteditor zu installieren.

 

Danach macht Ihr eine Bash in die interne Sicht des SWAG-Containers auf:

docker exec -it swag bash

Wechselt in den Pfad

cd /config/nginx/proxy-confs

und benennt die vorgefertigte Sample-Datei für Nextcloud um:

mv nextcloud.subdomain.conf.sample nextcloud.subdomain.conf

 

Dann bearbeitet Ihr die Datei mit

nano nextcloud.subdomain.conf

und ändert diese zwei Parameter, die zuvor auf 443 und https standen:
set $upstream_port 80;
set $upstream_proto http;

 

Auf der SWAG-Seite gibt es eine eigene Installationsanleitung für die Benutzung von SWAG mit Nextcloud, aber die Anleitung scheint unvollständig zu sein. Die Einrichtung des Nextcloud-Containers für SSL-Datenverkehr fehlt, denn ich erhielt “Connection refused”-Fehlermeldungen vom nginx-Webserver von SWAG in /config/log/nginx, wenn er versucht SSL-Verbindungen zu Nextcloud aufzubauen. Per Default ist ein Nextcloud-Container auch nicht fertig für SSL-Datenverkehr eingerichtet, denn dazu benötigt man natürlich ein eigenes SSL-Zertifikat.

 

Daher habe ich den Upstream-Port für die Weiterleitung des Datenverkehrs von SWAG zu Nextcloud in dieser Datei auf 80 geändert und das Upstream-Protokoll auf HTTP. Das sieht dann so aus, dass die Kommunikation nach draußen nur über den SSL-Port 443 erfolgt, aber zwischen den Containern unverschlüsselt über den HTTP-Port 80. Aus meiner Sicht ist das sicherheitstechnisch unbedenklich, denn es reicht aus die externe Kommunikation nach draußen zu verschlüsseln.

 

Bei den meisten beigefügten Sample-Dateien innerhalb des SWAG-Containers wird auch auf unverschlüsselte HTTP-Kommunikation zwischen den Containern gesetzt, aber bei der Beispieldatei für die Nextcloud-Weiterleitung war per Default eben HTTPS angegeben. Es scheint daher durchaus üblich zu sein nur die Kommunikation nach draußen zu verschlüsseln, u. a. dafür benutzt man ja auch den SWAG-Container damit man sich nicht um die SSL-Konfiguration der anderen Container kümmern muss.

 

Natürlich müsst Ihr den SSL-Port 443 auch in eurem Router freigeben, den unverschlüsselten Port 80 gebt Ihr nicht frei. Der SWAG-Container kümmert sich dann automatisch um die Aktualisierung der Let’s Encrypt-Zertifikate, denn diese Zertifikate sind nur drei Monate gültig. Mit exit könnt ihr die Bash aus dem Container wieder verlassen.

 

Die Einrichtung des MariaDB-Containers kann so erfolgen:

docker run --name mariadb \
--net=lsio \
-p 3306:3306 \
-v $HOST_MAP_PATH1:/etc/mysql/conf.d \
-v $HOST_MAP_PATH2:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=$Password \

--restart unless-stopped \
-d mariadb:latest

 

Bei den Variablen müsst Ihr natürlich wieder eigene Werte einsetzen. Wer will kann auch die Ports anders mappen, das Mapping geschieht über HOST_PORT:CONTAINER_PORT.  Danach sollte man in die Logs der einzelnen Container mit

docker logs $Containername

grundsätzlich einmal reinschauen und kontrollieren, ob sie ohne Fehlermeldung hochfahren.

 

Dann habe ich mich in den MariaDB-Container eingeloggt und eine Nextcloud-Datenbank angelegt:

docker exec -it mariadb bash

mysql -u root –p
show databases;
create database nextcloud;
create user nextcloud;

 

Wenn der Nextcloud-Einrichtungsdialog später bei euch auch anzeigt dass er sich nicht über eine bestimmte interne IP-Adresse in die Datenbank einloggen kann, benötigt Ihr auch diesen Befehl:
GRANT ALL ON nextcloud.* to 'nextcloud'@'$IP-ADRESS' IDENTIFIED BY '$PASSWORD' WITH GRANT OPTION;

Mit ifconfig könnt Ihr euch die vom System verwendeten IP-Adressen auch anzeigen lassen.

 

Außerdem zeigte mir Nextcloud beim Login auch die Fehlermeldung

“InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE”

an und ich musste mit

nano /etc/mysql/my.cnf

die Einstellungsdatei bearbeiten und den Befehl

innodb_read_only_compressed=OFF

hinzufügen.

 

Nachfolgend die Einrichtung des Nextcloud-Containers:

docker run -d \
--name=nextcloud \
--net=lsio \
-e PUID=1000 \
-e PGID=1000 \
-p 443:443  \
-p 80:80  \
-v $HOST_MAP_PATH1:/var/www/html \
-v $HOST_MAP_PATH2:/var/lib/mysql \

--restart unless-stopped \
nextcloud

 

Macht dann eine Bash in den Nextcloud-Container auf:

docker exec -it nextcloud bash

Anschließend wieder die Paketquellen aktualisieren und nano als Texteditor installieren:
apt-get update
apt-get install nano


Dann bearbeitet die Einstellungsdatei von Nextcloud mit
nano /var/www/html/config/config.php

und fügt bei Trusted Domains eine Zeile hinzu:

'trusted_domains' =>
array (
  0 => '$IP-ADRESS:80',
  1 => 'nextcloud.$DOMAIN.duckdns.org',
),

 

Der 0.-Eintrag sollte schon vorhanden sein, fügt den 1.-Eintrag mit dem von DuckDNS vergebenen DNS-Eintrag hinzu.

Weitere Parameter die Ihr in dieser Datei hinzufügen müsst:

'overwrite.cli.url' => 'https://nextcloud.$DOMAIN.duckdns.org',
'overwritehost' => 'nextcloud.$DOMAIN.duckdns.org',
'overwriteprotocol' => 'https',
'trusted_proxies' => ['swag'], 

 

Wenn Ihr von Nextcloud später nicht die Warnung

“Der “Strict-Transport-Security” HTTP-Header ist nicht auf mindestens “15552000” Sekunden eingestellt”

bekommen wollt, müsst Ihr auch die Datei

nano /config/nginx/ssl.conf

bearbeiten und die Zeile

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

hinzufügen. Das hat dann den Effekt, dass nur noch verschlüsselte HTTPS-Verbindungen akzeptiert werden.

 

In Nextcloud kann auch die Warnung

“Dem Modul php-imagick fehlt die SVG-Unterstützung. Für eine bessere Kompatibilität wird empfohlen, es zu installieren.”

kommen, dann ist (optional) in dem Nextcloud-Container dieses Modul zu installieren:

apt-get install libmagickcore-6.q16-6-extra

Dann den Container mit exit verlassen.

 

Bei der Nextcloud-App auf meinem Android-Handy gab es außerdem einen Hänger beim Klick auf den “Zugriff gewähren”-Button. Das kann man über den Befehl

docker exec -it -u www-data nextcloud bash -c './occ config:system:set overwriteprotocol --value="https"'

beheben. Das müsste derselbe Parameter wie bei der Bearbeitung der config.php weiter oben angegeben sein.

 

Falls Ihr die Nextcloud-Webseite noch nicht aufgerufen habt, solltet Ihr das jetzt versuchen. Beim ersten Aufruf ist Nextcloud noch nicht vollständig installiert und Ihr könnt die bevorzugte Datenbank auswählen. Da Ihr MariaDB installiert habt wählt Ihr das dort aus. Falls Ihr die Datenbank-Ports anders gemappt habt solltet Ihr das berücksichtigen, die Datenbank ist natürlich mit $ADRESSE:$PORT anzugeben.

 

Beim ersten Login wird Nextcloud die Einrichtung erst noch abschließen. Wenn alles funktioniert hat könnt Ihr das SSL-Zertifkat von Let’s Encrypt über das Schloss-Symbol in eurem Firefox aufrufen. Schaut dann in Nextcloud in den Einstellungen bei der Übersicht rein, denn dort prüft Nextcloud die Installation und zeigt Warnungen bei Installationsproblemen an.

 

Die IP-Adresse die Ihr von eurem Internetprovider zugeordnet bekommen habt wird sich regelmäßig ändern, es ist daher notwendig den DuckDNS-Dienst über die IP-Änderung zu informieren. Dazu setzt man zuletzt einen eigenen Docker für DuckDNS auf:

 

docker run -d \
  --name=duckdns \
  -e PUID=1000  \
  -e PGID=1000  \
  -e TZ=Europe/Berlin \
  -e SUBDOMAINS=$DOMAIN \
  -e TOKEN=$TOKEN \
  -e LOG_FILE=true  \
  -v $HOST_MAP_PATH:/config \
  --restart unless-stopped \
  lscr.io/linuxserver/duckdns

 

Am Rande möchte ich noch erwähnen dass sich die Nextcloud-App auf eurem Handy durch die Google Play Services automatisch aktualisieren wird. Entsprechend ist serverseitig auch eine automatische Aktualisierung eurer Docker-Container zu empfehlen, wie das einzurichten geht habe ich im vorherigen Eintrag beschrieben.

 

Übrigens gibt es in SWAG viele weitere vorgefertigte Sample-Dateien für diverse Dienste, wie Adguard, Emby, Duplicati und Dokuwiki.


Nextcloud kann man neben MariaDB auch mit PostgreSQL betreiben. Auf dieser Seite wird beschrieben wie man die MariaDB-Datenbank von Nextcloud nach PostgreSQL migrieren kann.

 

Die Anleitung von bitblokes sieht auch gut aus, falls jemand Nextcloud mit Reverse Proxy nativ ohne Docker einspielen möchte.

 

Ergänzung 19.11.2021: Die Hintergrundjobs in Nextcloud werden standardmäßig über die Seitenaufrufe getriggert, aber es gibt auch die bessere Möglichkeit sie über Cronjobs triggern zu lassen. Dann werden die Seitenaufrufe nicht deswegen ausgebremst.

 

Dazu geht man in Nextcloud auf die Grundeinstellungen-Seite und wählt bei Hintergrund-Aufgaben Cron aus. Der Nextcloud Container enthält für den User www-data zwar eine Cron-Datei in /var/spool/cron/crontabs, aber es gibt keinen Cron-Prozess der sie regelmäßig aufrufen würde.

 

Man kann aber über die Cronjobs des Hosts Skripte in den Docker-Containern automatisch aufrufen lassen. Dazu loggt man sich als root auf dem Host ein und gibt crontab –e ein, und fügt in der Crontab dann die folgende Zeile hinzu:

 

*/5 * * * * docker exec --user www-data nextcloud php -f /var/www/html/cron.php

 

Dadurch werden die Hintergrundjobs von Nextcloud alle fünf Minuten durchgeführt. Um zu sehen ob es funktioniert, schaut auf der Einstellungen-Seite nach ein paar Minuten vorbei:

 

image

 

Falls es nicht funktioniert, wird hier dann ein Fehler angezeigt.

 

Ergänzung 21.11.2021: Auch Collaboara Online zu installieren, ist nicht so schwer. Dabei handelt es sich quasi um LibreOffice im Webbrowser. Man kann damit über den Webbrowser Text-/ oder Tabellendokumente bearbeiten.

 

Für die Installation führt man diesen Befehl aus:

 

docker run --name=collabora -t -d -p $IP-Adresse:9980:9980 -e "domain=nextcloud\\.$Domain\\.duckdns\\.org" -e "username=admin" -e "password=$Password" --net=lsio --restart always collabora/code

 

Dann loggt man sich in den SWAG-Container ein:

docker exec –it swag bash

 

Dann geht man in das Verzeichnis mit den Konfigurationsdateien:

cd /config/nginx/proxy-confs

und benennt die bereits vorhandene Beispieldatei um:

mv collabora.subdomain.conf.sample collabora.subdomain.conf

 

Dann geht Ihr mit exit aus dem Container raus und lasst mit

docker restart swag

SWAG neu starten.

 

Anschließend geht Ihr bei Nextcloud in die Einstellungenseite für Collabora und tragt eure Domain ein:

 

image

 

Danach könnt Ihr Textdokumente im Webbrowser über Nextcloud bearbeiten. Die Adminkonsole von Collabora Online erreicht man über

https://$IP-Adressse:9980/loleaflet/dist/admin/admin.html#

 

Ergänzung 26.11.2021: Hatte beim Nextcloud-Container vergessen die Zeitzone mit dem TZ-Parameter zu übergeben, daher wurde mir eine falsche Uhrzeit in Nextcloud angezeigt.

 

Man kann es aber auch nachträglich im Container ändern, zuerst in den Container einloggen:

docker exec –it nextcloud bash

 

Dann den symbolischen Link löschen:

rm –rf /etc/localtime

 

Dann einen neuen Link anlegen:

ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Danach kann man den Container mit exit wieder verlassen.

 

Ergänzung 28.11.2021: In der SWAG-Anleitung gibt es auch einen Abschnitt: “Using certs in other containers”, falls man auch die Kommunikation der Container untereinander verschlüsseln möchte.

 

Alternativ kann man auch die Reverse Proxys “Traefik” oder “Nginx Proxy Manager” benutzen, von denen es auch einen Docker-Container gibt. Diese beiden haben auch ein schönes Dashboard, das fehlt SWAG leider.

 

Ich muss noch ein Backup für Nextcloud einrichten, aber eventuell warte ich da noch auf die integrierte Lösung die in Nextcloud 23 kommen soll. Da ich die Nextcloud-Anwendung auf meinen PCs eingerichtet habe, werden meine Dateien ohnehin auf den Clients gespiegelt. Dazu hatte ich als Spiegelungsoption “virtuelle Dateien” deaktiviert. Oder ich sichere über Proxmox…

   

Tag-Wolke

Monats-Liste