Nextcloud AIO: Error while expiring trashbin for user

Probleem

In het Nextcloud Administration Center stond de melding:

Errors in the log

In het Nextcloud-log kwamen veel herhalende fouten voor vanuit de files_trashbin app. De fout zag er ongeveer zo uit:

app: files_trashbin
scriptName: /var/www/html/cron.php
message: Error while expiring trashbin for user user1
exception: OCP\Files\NotFoundException
Message: /user1/files_trashbin

De fout kwam terug voor meerdere gebruikers, bijvoorbeeld:

/user1/files_trashbin
/user2/files_trashbin
/user3/files_trashbin

Het leek erop dat de cron/background job de prullenbak probeerde op te schonen, maar dat de map files_trashbin voor sommige gebruikers ontbrak.

Omgeving

Installatie: Nextcloud AIO
Container: nextcloud-aio-nextcloud
Logbestand: /var/www/html/data/nextcloud.log
Datadirectory binnen container: /mnt/ncdata

Controle

Eerst heb ik gecontroleerd welke gebruikersmap wel bestond, maar waar files_trashbin ontbrak:

sudo docker exec --user www-data -it nextcloud-aio-nextcloud sh -lc '
DATA="$(php occ config:system:get datadirectory)"
echo "Data directory: $DATA"

for USER in user1 user2 user3 user4 user5; do
  echo
  echo "== $USER =="
  if [ -d "$DATA/$USER" ]; then
    ls -ld "$DATA/$USER" || true
    ls -ld "$DATA/$USER/files_trashbin" || echo "Mist: $DATA/$USER/files_trashbin"
  else
    echo "Gebruikersmap bestaat niet: $DATA/$USER"
  fi
done
'

Daaruit bleek dat de gebruikersmappen wel bestonden, maar dat files_trashbin ontbrak.

De oplossing staat in de reactie hieronder.

Oplossing

De fout werd veroorzaakt door ontbrekende files_trashbin-mappen in de datadirectory van enkele gebruikers.

In mijn geval stonden de gebruikersmappen zelf wel in de datadirectory, maar ontbrak deze structuur:

/mnt/ncdata/<user>/files_trashbin/files
/mnt/ncdata/<user>/files_trashbin/versions

Ik heb de ontbrekende prullenbakmappen aangemaakt vanuit de Nextcloud AIO-container:

sudo docker exec --user www-data -it nextcloud-aio-nextcloud sh -lc '
DATA="$(php occ config:system:get datadirectory)"

for USER in user1 user2 user3 user4 user5; do
  if [ -d "$DATA/$USER" ]; then
    echo "Maak trashbin aan voor $USER"
    mkdir -p "$DATA/$USER/files_trashbin/files"
    mkdir -p "$DATA/$USER/files_trashbin/versions"
  else
    echo "Sla over, gebruikersmap bestaat niet: $USER"
  fi
done
'

Daarna heb ik de trashbin-expire job handmatig uitgevoerd:

sudo docker exec --user www-data -it nextcloud-aio-nextcloud php occ trashbin:expire --quiet

Deze gaf geen foutmelding meer terug.

Verificatie

Daarna heb ik gecontroleerd of de fout nog terugkwam in het log:

sudo docker exec --user www-data -it nextcloud-aio-nextcloud sh -lc '
LOG="$(php occ config:system:get logfile)"
grep "Error while expiring trashbin" "$LOG" | tail -n 20
'

In mijn geval stonden hier alleen nog oude logregels in.

Omdat het probleem opgelost leek, heb ik daarna het logbestand geleegd:

sudo docker exec --user root -it nextcloud-aio-nextcloud sh -lc '
: > /var/www/html/data/nextcloud.log
chown www-data:www-data /var/www/html/data/nextcloud.log
chmod 640 /var/www/html/data/nextcloud.log
'

Daarna opnieuw gecontroleerd:

sudo docker exec --user www-data -it nextcloud-aio-nextcloud sh -lc '
LOG="$(php occ config:system:get logfile)"
grep "Error while expiring trashbin" "$LOG" || echo "Geen trashbin errors gevonden"
'

Output:

Geen trashbin errors gevonden

Conclusie

De melding:

Error while expiring trashbin for user

werd veroorzaakt door ontbrekende files_trashbin-mappen bij enkele gebruikers.

Het aanmaken van deze mappen loste de fout op:

/mnt/ncdata/<user>/files_trashbin/files
/mnt/ncdata/<user>/files_trashbin/versions

Daarna draaide occ trashbin:expire zonder foutmelding en kwamen er geen nieuwe Error while expiring trashbin for user meldingen meer bij.