Änderungsstand: 2021-08-30
Nextcloud, als Anwendung im Swarm Mode. Meine angelegte NFS-Freigabe für das Datenverzeichnis ist /mnt/data/… Im Gegensatz zur normalen Docker-Compose, kann Portainer bzw. der zu erstellende Service keine Verzeichnisse selbst anlegen. In diesem Fall lege ich die benötigten Verzeichnisse selbst an. In diesem Beispiel lege ich Nextcloud auf einem Worker-Node. Ich verwende dafür das linuxserver/nextcloud-Image und die linuxserver/mariadb.
Info: Ich hatte Probleme, Nextcloud, auf mehreren Nodes gleichzeitig, zu betreiben. Deshalb entschied ich mich, NC nur auf einem Worker-Node auszurollen.
Nextcloud (linuxserver/nextcloud) als Stack im Swarm installieren:
Nicht vergessen, die Pfade, am ersten Manager, anzulegen!
sudo mkdir -p /mnt/appdata/linuxserver_nextcloud_db && sudo mkdir -p /mnt/appdata/linuxserver_nextcloud && sudo mkdir -p /mnt/appdata/linuxserver_nextcloud_data
Im Portainer:
- Stacks
- + Add stack
- Name: lsnc
- Web editor: Folgenden Code eingeben:
- + Add stack
version: '3.2'
services:
lsnc-db:
image: ghcr.io/linuxserver/mariadb
volumes:
- /mnt/appdata/linuxserver_nextcloud_db:/config
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
- MYSQL_ROOT_PASSWORD=PASSWORT123
- MYSQL_PASSWORD=PASSWORT456
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
restart_policy:
condition: any
networks:
- lsnc_network
lsnc-nextcloud-redis:
image: redis:alpine
command: redis-server --requirepass PASSWORT159 # Redis Passwort
deploy:
restart_policy:
condition: any
networks:
- lsnc_network
lsnc-nextcloud:
image: ghcr.io/linuxserver/nextcloud
ports:
- 447:443
depends_on:
- lsnc-nextcloud-db
- lsnc-nextcloud-redis
volumes:
- /mnt/appdata/linuxserver_nextcloud:/config
- /mnt/appdata/linuxserver_nextcloud_data:/data
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == worker]
restart_policy:
condition: any
networks:
- lsnc_network
networks:
lsnc_network:
driver: overlay
attachable: true
Actions: Deploy the stack
Das Erstellen dauert jetzt etwas. 10 Minuten oder länger sind keine Seltenheit. Auch wenn im Portainer schon angezeigt wird, dass Nextcloud und die Datenbank ausgerollt wurden, dauert es noch ’ne ganze Weile, bevor man mit dem Browser darauf zugreifen kann!
Aufruf im Browser: http s://Server-IP:447
Nun ein Administrator-Konto anlegen und den Rest ausfüllen, wie auf dem Bild zu sehen (eigene Werte anpasen). Das Datenbank-Passwort in meinem Beispiel lautet: PASSWORT456

Nun „Installation abschließen“ klicken. Erscheint eine Fehlermeldung „504 Gateway Time-out“, einfach noch etwas warten (ein kleiner Kaffee regelt 🙂 ) und anschließend die Adresse noch einmal eingeben. Nextcloud wird gestartet.
Da es sich hier um linuxserver/nextcloud handelt, werden nun viele Befehle etwas anders aussehen, als man es von Nextcloud kennt. Auch das Konfigurationsverzeichnis lautet anders.
Jetzt nehme ich eine kleine Änderung in der Nginx-Config vor:
sudo nano /mnt/data/linuxserver_nextcloud/nginx/site-confs/default
Folgende Zeile nach „add_header X-Frame-Options „SAMEORIGIN“ always;“ einfügen (da steht schon einiges an add_header drin – einfach dort mit rein):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Strg-x, y, Enter
Anschließend den Stack stoppen und wieder starten. Auch dieser Startvorgang dauert etwas.
Jetzt nehme ich eine kleine Änderung in der Nextcloud-Config vor:
sudo nano /mnt/data/linuxserver_nextcloud/www/nextcloud/config/config.php
Folgendes nach der Zeile ‚memcache.local‘ => ‚\OC\Memcache\APCu‘, einfügen:
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'lsnc-nextcloud-redis',
'password' => 'PASSWORT159',
'port' => 6379,
),
Folgendes am Ende, aber vor ); einfügen:
'default_phone_region' => 'DE',
Strg-x, y, Enter
Nun ist Nextcloud soweit konfiguriert. Es bleiben lediglich einige Warnhinweise zu den „well-known/“- Sachen stehen. Das behebe ich am Ende, nachdem der Zugang von Außen eingerichtet wurde. Für den reinen internen Betrieb ist das nicht wichtig.
Wer nun Nextcloud nicht für den Zugriff von Außen benötigt, ist hier fertig.
Quelle(n):
https://docs.linuxserver.io/images/docker-mariadb
https://docs.linuxserver.io/images/docker-nextcloud
Nextcloud von Außen erreichbar machen:
Zuerst benötigt man im Idealfall mind. einen DynDNS-Dienst, welcher mit Subdomains umgenen kann. DuckDNS und DynDNSS, als Beispiele aufgezählt, können das. NoIP kann das in der kostenlosen Version NICHT! Anschließend benötigt man einen Reverse-Proxy. Ich verwende dafür „Nginx Proxy Manager“. Hier noch einmal die Guides dazu:
DynDNS (DuckDNS) | Nginx Proxy Manager
Info: Portweiterleitung des Routers zum Nginx Proxy Manager nicht vergessen. In meinem Beispiel ist das die Portweiterleitung zum ersten Manager-Node, egal, auf welchem Node sich am Ende NPM befindet. Der Cluster-Swarm-Manager regelt das.
Wurden beide Guides abgearbeitet, richte ich nun Nginx Proxy Manager ein. Dazu diesen im Browser starten. Dann in der „NginX Proxy Manager“ Weboberfläche:
- „Host“
- „Proxy Host“
- „Add Proxy Host“
- Details:
- Domain Names: nextcloud.clusterfarm.duckdns.org
- (Eigene Domain verwenden)
- Scheme: https
- (447 ist ein HTTPS-Port)
- Forward Hostname / IP: die Server-IP, worauf sich Nextcloud befindet
- (in diesem Beispiel der erste Manager (node1))
- Forward Port: 447
- (447 ist mein Nextcloud – Port bzw. in dieser Konfiguration der Webserver-Port)
- Cache Assets: On
- Websockets Support: On
- Block Common Exploits: On
- Access List: nichts ändern
- Domain Names: nextcloud.clusterfarm.duckdns.org
- SSL:
- SSL Certificate: „Request a new SSL Certificate“
- Force SSL: On
- Http/2 Support: On
- HSTS Enabled: ON
- Email Address for Lets‘ Encrypt: Eine gültige Email-Adresse
- I Agree to the LE Terms of Service: On
- Advanced:
- Details:
- „Add Proxy Host“
- „Proxy Host“
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
location ^~ /.well-known { return 301 /index.php$uri; }
try_files $uri $uri/ =404;
}
Save
Nach ca. 10-20 Sekunden wurde das Zertifikat erstellt und der Dienst Nextcloud ist unter der angewendeten Domain, gesichert, von Außen erreichbar. Nextcloud kann nun unter der erstellten Domain geöffnet werden. Und siehe da – Eine Fehlermeldung (Zugriff über eine nicht vertrauenswürdige Domain). Doch diese ist schnell behoben:
sudo nano /mnt/data/linuxserver_nextcloud/www/nextcloud/config/config.php
Folgendes am Ende, aber vor ); einfügen:
Die Ip-Adresse unter Trusted Proxies ist die IP-Adresse des „Nginx Proxy Manager“.
'overwriteprotocol' => 'https',
'trusted_proxies' =>
array (
0 => '192.168.1.131',
),
Die Zeile:
'overwrite.cli.url' => 'https://192.168.1.131:447',
ändern in:
'overwrite.cli.url' => 'https://nextcloud.clusterfarm.duckdns.org',
Neuerdings muss ich auch noch die Trusted Domains anpassen. Bei mir müssen beide Sachen drin stehen. Die URL und die Domain:
array (
0 => '192.168.1.131:447',
1 => 'nextcloud.clusterfarm.duckdns.org',
),
Strg-x, y, Enter
Nun kann Nextcloud über den soeben eingerichteten Domainnamen gestartet werden:
https://nextcloud.clusterfarm.duckdns.org (dieser Link wurde natürlich deaktiviert)
Und so ganz nebenbei wurden alle Sicherheits- & Einrichtungswarnungen behoben.

Quelle(n):
https://hub.docker.com/r/linuxserver/nextcloud