add quota checker

This commit is contained in:
2026-01-11 13:40:49 +01:00
parent 447a6176d5
commit 18844bb8b1
3 changed files with 81 additions and 1 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
*.TO_BE_DELETED *.TO_BE_DELETED
tmp/

View File

@@ -114,7 +114,8 @@ services:
max-file: "5" max-file: "5"
nextcloud-cron-v1: nextcloud-cron-v1:
image: nextcloud:32.0.1-fpm # image: nextcloud:32.0.1-fpm
image: nextcloud:32.0.2-fpm
container_name: nextcloud-cron-v1 container_name: nextcloud-cron-v1
restart: unless-stopped restart: unless-stopped
entrypoint: /cron.sh entrypoint: /cron.sh

78
tools/nextcloud_quotacheck.sh Executable file
View File

@@ -0,0 +1,78 @@
#!/bin/bash
set -euo pipefail
readonly CONTAINER_NAME="nextcloud-fpm-v1"
readonly OCC_CMD="docker exec --user www-data $CONTAINER_NAME php occ"
readonly THRESHOLD=95
readonly SENDER_EMAIL="knusperkerne@posteo.de"
USERS=$($OCC_CMD user:list | awk '{print $2}' | tr -d :)
for USER in $USERS; do
EMAIL=$($OCC_CMD user:info "$USER" 2>/dev/null | grep -i "email:" \
| head -n 1 | sed -E 's/.*email: (.*)/\1/' | tr -d '[:space:]')
# Falls die E-Mail ein "null" String oder leer ist
if [[ -z "$EMAIL" ]] || [[ "$EMAIL" == "null" ]]; then
echo "Skipping $USER: No valid email found in occ user:info."
continue
fi
if [ -z "$EMAIL" ] || [ "$EMAIL" == "null" ]; then
echo "Skipping $USER: No valid email found."
continue
fi
QUOTA_RAW=$($OCC_CMD user:setting "$USER" files quota 2>/dev/null) || true
# Falls Quota auf 'none', leer oder Fehlermeldung
if [[ -z "$QUOTA_RAW" ]] || [[ "$QUOTA_RAW" == "none" ]] \
|| [[ "$QUOTA_RAW" =~ "not exist" ]]; then
echo "Skipping $USER: No quota defined (none/default)."
continue
fi
# convert quota into bytes
CLEAN_VALUE=$(echo "$QUOTA_RAW" | grep -oP '^[0-9]+')
CLEAN_UNIT=$(echo "$QUOTA_RAW" |
grep -oP '[a-zA-Z]' | head -n 1 | tr '[:lower:]' '[:upper:]')
if [[ -z "$CLEAN_UNIT" ]]; then
QUOTA_BYTES=$CLEAN_VALUE
else
# numfmt versteht "50G", "2M" etc.
QUOTA_BYTES=$(numfmt --from=iec "${CLEAN_VALUE}${CLEAN_UNIT}")
fi
USED_BYTES=$(docker exec $CONTAINER_NAME \
du -sb /var/www/html/data/"$USER"/files 2>/dev/null \
| awk '{print $1}')
USED_BYTES=${USED_BYTES:-0}
if [ "$QUOTA_BYTES" -gt 0 ]; then
PERCENT=$(( 100 * USED_BYTES / QUOTA_BYTES ))
if [ "$PERCENT" -ge "$THRESHOLD" ]; then
echo "WARNUNG: $USER ist bei $PERCENT% ($EMAIL)"
{
printf "Hallo %s,\n\n" "$USER"
printf "Dein Nextcloud-Speicher ist zu %s%% voll.\n\n" \
"$PERCENT"
printf "Belegt: %s von %s.\n\n" \
"$(numfmt --to=iec $USED_BYTES)" "$QUOTA_RAW"
printf "Bitte lösche nicht mehr benötigte Dateien."
} \
| mailx -s "Nextcloud-Speicherwarnung ($PERCENT%)" -r "$SENDER_EMAIL" "$EMAIL"
else
echo "Quota usage for $USER is OK"
fi
fi
done
echo "Done."