Nextcloud auf dem eigenen Server installieren

Veröffentlicht am 13 Min. Lesezeit

Vom leeren Server bis zur Übersichtsseite ohne Warnungen: Webserver, PHP-Module, Datenbank, Rechte am Datenverzeichnis, trusted_domains, Upload-Grenzen und Hintergrundaufgaben per Cron.

Nextcloud ist schnell entpackt. Der Teil, der Zeit kostet, kommt danach: die Übersichtsseite unter Verwaltungseinstellungen zeigt bei einer frischen Installation praktisch immer eine Liste gelber und roter Hinweise, Uploads brechen bei 2 MB ab, und der Aufruf über die IP-Adresse endet mit „You are accessing the site from an untrusted domain.". Dieser Beitrag geht den kompletten Weg durch und bleibt genau an den Stellen stehen, an denen die meisten Anleitungen aufhören.

Vorher entscheiden: PHP-Version, Datenbank, Speicherort

Nextcloud hängt stärker von der PHP-Version ab als die meiste andere Serversoftware. Die aktuellen Serie 33 und 34 setzen mindestens PHP 8.2 voraus, Serie 32 läuft noch ab PHP 8.1. Damit entscheidet die Distribution, ob Sie mit den Bordmitteln auskommen:

SystemPHP aus der DistributionDatenbank aus der DistributionBewertung
Debian 13 (trixie)8.4MariaDB 11.8passt ohne Fremdquelle
Debian 12 (bookworm)8.2MariaDB 10.11passt, aber am unteren Rand
Ubuntu 24.04 LTS8.3MariaDB 10.11, MySQL 8.0passt ohne Fremdquelle
Ubuntu 22.04 LTS8.1MariaDB 10.6, MySQL 8.0zu alt für Nextcloud 33 und 34
Debian 11 (bullseye)7.4MariaDB 10.5scheidet aus

Debian 11 ist der härteste Fall und fällt trotzdem gern erst spät auf, weil die Paketinstallation fehlerfrei durchläuft. Das Metapaket php zieht dort PHP 7.4 nach, und die aktuelle Nextcloud-Version bricht damit beim ersten Aufruf im Browser mit HTTP 500 und der Meldung „This version of Nextcloud requires at least PHP 8.2" ab. Debian 11 ist ohnehin aus dem regulären Support gelaufen, für eine neue Installation ist es die falsche Grundlage. Wenn es zwingend sein muss, binden Sie vorher das Sury-Repository ein und installieren ausdrücklich versionierte Pakete, also php8.2-fpm, php8.2-cli, php8.2-mysql und so weiter, statt der unversionierten Metapakete.

Auf Ubuntu 22.04 laufen Sie ebenso unweigerlich in eine Wand, sobald Sie die aktuelle Nextcloud-Version einspielen. Entweder Sie bleiben bewusst auf Serie 32, oder Sie holen PHP aus dem bekannten PPA:

sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y php8.3-fpm php8.3-cli php8.3-mysql

Zwei weitere Punkte, die man am Anfang festlegt und später nur mühsam ändert: Debian liefert grundsätzlich kein Paket mysql-server, dort ist MariaDB gesetzt. Und das Datenverzeichnis gehört nicht unter /var/www/nextcloud/data, sondern außerhalb des Webserver-Wurzelverzeichnisses, zum Beispiel nach /var/nextcloud-data. Der Standardpfad ist nur deshalb gefährlich, weil eine kaputte Webserver-Konfiguration sonst sämtliche Nutzerdateien ausliefert. Nextcloud warnt in diesem Fall mit „Your data directory and files are probably accessible from the internet", aber eben erst, nachdem der Fehler schon existiert.

Webserver, PHP und Datenbank einrichten

Wir nehmen nginx mit PHP-FPM. Wenn Sie lieber Apache mit mod_php verwenden, ist der Weg über Apache, PHP und MySQL auf Debian beschrieben, die PHP-Themen weiter unten gelten unverändert. Eine Grundinstallation von nginx finden Sie unter nginx installieren.

sudo apt-get update
sudo apt-get install -y nginx mariadb-server
sudo apt-get install -y php-fpm php-cli php-mysql php-gd php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-zip php-imagick php-apcu

Diese Liste ist bewusst länger als das Minimum. bcmath und gmp braucht Nextcloud für die passwortlose Anmeldung, intl für die korrekte Sortierung von Umlauten und Sonderzeichen, imagick für Vorschaubilder, apcu für den lokalen Zwischenspeicher. Fehlt eines der Pflichtmodule, kommen Sie im Einrichtungsassistenten gar nicht erst weiter, die Seite listet dann die fehlenden Module namentlich auf.

Prüfen Sie danach, was tatsächlich geladen ist:

php -v
php -m

Der zweite häufige Stolperstein: Es gibt zwei getrennte PHP-Konfigurationen, eine für die Kommandozeile und eine für FPM. php --ini zeigt Ihnen die der Kommandozeile, die des Webservers liegt unter /etc/php/<version>/fpm/php.ini. Änderungen an der falschen Datei wirken nicht, das kostet erfahrungsgemäß die meiste Zeit.

Jetzt die Datenbank. Sichern Sie MariaDB zuerst ab, siehe MariaDB und MySQL absichern, dann:

sudo mariadb -e "CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
sudo mariadb -e "CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'HierEinLangesPasswort';"
sudo mariadb -e "GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';"
sudo mariadb -e "FLUSH PRIVILEGES;"

Das utf8mb4 im ersten Befehl ist kein Detail. Legen Sie die Datenbank mit utf8 an, meldet Nextcloud später „MySQL is used as database but does not support 4-byte characters", und die Umstellung im laufenden Betrieb ist deutlich unangenehmer als das richtige CREATE DATABASE am Anfang. Scheitert die Anmeldung des Datenbankbenutzers, hilft Access denied for user beheben.

Entpacken und Rechte setzen

sudo apt-get install -y wget unzip
wget https://download.nextcloud.com/server/releases/latest.zip
sudo unzip -q latest.zip -d /var/www
sudo mkdir -p /var/nextcloud-data
sudo chown -R www-data:www-data /var/www/nextcloud
sudo chown -R www-data:www-data /var/nextcloud-data
sudo chmod 750 /var/nextcloud-data

Die Rechte sind der Punkt, an dem am häufigsten geschludert wird. Drei Fehlerbilder und ihre Ursache:

  • „Cannot write into config directory": /var/www/nextcloud/config gehört nicht dem Webserver-Benutzer. Auf Debian und Ubuntu ist das www-data, auf AlmaLinux und Rocky dagegen apache oder nginx. Ein blind kopiertes chown www-data läuft auf der Red-Hat-Familie ins Leere.
  • „Can't create or write into the data directory": Der Pfad existiert nicht, ist kein absoluter Pfad, oder ein übergeordnetes Verzeichnis ist für www-data nicht betretbar.
  • „Your data directory is readable by other users": Rechte zu weit. chmod 750 auf das Datenverzeichnis genügt.

Widerstehen Sie der Versuchung, das Problem mit chmod -R 777 zu erschlagen. Nextcloud quittiert das mit genau der Warnung, die Sie loswerden wollten, und Sie haben nebenbei jede Datei für jeden lokalen Benutzer lesbar gemacht.

Die nginx-Konfiguration

Nextcloud braucht mehr als einen Standard-PHP-Block, unter anderem Umschreibungen für die Dienstsuche unter /.well-known/ und Sperren für interne Verzeichnisse. Das Folgende ist die gekürzte Fassung der offiziellen Vorlage und läuft so:

upstream php-handler {
    server unix:/run/php/php8.3-fpm.sock;
}

server {
    listen 80;
    server_name cloud.example.com;
    root /var/www/nextcloud;

    client_max_body_size 10G;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "noindex, nofollow" always;

    index index.php index.html /index.php$request_uri;

    location ^~ /.well-known {
        location = /.well-known/carddav { return 301 /remote.php/dav/; }
        location = /.well-known/caldav  { return 301 /remote.php/dav/; }
        location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
        return 301 /index.php$request_uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)              { return 404; }

    location ~ \.php(?:$|/) {
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+) /index.php$request_uri;
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_request_buffering off;
        fastcgi_max_temp_file_size 0;
    }

    location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|map|woff2)$ {
        try_files $uri /index.php$request_uri;
        expires 6M;
        access_log off;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}

Den Pfad zum FPM-Socket müssen Sie an Ihre PHP-Version anpassen. Er heißt unter Debian 13 php8.4-fpm.sock, unter Debian 12 php8.2-fpm.sock, unter Ubuntu 24.04 php8.3-fpm.sock und unter Ubuntu 22.04 php8.1-fpm.sock. Stimmt der Name nicht, bekommen Sie einen 502 Bad Gateway. Den tatsächlichen Namen zeigt:

systemctl enable --now php8.4-fpm
ls /run/php/

Die erste Zeile gehört dazu, denn die Socket-Datei entsteht erst beim Start des Dienstes. Vorher ist /run/php/ entweder leer oder existiert überhaupt nicht, und ls antwortet mit No such file or directory. Auf einem normalen Server startet das Paket den Dienst bei der Installation selbst, nach einem Neuaufsetzen oder in einem Container ist das aber nicht garantiert. Passen Sie die Versionsnummer im Dienstnamen an Ihre Installation an. Danach nginx -t und neu laden.

Einrichtung, HTTPS und trusted_domains

Sie können die Einrichtung im Browser durchklicken oder gleich auf der Kommandozeile erledigen. Die zweite Variante ist reproduzierbar und lässt sich in ein Skript schreiben:

cd /var/www/nextcloud
sudo -u www-data php occ maintenance:install --database "mysql" --database-name "nextcloud" --database-user "nextcloud" --database-pass "HierEinLangesPasswort" --admin-user "admin" --admin-pass "EinAnderesLangesPasswort" --data-dir "/var/nextcloud-data"

Zwei Fallen dabei. Erstens muss der Befehl aus dem Nextcloud-Verzeichnis heraus laufen, sonst bricht PHP mit einem Fatal Error ab. Zweitens darf occ nie als root laufen, sonst kommt „Console has to be executed with the user that owns the file config/config.php", und im schlimmsten Fall gehören danach frisch angelegte Dateien dem falschen Benutzer.

Jetzt HTTPS. Ohne Zertifikat weigern sich die Mobil-Apps und Nextcloud warnt in der Übersicht:

sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.example.com

Für mehrere Unterdomains lohnt ein Wildcard-Zertifikat. Ergänzen Sie danach im TLS-Server-Block den Header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;, sonst bleibt der Hinweis „The Strict-Transport-Security HTTP header is not configured to at least 15552000 seconds" stehen.

Der Klassiker zum Schluss: Sie rufen die Seite über einen anderen Namen auf als bei der Installation und sehen nur noch „You are accessing the site from an untrusted domain." Nextcloud akzeptiert ausschließlich Hostnamen, die in trusted_domains stehen. Hinzufügen ohne die Datei von Hand zu bearbeiten:

sudo -u www-data php occ config:system:set trusted_domains 1 --value=cloud.example.com
sudo -u www-data php occ config:system:get trusted_domains

Der Index zählt bei 0 los, und 0 ist meist schon belegt. Vergeben Sie denselben Index zweimal, überschreiben Sie den vorhandenen Eintrag und sperren sich unter Umständen selbst aus. Falls das passiert: config/config.php ist eine ganz normale PHP-Datei, der Eintrag lässt sich dort im Editor korrigieren. Setzen Sie zusätzlich overwrite.cli.url auf die endgültige HTTPS-Adresse, sonst erzeugen die Hintergrundaufgaben Links mit falschem Hostnamen.

Upload-Größe und Speichergrenze

Die Voreinstellungen von PHP sind für Nextcloud zu knapp. upload_max_filesize steht typischerweise auf 2M, memory_limit auf 128M. Nextcloud empfiehlt mindestens 512M Speicher und warnt sonst mit „The PHP memory limit is below the recommended value of 512MB".

Es gibt hier drei Stellen, und es reicht nicht, eine davon anzufassen:

  1. Die FPM-Konfiguration unter /etc/php/<version>/fpm/php.ini: memory_limit = 512M, upload_max_filesize = 10G, post_max_size = 10G, max_execution_time = 3600. Danach FPM neu starten, ein Neuladen von nginx genügt nicht.
  2. Die Datei .user.ini im Nextcloud-Verzeichnis: Nextcloud liefert eigene Werte mit, und weil .user.ini verzeichnisbezogen gilt, gewinnt sie gegen die globale php.ini. Genau daran scheitert die Fehlersuche regelmäßig. Passen Sie die Werte dort ebenfalls an. PHP zwischenspeichert diese Datei, standardmäßig fünf Minuten, Ihre Änderung wirkt also verzögert.
  3. Die nginx-Direktive client_max_body_size: Fehlt sie oder ist sie zu klein, bricht der Upload mit „413 Request Entity Too Large" ab, bevor PHP überhaupt gefragt wird.

Zum Prüfen, was am Ende ankommt, hilft die Seite Verwaltungseinstellungen, dort steht die tatsächlich wirksame Obergrenze. Auf der Kommandozeile:

grep -E '^(memory_limit|upload_max_filesize|post_max_size)' /etc/php/8.4/fpm/php.ini

Fragen Sie ausdrücklich die FPM-Datei ab und nicht die Kommandozeile. Ein php -r "echo ini_get('memory_limit');" liest die CLI-SAPI, und die meldet auf allen geprüften Distributionen -1, also unbegrenzt. Wer sich darauf verlässt, hält den Wert für ausreichend und läuft später trotzdem in Speicherfehler, weil in der FPM-Datei nach wie vor memory_limit = 128M steht. Was im Browser wirklich ankommt, zeigt php-fpm8.4 -i oder eine kurzzeitig abgelegte info.php mit phpinfo(), die Sie danach sofort wieder löschen.

Wenn beim Hochladen großer Dateien der Prozess vom Kernel beendet wird, fehlt schlicht Arbeitsspeicher. Dann hilft Swap einrichten als Notnagel, besser ist mehr RAM.

Hintergrundaufgaben auf Cron umstellen

Nach der Installation läuft Nextcloud im AJAX-Modus: Hintergrundaufgaben werden nur ausgeführt, wenn gerade jemand die Oberfläche geöffnet hat. Das ist der Grund, warum Volltextsuche, Aufräumarbeiten und Benachrichtigungen auf wenig genutzten Instanzen scheinbar gar nicht passieren. Stellen Sie auf echtes Cron um, Nextcloud erwartet einen Lauf alle fünf Minuten. Grundlagen dazu stehen in Cronjob unter Linux einrichten.

sudo crontab -u www-data -e

Dort eintragen:

*/5 * * * * php -f /var/www/nextcloud/cron.php

Danach Nextcloud den Moduswechsel mitteilen:

cd /var/www/nextcloud
sudo -u www-data php occ background:cron

Wer lieber ohne Cron-Daemon arbeitet, nimmt einen systemd-Dienst mit Timer. Die Unit nextcloudcron.service ruft /usr/bin/php -f /var/www/nextcloud/cron.php als Benutzer www-data auf, der zugehörige Timer setzt OnBootSec=5min und OnUnitActiveSec=5min.

Bleibt die Warnung „Last background job execution ran X hours ago. Something seems wrong" trotzdem stehen, prüfen Sie in dieser Reihenfolge: Läuft der Job als dem richtigen Benutzer? Existiert der Pfad wirklich? Und ganz wichtig: Ist cron.php in der PHP-Konfiguration der Kommandozeile überhaupt lauffähig, oder fehlt dort ein Modul, das nur für FPM installiert wurde? Der ehrlichste Test ist der Aufruf von Hand, dabei sehen Sie jede Fehlermeldung im Klartext:

sudo -u www-data php -f /var/www/nextcloud/cron.php

Die Warnungen in der Übersicht abarbeiten

Die Liste unter Verwaltungseinstellungen und Übersicht ist keine Zierde, jede Zeile hat einen konkreten Grund. Die häufigsten und ihre Behebung:

  • „No memory cache has been configured": APCu ist installiert, aber nicht eingetragen. occ config:system:set memcache.local --value='\OC\Memcache\APCu'. Damit auch occ und die Cron-Läufe davon profitieren, setzen Sie zusätzlich apc.enable_cli=1 in /etc/php/<version>/mods-available/apcu.ini.
  • „Transactional file locking is disabled": Redis installieren (apt-get install -y redis-server php-redis) und memcache.locking auf \OC\Memcache\Redis setzen. Auf Einzelplatz-Instanzen verzichtbar, sobald mehrere Nutzer gleichzeitig synchronisieren nicht mehr.
  • „Your web server is not properly set up to resolve /.well-known/caldav": Die Umschreibungen im location ^~ /.well-known-Block fehlen. Testen lässt sich das direkt mit curl -I https://cloud.example.com/.well-known/caldav, erwartet wird ein 301 auf /remote.php/dav/.
  • „Your installation has no default phone region set": occ config:system:set default_phone_region --value="AT", für Deutschland DE. Der Wert ist ein Ländercode nach ISO 3166-1.
  • „Server has no maintenance window start time configured": occ config:system:set maintenance_window_start --type=integer --value=1. Der Wert ist die Startstunde in UTC, teure Tagesjobs laufen dann nachts statt mitten im Betrieb.
  • „The database is missing some indexes": occ db:add-missing-indices, dazu passend occ db:add-missing-columns und occ db:add-missing-primary-keys. Diese Befehle sind auf großen Instanzen langsam, aber ungefährlich.
  • „PHP does not seem to be setup properly to query system environment variables": In der FPM-Pool-Datei /etc/php/<version>/fpm/pool.d/www.conf die Zeile env[PATH] = /usr/local/bin:/usr/bin:/bin einkommentieren und FPM neu starten.
  • „Module php-imagick in this instance has no SVG support": Das ist kein Fehler von Nextcloud, sondern eine fehlende Delegate-Bibliothek in ImageMagick. Wenn Sie keine SVG-Vorschauen brauchen, können Sie den Hinweis stehen lassen.

Woran Sie erkennen, dass es wirklich läuft

Vier Prüfungen, die zusammen genommen aussagekräftig sind:

cd /var/www/nextcloud
sudo -u www-data php occ status
sudo -u www-data php occ check
sudo -u www-data php occ config:app:get core lastcron

occ status muss installed: true und die erwartete Version melden, occ check darf keine Ausgabe erzeugen. Der dritte Befehl gibt einen Unix-Zeitstempel zurück. Rechnen Sie ihn um, er darf nicht älter als fünf Minuten sein, dann arbeitet Ihr Cron wirklich.

Von außen:

curl -s https://cloud.example.com/status.php

Die Antwort ist ein JSON-Objekt mit "installed":true, "maintenance":false und der Versionsnummer. Kommt hier HTML zurück, greift eine Ihrer location-Regeln zu breit. Kommt eine Weiterleitung auf die Anmeldeseite, ist alles in Ordnung, aber Sie haben die falsche URL erwischt.

Zuletzt der Praxistest, den keine Statusseite ersetzt: eine Datei von mehreren Gigabyte über die Weboberfläche hochladen und danach mit dem Desktop-Client synchronisieren. Erst dabei zeigt sich, ob client_max_body_size, post_max_size, Zeitüberschreitungen und der freie Plattenplatz zusammenpassen. Wenn dabei plötzlich nichts mehr geht, lohnt ein Blick auf volle Festplatten, denn Nextcloud legt Vorschauen und Versionen an, die spürbar wachsen.

Wenn es schiefgeht

Nextcloud protokolliert nach /var/nextcloud-data/nextcloud.log, also in Ihr Datenverzeichnis, nicht nach /var/log. Das ist die erste Datei, in die Sie schauen sollten, nicht das nginx-Log. Für lesbare Ausgabe:

sudo -u www-data php occ log:watch

Hängt die Instanz nach einem abgebrochenen Update im Wartungsmodus fest, holt occ maintenance:mode --off sie zurück. Ist die Oberfläche gar nicht mehr erreichbar, setzen Sie 'maintenance' => false direkt in config/config.php.

Bevor Sie an Datenbank oder Konfiguration schrauben, sichern Sie beides. Ein Verzeichnis-Backup allein reicht nicht, Nextcloud ist ohne die passende Datenbank wertlos:

sudo -u www-data php occ maintenance:mode --on
sudo mariadb-dump --single-transaction nextcloud > /root/nextcloud-db.sql
sudo -u www-data php occ maintenance:mode --off

Und ein grundsätzlicher Rat: Bauen Sie den Server erst fertig, bevor Sie ihn öffentlich erreichbar machen. Eine Firewall, ein abgesicherter SSH-Zugang und die Punkte aus der Checkliste für neue Rootserver gehören vor die erste Anmeldung, nicht danach. Eine Nextcloud-Instanz mit Standardpasswort ist innerhalb von Stunden gefunden.

Häufige Fragen

Welche PHP-Version brauche ich für Nextcloud?
Nextcloud 33 und 34 setzen mindestens PHP 8.2 voraus und unterstützen bis 8.5, Nextcloud 32 läuft ab PHP 8.1. Debian 13 (PHP 8.4), Debian 12 (PHP 8.2) und Ubuntu 24.04 (PHP 8.3) passen ohne Fremdquelle. Ubuntu 22.04 liefert nur PHP 8.1 und ist damit für die aktuellen Serien zu alt, dort brauchen Sie das ondrej/php-PPA. Debian 11 liefert PHP 7.4: die Installation läuft dort ohne Fehler durch, Nextcloud bricht beim ersten Aufruf aber mit HTTP 500 und "This version of Nextcloud requires at least PHP 8.2" ab.
Warum bekomme ich "You are accessing the site from an untrusted domain"?
Nextcloud akzeptiert nur Hostnamen, die im Array trusted_domains in config/config.php stehen. Ergänzen Sie den Namen mit sudo -u www-data php occ config:system:set trusted_domains 1 --value=cloud.example.com. Der Index zählt ab 0, ein bereits vergebener Index wird überschrieben.
Wieso brechen Uploads trotz erhöhter php.ini ab?
Es gibt drei Grenzen. Neben upload_max_filesize und post_max_size in der FPM-php.ini bringt Nextcloud eine eigene .user.ini im Installationsverzeichnis mit, die verzeichnisbezogen gewinnt, und nginx begrenzt zusätzlich über client_max_body_size. Ist Letzteres zu klein, erscheint 413 Request Entity Too Large, bevor PHP überhaupt gefragt wird.
Warum laufen meine Hintergrundaufgaben nicht?
Frische Installationen stehen auf AJAX, dabei laufen Jobs nur bei geöffneter Oberfläche. Tragen Sie */5 * * * * php -f /var/www/nextcloud/cron.php in die crontab von www-data ein und schalten Sie mit occ background:cron um. Prüfen können Sie es mit occ config:app:get core lastcron, der Zeitstempel darf nicht älter als fünf Minuten sein.
Welche Rechte braucht das Datenverzeichnis?
Es gehört dem Webserver-Benutzer (www-data auf Debian und Ubuntu, apache oder nginx auf der Red-Hat-Familie) und sollte mit chmod 750 versehen sein. Zu weite Rechte lösen die Meldung "Your data directory is readable by other users" aus. Legen Sie das Verzeichnis außerhalb des Webserver-Wurzelverzeichnisses an, etwa unter /var/nextcloud-data.
Wie werde ich die Warnung zum fehlenden Memory-Cache los?
Installieren Sie php-apcu und setzen Sie occ config:system:set memcache.local --value='\OC\Memcache\APCu'. Damit auch occ und die Cron-Läufe den Cache nutzen, setzen Sie zusätzlich apc.enable_cli=1 in der apcu.ini der PHP-Kommandozeile.
Kann ich Nextcloud auch mit PostgreSQL betreiben?
Ja, PostgreSQL wird von Nextcloud gleichrangig unterstützt und in der Dokumentation sogar bevorzugt genannt. Auf Debian entfällt damit auch die Frage nach MySQL, das dort ohnehin nicht als Paket vorliegt. Bei der Einrichtung geben Sie --database "pgsql" statt "mysql" an.

Nextcloud Selfhosting PHP nginx MariaDB Debian Ubuntu Cloud Linux