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
Hinweis

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

Übersetzungen: