Kurztipp: Nextcloud File Locks entfernen
Um das versehentliche Überschreiben von Dateien bei der Synchronisation - insbesondere zwischen mehreren Usern und Clients - zu verhindern, setzt Nextcloud auf File Locking. Diese Funktion ist auf Applikationsebene implementiert und hat daher keine besonderen Anforderungen an das verwendete Dateisystem.
Bei größeren Datenmengen und Netzwerkproblemen kommt es hier jedoch gerne mal zu einem Dead Lock: Dateien können nicht gelöscht werden, obwohl sie nicht mehr verwendet werden. Entsprechende Fehlermeldungen in der Web-Oberfläche und den entsprechenden Clients zeigen, dass die Datei gesperrt ist.
Die Sperren lässt sich auch über die occ
-CLI verifizieren - beispielsweise für alle angelegten User:
1$ ./occ files:scan --all
2Starting scan for user 1 out of 1337 (sgiertz)
3Starting scan for user 2 out of 1337 (ppinkepank)
4...
5Exception while scanning: "files/[...]" is locked
Bei größeren Umgebungen empfiehlt es sich, den Scan nur für betroffene User auszuführen: ./occ files:scan [name]
Ein Ansatz zur Problemlösung ist es, Nextcloud temporär in den Wartungsmodus zu versetzen und die Sperren in der verwendeten Datenbank zu entfernen:
1$ ./occ maintenance:mode --on
1$ mysql -u <nextcloud_user> -p <nextcloud_db>
2MariaDB [nextcloud_db]> DELETE FROM oc_file_locks;
1$ ./occ maintenance:mode --off
Anschließend sollte der Scan keine Fehler mehr zeigen:
1$ ./occ files:scan --all
2Starting scan for user 1 out of 1337 (sgiertz)
3Starting scan for user 2 out of 1337 (ppinkepank)
4...
5+---------+-------+--------+--------------+
6| Folders | Files | Errors | Elapsed time |
7+---------+-------+--------+--------------+
8| 81 | 606 | 0 | 00:00:02 |
9+---------+-------+--------+--------------+
Wenn diese Fehler häufiger auftreten, ist es empfehlenswert, ein anderen Locking-Mechanismus einzusetzen - beispielsweise Redis.
In einem docker-compose
-Setup genügt es, hierfür einen weiteren Container hinzuzufügen:
1...
2 nextcloud:
3 image: nextcloud:28-apache
4 container_name: nextcloud
5 ports:
6 - '8080:80'
7 links:
8 - nextcloud_db
9 - nextcloud_redis
10 volumes:
11 - nextcloud:/var/www/html
12 env_file:
13 - env.nextcloud
14 networks:
15 - ext
16 depends_on:
17 - nextcloud_db
18 - nextcloud_redis
19 restart: always
20
21 nextcloud_redis:
22 image: redis:7.2
23 container_name: nextcloud_redis
24 command: "--appendonly yes --requirepass REDIS_PASSWORD"
25 restart: always
26
27 nextcloud_db:
28 image: mariadb:10.5
29 container_name: nextcloud_db
30 command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
31 restart: always
32 volumes:
33 - nextcloud_db:/var/lib/mysql
34 env_file:
35 - env.nextcloud_db
REDIS_PASSWORD
muss durch ein entsprechendes, sicheres Kennwort ersetzt werden. Dieses muss in diesen Beispiel auch in der Datei env.nextcloud
hinterlegt werden:
1REDIS_HOST=nextcloud_redis
2REDIS_HOST_PASSWORD=REDIS_PASSWORD