_Swarm Linuxserver/Nextcloud

Änderungsstand: 2021-08-30

Sinnvoll, wenn man Nextcloud nur intern betreibt, da eine selbstsignierte SSL-Zertifizierung mitgeliefert wird. Eine einfache Nextcloud-Installation, 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.

Nextcloud (linuxserver/nextcloud) als Stack im Swarm installieren:

Nicht vergessen, die Pfade, am ersten Manager, anzulegen!

sudo mkdir -p /mnt/data/linuxserver_nextcloud_db && sudo mkdir -p /mnt/data/linuxserver_nextcloud && sudo mkdir -p /mnt/data/linuxserver_nextcloud_data

Im Portainer:

  • Stacks
    • + Add stack
      • Name: lsnc
      • Web editor: Folgenden Code eingeben:
version: '3.2'

services:
  lsnc-db:
    image: ghcr.io/linuxserver/mariadb
    volumes:
      - /mnt/data/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 == worker]
      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/data/linuxserver_nextcloud:/config
      - /mnt/data/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
        • 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:
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

Erstelle eine Website wie diese mit WordPress.com
Jetzt starten