„Ich habe die Dateien per SCP direkt in den Ordner kopiert, aber in Nextcloud ist nichts zu sehen.“ Die Dateien sind da, das zeigt ein ls auf dem Server. Nextcloud weiß nur nichts davon.
Warum die Dateien unsichtbar sind
Nextcloud liest bei jedem Seitenaufruf nicht das komplette Dateisystem ein. Stattdessen führt es in der Datenbank einen Dateicache (Tabelle filecache, je nach Präfix z. B. oc_filecache) mit Pfad, Größe, Änderungszeit, ETag und Berechtigungen jeder Datei. Weboberfläche, Sync-Clients, Freigaben und die Suche arbeiten mit diesen Einträgen.
Kommt eine Datei über die Weboberfläche, WebDAV oder einen Client, legt Nextcloud den Eintrag selbst an. Wird sie dagegen direkt ins Datenverzeichnis kopiert – per SCP, rsync, cp oder über ein gemountetes Laufwerk –, fehlt der Eintrag. Für Nextcloud existiert die Datei nicht.
Die Lösung: occ files:scan
Der Befehl files:scan gleicht Dateisystem und Datenbank ab. Er läuft als Webserver-Benutzer im Nextcloud-Verzeichnis, unter Debian und Ubuntu meist www-data:
cd /var/www/nextcloud
sudo -u www-data php occ files:scan --path="benutzer/files/Ordner"
Der Pfad beginnt mit der Benutzer-ID, gefolgt von files und dem Ordner innerhalb des Benutzerverzeichnisses. Nur diesen Teilbaum zu scannen geht deutlich schneller als einen ganzen Benutzer.
Weitere Varianten:
# alle Dateien eines Benutzers
sudo -u www-data php occ files:scan benutzer
# alle Benutzer (bei großen Instanzen lange Laufzeit)
sudo -u www-data php occ files:scan --all
Läuft Nextcloud im offiziellen Docker-Image, wird der Befehl im Container ausgeführt:
docker exec -u www-data nextcloud php occ files:scan --path="benutzer/files/Ordner"
Der Containername kann je nach Setup anders lauten.
Typische Stolpersteine
Falscher Benutzer. occ muss als der Benutzer laufen, dem config/config.php gehört. Als root gestartet, bricht es mit einer entsprechenden Meldung ab. Deshalb immer sudo -u www-data (bzw. den passenden Webserver-Benutzer) verwenden.
Falsche Besitzrechte. Kopierte Dateien gehören oft dem Benutzer, der sie kopiert hat. Der Webserver kann sie dann nicht lesen oder ändern. Vor dem Scan korrigieren:
chown -R www-data:www-data /var/www/nextcloud/data/benutzer/files/Ordner
Das Datenverzeichnis liegt nicht immer unter /var/www/nextcloud/data. Der tatsächliche Pfad steht in config/config.php unter datadirectory.
Verschlüsselung. Ist die serverseitige Verschlüsselung aktiv, lassen sich Dateien nicht einfach unverschlüsselt ins Datenverzeichnis legen. Hier führt der Weg nur über WebDAV oder einen Client.
Managed Hosting. Bei verwalteten Nextcloud-Instanzen gibt es in der Regel keinen Shell-Zugang und damit auch kein occ. Dort ist der Upload über die offiziellen Schnittstellen ohnehin der einzige Weg.
Besser für die Zukunft: über Nextcloud hochladen
Der sauberste Weg ist, Dateien gar nicht am Server vorbei abzulegen. Dann bleiben Dateisystem und Datenbank automatisch synchron, und Versionen, Freigaben und Benachrichtigungen funktionieren wie erwartet.
- Desktop-Client: Dateien in den synchronisierten Ordner legen.
- WebDAV: zum Beispiel mit einem Dateimanager oder
rcloneaufhttps://cloud.beispiel.de/remote.php/dav/files/BENUTZER/. - Große Bestände: auch hier eignet sich WebDAV mit einem Werkzeug, das Wiederholungen und parallele Übertragungen beherrscht.
Es gibt in der config.php zwar die Option filesystem_check_changes, mit der Nextcloud bei Zugriffen nach Änderungen sucht. Sie kostet aber Leistung und ist keine gute Dauerlösung für regelmäßige Direktkopien.
So prüfen
- Liegen die Dateien im richtigen Pfad unterhalb von
datadirectory? - Gehören sie dem Webserver-Benutzer?
occ files:scanals Webserver-Benutzer mit passendem--pathausgeführt?- Ausgabe des Scans geprüft (Anzahl Ordner, Dateien, Fehler)?
- In der Weboberfläche mit Neuladen kontrolliert, ob alles sichtbar ist?
- Für künftige Uploads WebDAV oder den Client eingeplant?
Wer häufiger mit Nextcloud-Fehlerbildern zu tun hat, findet im Blog auch einen Artikel zu typischen SAML- und OIDC-Fehlern. Die Regel aus diesem Fall gilt aber generell: Nextcloud zeigt, was in seiner Datenbank steht – und nicht mehr.