Nextcloud Docker - vielfältige Probleme

Thunfischsalat

Lieutenant
Registriert
März 2012
Beiträge
791
Moin,
ich versuche schon seit längerer Zeit NextCloud mit MariaDB auf meinem OMV NAS als Container zum laufen zu bekommen.
Dabei laufe ich in so viele verschiedene Probleme, dass ich langsam verzweifle.
Gerade für mich als Linux Neuling wirkt es fast schon, als wäre Nextcloud alles andere als zuverlässig, gar schon filigran zerbrechlich.
Die eine Problemlösung führt selber zum nächsten Problem.

TL;DR: Kennt wer einen aktuellen Guide für Nextcloud der auch mögliche Fehlerquellen bedacht und Hilfestellungen für Anfänger zur Verfügung stellt? Oder könnten SQLite oder Postgresql die Lösung für alle meine Probleme sein?
Meine Anforderungen sind:
Dateien auf meinem Server mittels Web-Interrface zugreifen (anstatt Samba)
Auf die Dateien mit der Android-App zugreifen
Diese Dateien auch auf einer HDD im PC zu synchronisieren
Mithilfe CalDAV meinen eigenen Kalender zu führen
Mittels NextCloud Notes Notizen lokal speichern
und auch meine Telefonkontakte mit CardDAV synchronisieren


Das folgende ist mehr ein Leidensweg der letzten drei Wochen in denen ich dutzende Male den Container neu aufgesetzt habe, um meine Fehler zu reproduzieren oder die Fehlerquelle herauszufinden. Die Lösung zu einem Problem führt meist zu einem nächsten Problem. Dabei habe ich die Datenbank nicht mal genutzt. Dies muss nicht gelesen werden, aber ich muss es mal loswerden.

Erstes Problem: MariaDB (welches ja empfohlen wird) hat in der aktuellen Version 10.6 einen bekannten Bug / Inkompatibilität, sodass Nextcloud nicht zum laufen gebracht werden kann. (Link Github)

Gut deaktivieren wir mithilfe
Code:
--innodb-read-only-compressed=OFF
in der Konsole die betroffene Einstellung.
Um zu wissen was ich machen muss, muss ich wiederum dutzende Guides lesen.
Die meisten Guides beziehen sich auf eigene Nextcloud Instanzen und nicht auf Container.
Beim ausprobieren der ganzen Befehle habe ich nicht das Gefühl, selber etwas zu lernen, sondern nur im blinden Gehorsam irgendwas auszuführen.
Letztendlich habe ich aber diesen Guide hier gefunden!
Ok, die erste Einrichtung klappt.

Zweites Problem: Nach einiger Zeit, vielleicht auch einem Neustart, komme beim Aufrufen des Web-Interface folgende Meldung:
Internal Server Error The server was unable to complete your request.
Das ganze im bekannten Nextcloud-Design und schön formatiert mit Grafiken.
Ich konnte das Problem in zwei Tagen nicht ausfindig machen oder beheben.

Ein willkürlicher Versuch von 10.5 MariaDB, aus einem der Lösungsvorschläge zu einem Thread für das erste Problem, brachte jedoch Abhilfe. Was es war? Keine Ahnung.
So konnte ich dann endlich Nextcloud einrichten und auch nach ein paar Stunden noch aufrufen.

Drittes Problem: Eine Woche später, ohne dass der Server lief, begrüßt mich der Container im Web-Interface erneut mit der Meldung:
The server encountered an internal error and was unable to complete your request.
Nur diesmal eine weiße Seite mit schwarzer Schrift.

"Gut", denke ich mir, "ich versuche es nicht weiter mit MariaDB und schaue was mein erster Versuch mit Nextcloud in Kombination mit SQLite macht. Wenn der auf dem AM1 Mainboard läuft, dann liegt es an der Datenbank.
(Auf dem AM1-System hatte ich mich mit OMV und Portainer das erste Mal ausprobiert)

Viertes Problem: Beim öffnen von Nextcloud begrüßt mich der Container mit dem Wartungsmodus und der geht auch zwei Stunden später nicht weg.
Wie geht der aus? Natürlich nur in der Konsole. Also wieder Guides wälzen. Tausend Variationen mit den Befehlen. Programme die ich nicht kenne.
Alleine in dieser Hilfestellung auf reddit circa sieben verschiedene Befehle. Der Befehl von krair3 hat mir dann letztendlich geholfen.
Der Wartungsmodus ist weg, aber ich kann immer noch nicht auf Nextcloud zugreifen, denn...

Fünftes Problem: ... er will ein Update auf 23.0 durchführen.
Ich dachte man führt Updates durch indem man sich aktuelle Images runterlädt und das alte damit ersetzt?
Gut klicken wir auf Update: Error. Updates between multiple major versions are unsupported.
Anscheinend war der Container 22.1 zu alt zum Updaten.
Wieder Guides lesen. Aha ich muss auf den aktuellsten 22.X Zweig und kann dann Updaten?
Dann ziehe ich mir mal das 22.2.3.

Sechtes Problem: Container will nicht starten mit der Fehlermeldung:
Can’t start Nextcloud because the version of the data is higher than the docker image version and downgrading is not supported.
Anscheinend ist mein data schon auf Version 23?! Ich blicke nicht mehr durch.
22.X kann ich nicht starte und 23.X erlaubt mir nicht zu updaten.

Was mache ich bitteschön falsch?!
 
Schau mal bei Linuxserver.io

Ich nutze für Nextcloud ein Unraid mit MariaDB und nginx als Proxy. Geht fix einzurichten und läuft ohne wirkliche Probleme.
 
Wieso versteift sich jeder auf MariaDB?
https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html schrieb:
PlatformOptions
Operating System
  • Ubuntu 20.04 LTS (recommended)
  • Red Hat Enterprise Linux 8 (recommended)
  • Debian 10 (Buster)
  • SUSE Linux Enterprise Server 15
  • openSUSE Leap 42.1+
  • CentOS Stream
Database
  • MySQL 8.0+ or MariaDB 10.2/10.3/10.4/10.5 (recommended)
  • Oracle Database 11g (only as part of an enterprise subscription)
  • PostgreSQL 9.6/10/11/12/13
  • SQLite (only recommended for testing and minimal-instances)
Webserver
  • Apache 2.4 with mod_php or php-fpm (recommended)
  • nginx with php-fpm
PHP Runtime
  • 7.3
  • 7.4
  • 8.0 (recommended)
10.6 steht nicht explizit in der Supportliste. Erstmal da anfangen. Bei mir läuft bspw. noch MySQL 5.7.
 
Hast du die Konfiguration nach der von dir angegeben Seite mit Portainer gemacht?

Also, die Installation mit Docker ist nicht verkehrt, ueberfordert aber auch schonmal jemanden der sich mit Linux und der Komandozeile auskennt. Es gibt viele konfigurations Moeglichkeiten und Anweisungen die deinem Bedarf evtl. garnicht entsprechen. Dazu kommt, wenn man es nicht versteht kann man es meiner Erfahrung nach auch nicht warten.

Mit Docker musst du prinzipiell:

Docker & Docker compose installieren

Deine Docker Compose file mit deiner Auswahl an:

Nextcloud Version
Datenbank (mariadb oder postgre ist empfehlenswert)
Webserver (caddy oder nginx)
Redis (falls du zeitgleich mit mehren geraeten zugreifen willst)

... Konfigurieren.

Fuer die Datenbankonfiguration kann man Namen, Passwoerter & dergleichen direkt in die Docker Compose file eintragen oder per environment file angeben.

Updaten musst du dann auch regelmaessig manuell um moegliche auftretende Fehlermeldungen dabei zu betrachten.


Oder du installierst Nextcloud per snap. Das ist vorkonfiguriert und geht wesentlich einfacher.
 
Zuletzt bearbeitet:
@Tacheles Ja, ich habe es sogar mehrfach. Trotzdem schießt sich das Ding immer wieder ab....

@kim88 Öh kann ich mit OMV überhaupt Snaps benutzten?
Bin wirklich neu in Linux und habe noch nicht mal auf meinem Linux Mint Snaps oder Flatpack ausprobiert.
Yuuri schrieb:
10.6 steht nicht explizit in der Supportliste.
Aber 10.5 schon. Trotzdem Schießt sich das System irgendwann ab. Egal ob mit 10.5 oder 10.6 inkl. dem Fix.
Nordwind2000 schrieb:
Schau mal bei Linuxserver.io
@Nordwind2000 Hast recht könnte mit einem anderen Image besserfunktionieren. Habe nicht daran gedacht, da Nextcloud direkt das Image bereitsstellt.
Morgen setzte ich mich ran
 
Ah ja, OMV hab ich ueberlesen. Snap soll aber auch mit omv gehen.

Vielleicht hilft die die Anleitung:

https://dbtechreviews.com/2020/03/h...n-openmedivault-5-with-remote-access-and-ssl/

Die Anleitung bezieht sich allerdings darauf die Nextcloud auch aus dem Internet erreichbar zu machen mit einem zusaetzlichen letsencrypt & duckdns Container. Fuer die Erreichbarkeit nur ausm eigenen Netzwerk sieht die Konfiguration wieder anders aus.
 
  • Gefällt mir
Reaktionen: Thunfischsalat
Ja darauf will ich mit Verweis auf meine Unkenntnis verzichten.
Mir reicht der lokale Zugriff.
 
@Tacheles Den Port 80 habe ich mithilfe von Portainer schon auf 49153 gelegt.
80 bleibt für OMV. ^^
443 nutzt mein Container gar nicht :confused_alt:

Ja Snaps und ähnliches ist noch eine ganz neue Welt.
Ich muss mal schauen wie ich aktuelle Software für eine Linux Distro nutzte.
Habe aktuel Mint ausprobiert, aber störe mich ein bisschen am "App-Store".

Mein Browser Vivaldi ist nicht erhältlich und ich weiß noch nicht wie ich am elegantesten weitere Quellen mit Updates hinzufüge, ohne dass ich bei jeder Distro jedes einzelne Programm erneut hinzufüge.
 
Thunfischsalat schrieb:
443 nutzt mein Container gar nicht
Docker ist zum erstellen und verwalten von containern. Damit du nextcloud betreiben kannst brauchst du verschieden container die man in der docker compose file so konfiguriert das sie zusammen arbeiten. Willst du ssl verschluesselung wo die webseite auf port 443 abrufbereit ist, benoetigst du einen zusaetzlichen container (letsencrypt) welches selbstsignierte zertifikate an den webserver ausliefert. Das kommt nicht automatisch mit docker nextcloud. Beim snap packet ist alles drin, nextcloud, database, ssl...

Vivaldi auf linux mint ist easy, google is your friend.
https://itsfoss.com/install-vivaldi-ubuntu-linux/
 
Ich betreibe Nextcloud mit MariaDB und Redis mit den offiziellen Containern auf einem x86_64 Host und das schon seit mehreren Monaten.

Alles verbunden via Docker Compose bzw. als Portainer-Stack (was das gleiche ist).

Es funktioniert also, ich stelle Dir/hier gerne das Compose-File zur Verfügung
 
Okay, gern. Erstmal die vollständige Datei (docker-compose.yml), dann die Erklärungen.

Code:
version: '3'

services:
  nextcloud-db:
    command: 
      - --transaction-isolation=READ-COMMITTED 
      - --log-bin=ROW
      - --innodb_read_only_compressed=OFF
    container_name: nextcloud-db
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_INITDB_SKIP_TZINFO=1
    healthcheck:
      test: "/usr/bin/mysql --user=root --password=${MYSQL_ROOT_PASSWORD} --execute \"SHOW DATABASES;\""
      interval: 45s
      timeout: 3s
      retries: 5      
    image: mariadb
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /opt/nextcloud-db/data:/var/lib/mysql

  nextcloud-redis:
    image: redis:alpine
    container_name: nextcloud-redis
    hostname: nextcloud-redis
    restart: unless-stopped
    command: 
      - redis-server 
      - --requirepass ${REDIS_PASSWORD}

  nextcloud-app:
    image: nextcloud
    container_name: nextcloud-app
    depends_on:
      - nextcloud-db
      - nextcloud-redis
    environment:
      - MAIL_DOMAIN=example.com
      - MAIL_FROM_ADDRESS=${SMTP_FROM_ADDRESS}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_HOST=nextcloud-db
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_USER=nextcloud
      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.example.com
#      - OVERWRITEHOST=cloud.example.com
#      - OVERWRITEPROTOCOL=https
      - PHP_UPLOAD_LIMIT=4G
      - PHP_MEMORY_LIMIT=1G
      - REDIS_HOST=nextcloud-redis
      - REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
      - SMTP_HOST=mail.example.com
      - SMTP_NAME=${SMTP_NAME}
      - SMTP_PASSWORD=${SMTP_PASSWORD}
      - SMTP_PORT=587
      - SMTP_SECURE=tls
      - TRUSTED_PROXIES=172.20.0.3/16
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/cron.php"]
      interval: 30s
      timeout: 15s
      retries: 2
    ports:
      - "8500:80"
    restart: unless-stopped
    volumes:
      - /opt/nextcloud-app/app:/var/www/html
      - /opt/nextcloud-app/data:/var/www/html/data

Im Detail:

Code:
version: '3'
services:

Der Rumpf des Stacks, Compose-Version und Services-Element.

Code:
  nextcloud-db:
    command:
      - --transaction-isolation=READ-COMMITTED
      - --log-bin=ROW
      - --innodb_read_only_compressed=OFF

Der "nextcloud-db" Service, welcher die Datenbank zur Verfügung steht. Außerdem die Start-Parameter für die MariaDB-Instanz im Container, gemäß den Empfehlungen von Nextcloud.

Code:
    container_name: nextcloud-db
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_INITDB_SKIP_TZINFO=1

Container-Name (für die Übersicht mit docker ps) und die Umgebungsvariablen. Die Werte ${...} können direkt in der Datei durch echte Werte ersetzt werden oder man setzt entsprechende Umgebungsvariablen für die Ausführung von docker-compose. In Portainer kann man diese Variablen auch über das UI setzen.

Code:
    healthcheck:
      test: "/usr/bin/mysql --user=root --password=${MYSQL_ROOT_PASSWORD} --execute \"SHOW DATABASES;\""
      interval: 45s
      timeout: 3s
      retries: 5

Der "Health Check" des MariaDB Containers. Das Kommando wird regelmässig im MariaDB Container ausgeführt. Schlägt es mehr als 5x fehlt, wird der Container neu gestartet.

Code:
    image: mariadb
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /opt/nextcloud-db/data:/var/lib/mysql

Das offizielle MariaDB Container Image. Außerdem werden die Restart-Strategie definiert und Dateipfade für die persistenten Daten festgelegt. Da die Docker-Container (bei mir) als root laufen, wird das Verzeichnis /opt/nextcloud-db/data auf dem Host automatisch angelegt.

Code:
  nextcloud-redis:
    image: redis:alpine
    container_name: nextcloud-redis
    hostname: nextcloud-redis
    restart: unless-stopped
    command:
      - redis-server
      - --requirepass ${REDIS_PASSWORD}

Der "nextcloud-redis" Service. Hier kommt das offizielle redis-Image mit Alpine-Linux Unterbau zum Einsatz, weil es sehr klein ist und wenig Speicher braucht. Redis ist ein In-Memory Cache, darum braucht es hier keine "volumes".

Code:
  nextcloud-app:
    image: nextcloud
    container_name: nextcloud-app
    depends_on:
      - nextcloud-db
      - nextcloud-redis

Der "nextcloud-app" Service, die eigentliche Nextcloud-Anwendung. Wieder offizielles Image. Durch depends_on wird ausgedrückt, dass der Container erst starten kann, wenn die Services -db und -redis gestartet wurden. Das bedeutet nicht, dass MariaDB oder Redis schon gestartet sind, aber die entsprechenden Container wurden erfolgreich gestartet.

Code:
    environment:
      - MAIL_DOMAIN=example.com
      - MAIL_FROM_ADDRESS=${SMTP_FROM_ADDRESS}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_HOST=nextcloud-db
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_USER=nextcloud
      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.example.com
#      - OVERWRITEHOST=cloud.example.com
#      - OVERWRITEPROTOCOL=https
      - PHP_UPLOAD_LIMIT=4G
      - PHP_MEMORY_LIMIT=1G
      - REDIS_HOST=nextcloud-redis
      - REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
      - SMTP_HOST=mail.example.com
      - SMTP_NAME=${SMTP_NAME}
      - SMTP_PASSWORD=${SMTP_PASSWORD}
      - SMTP_PORT=587
      - SMTP_SECURE=tls
      - TRUSTED_PROXIES=172.20.0.3/16

Ein ganzer Schwung an Umgebungsvariablen zur Konfiguration von Nextcloud. Die so übergebenen Werte führen zu einer entsprechenden config.php, die später auf dem Host unter /opt/nextcloud-app/app/config/ erzeugt wird.

Welche Umgebungsvariablen erlaubt sind und was sie bewirken, ist hier beschrieben.

Wenn man das Kommentarzeichen vor OVERWRITEHOST und OVERWRITEPROTOCOL entfernt, wird Nextcloud immer die daraus resultierende URL verwenden (hier also https://cloud.example.com).

Code:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/cron.php"]
      interval: 30s
      timeout: 15s
      retries: 2

Das ist ganz pfiffig. Der Health Check des Containers ruft alle 30s die Cron-URL von Nextcloud auf. Schlägt zwei Fliegen mit einer Klappe: 1. gucken ob der Container noch läuft und 2. regelmässige Aufgaben von Nextcloud erledigen lassen.

Code:
    ports:
      - "8500:80"

Als einziger Service im Stack wird Nextcloud an das Host-Netzwerk auf Port 8500 gebunden. MariaDB und Redis sind nur durch andere Services im Stack erreichbar, aber nicht "öffentlich".

Code:
    restart: unless-stopped
    volumes:
      - /opt/nextcloud-app/app:/var/www/html
      - /opt/nextcloud-app/data:/var/www/html/data

Restart-Strategie und Volumes für persistente Daten. Die Nextcloud-(Web-)Anwendung wird auf dem Host in /opt/nextcloud-app/app/ installiert, die durch Nextcloud verwalteten Daten kommen unter /opt/nextcloud-app/data zu liegen.

Und das war es auch schon, so läuft es im Wesentlichen bei mir.

Tipp: Updates der Nextcloud-Anwendung über den integrierten Update werden übrigens nicht ausgeführt, das scheint im Docker-Image abgeregelt zu sein. Einfach noch einen "Watchtower"-Container dazupacken, er sucht regelmässig nach neuen Image-Versionen für laufende Container und aktualisiert automatisch.

Code:
  watchtower:
    container_name: watchtower
    image: containrrr/watchtower
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro

Viel Erfolg!
 
  • Gefällt mir
Reaktionen: e_Lap und Tacheles
Ich hab mir deine Compose-Konfiguration mal abgespeichert um die, bei genügend Zeit, als Vorlage zu nutzen. Vielleicht willst du deinen Post auch nochmal in einem eigenen Thread hier im Forum verewigen. Aktuelle & gute Konfigurationen zu finden ist garnicht so einfach, zumal du dir die Mühe gemacht hast alles auch zu erklären.

Ein paar Fragen die ich mir gerade Stelle...

1. Gibt es Vor.-/Nachteile Docker per Root oder User Account zu betreiben?
2. Soweit ich das nachvollziehen kann betreibst du Nextcloud so ohne SSL, oder?
3. Was macht der Trusted Proxy in den Umgebungsvariablen?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: e_Lap
Tacheles schrieb:
1. Gibt es Vor.-/Nachteile Docker per Root oder User Account zu betreiben?
Ja, da die Prozesse ja mit demselben Kernel laufen, kann man die Container hier härten. Ist dann schon mal eine Hürde mehr, wenn ein Eindringling in einem Container aus dem Prozess ausbrechen kann. Wenn der Prozess dann mit einer eigenen uid/gid läuft, die sonst nix darf, ist das noch ein Stückchen sicherer.
Tacheles schrieb:
2. Soweit ich das nachvollziehen kann betreibst du Nextcloud so ohne SSL, oder?
Hier kann man dann einen nginx-reverse-proxy- + acme-Container davorschalten. (Ich hab hier z.B. nginx:alpine und neilpang/acme.sh als Container im Einsatz).
Tacheles schrieb:
3. Was macht der Trusted Proxy in den Umgebungsvariablen?
Wäre dann dann genau der Reverse Proxy aus 2), dem der Zugriff gewährt wird.
 
Kann man dem mit Sicherheit auch beibringen. Spätestens bei zwei Diensten, die auf einer externen IP lauschen sollen und per SNI oder unterschiedlichen Pfaden unterschieden werden, brauchst du sowieso einen reverse proxy.

Mit nem Reverse Proxy hab ich meine ganzen SSL-Zertifikate an einer Stelle und muss hier auch nicht aus dem acme alle möglichen Container bedienen.
 
Zuletzt bearbeitet:
Tacheles schrieb:
2. Soweit ich das nachvollziehen kann betreibst du Nextcloud so ohne SSL, oder?

Nein, meine vollständige Konfiguration sieht anders aus, da sind die Container an ein internes Proxy-Netzwerk gebunden und Traefik kommt als Reverse Proxy zum Einsatz. Dort wird TLS terminiert und Traefik kümmert sich auch um das Besorgen der Letsencrypt Zertifikate.
Tacheles schrieb:
3. Was macht der Trusted Proxy in den Umgebungsvariablen?

Die Verbindung zu Nextcloud gehen ja über das Docker-Netzwerk. Eventuelle Warnungen werden damit verhindert.
 
  • Gefällt mir
Reaktionen: e_Lap
Zurück
Oben