Nextcloud auf dem eigenen Server installieren
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:
| System | PHP aus der Distribution | Datenbank aus der Distribution | Bewertung |
|---|---|---|---|
| Debian 13 (trixie) | 8.4 | MariaDB 11.8 | passt ohne Fremdquelle |
| Debian 12 (bookworm) | 8.2 | MariaDB 10.11 | passt, aber am unteren Rand |
| Ubuntu 24.04 LTS | 8.3 | MariaDB 10.11, MySQL 8.0 | passt ohne Fremdquelle |
| Ubuntu 22.04 LTS | 8.1 | MariaDB 10.6, MySQL 8.0 | zu alt für Nextcloud 33 und 34 |
| Debian 11 (bullseye) | 7.4 | MariaDB 10.5 | scheidet 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/configgehört nicht dem Webserver-Benutzer. Auf Debian und Ubuntu ist daswww-data, auf AlmaLinux und Rocky dagegenapacheodernginx. Ein blind kopierteschown www-datalä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-datanicht betretbar. - „Your data directory is readable by other users": Rechte zu weit.
chmod 750auf 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:
- 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. - Die Datei
.user.iniim Nextcloud-Verzeichnis: Nextcloud liefert eigene Werte mit, und weil.user.iniverzeichnisbezogen gilt, gewinnt sie gegen die globalephp.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. - 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 auchoccund die Cron-Läufe davon profitieren, setzen Sie zusätzlichapc.enable_cli=1in/etc/php/<version>/mods-available/apcu.ini. - „Transactional file locking is disabled": Redis installieren (
apt-get install -y redis-server php-redis) undmemcache.lockingauf\OC\Memcache\Redissetzen. 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 mitcurl -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 DeutschlandDE. 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 passendocc db:add-missing-columnsundocc 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.confdie Zeileenv[PATH] = /usr/local/bin:/usr/bin:/bineinkommentieren 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?
Warum bekomme ich "You are accessing the site from an untrusted domain"?
Wieso brechen Uploads trotz erhöhter php.ini ab?
Warum laufen meine Hintergrundaufgaben nicht?
Welche Rechte braucht das Datenverzeichnis?
Wie werde ich die Warnung zum fehlenden Memory-Cache los?
Kann ich Nextcloud auch mit PostgreSQL betreiben?
2026 KernelHost GmbH. Alle Rechte vorbehalten. Diese Anleitung ist urheberrechtlich geschützt. Eine Veröffentlichung auf anderen Webseiten, auch auszugsweise oder in bearbeiteter Form, ist ohne unsere schriftliche Zustimmung nicht gestattet. Zitate mit Quellenangabe und Link sind ausdrücklich willkommen.

