ki

Speedtuning beim Nextcloud KI-Assistenten

Von peter portmann,

Veröffentlicht am 2. Okt. 2025   â€”   4 min Lesezeit

nextcloudunraidmacosselfhostedcomputer

Nextcloud KI-Assistent

[Nextcloud Assistent]

🤖
Leider werden KI-Anfragen in der Nextcloud nur mit Verzögerung bearbeitet. Dies liegt an der verwendeten PHP-Architektur. Für mich ist der Dienst so nicht praxistauglich, also habe ich längere Zeit nach einer Verbesserung gesucht und endlich gefunden. Ich freue mich auf eine Diskussion, falls jemand eine bessere Lösung umgesetzt hat.

Da ich den Docker-Container nicht verändert möchte, soll das Hostsystem entsprechend angepasst werden.

Die hier vorgestellte Beschleunigung ist erheblich, da im Extremfall nicht mehr 5 Minuten auf die Bearbeitung gewartet werden muss. Andere Frontends wie Enchanted, MstyStudio oder Obsidian Copilot sind allerdings mit demselben lokalen KI Server gefĂĽhlt schneller.


Nextcloud Docs / AI: Improve AI task pickup speed

[Improve AI task pickup speed]

Hier habe ich den entscheidenden Hinweis gefunden.

  • Das Hintergrund‑Job‑System von Nextcloud fĂĽhrt KI‑Aufgaben standardmäßig alle 5 Minuten aus.
  • Durch Einrichten von Hintergrund‑Job‑Workern im Nextcloud‑Server/Container können KI‑Aufgaben sofort nach ihrer Planung verarbeitet werden.
  • Ă„nderungen am PHP‑Code oder an Nextcloud‑Einstellungen werden von laufenden Workern nicht sofort ĂĽbernommen; ein regelmäßiger Neustart des Workers ist nötig.
  • Der occ‑Befehl sollte in einer screen‑ oder tmux‑Sitzung ausgefĂĽhrt werden, vorzugsweise vier‑mal oder öfter, um mehrere Anfragen parallel zu bearbeiten.
  • Jeder occ‑Befehl sollte in einer eigenen screen‑Session bzw. tmux‑Fenster/Pane laufen, damit Logs sichtbar bleiben und der Worker leicht neu gestartet werden kann.

Der Befehl, um den worker zu starten:

php occ background-job:worker -v -t 60
"OC\TaskProcessing\SynchronousBackgroundJob"

Kontrolle in der Konsole des nextcloud Docker-Containers:

root@b84b2fa1cb35:/# /usr/bin/php /app/www/public/occ
background-job:worker -t 60
"OC\TaskProcessing\SynchronousBackgroundJob"

Background job worker will stop after 60 seconds

UNRAID Server mit Nextcloud

Auf der Server laufen folgende Docker-Container fĂĽr die Nextcloud:

lscr.io/linuxserver/nextcloud
lscr.io/linuxserver/mariadb:11.4.5
onlyoffice/documentserver
jc21/nginx-proxy-manager

Da ich keine fixe IP-Adresse besitze, ist der Server via Cloudflare-Tunnel und Nginx-Proxy-Manager nach aussen exponiert.

Mit dem Community-Plugin 'User-Scripts' wird ein bash-Skript automatisch gestartet beim UNRAID-Systemstart. Dann läufte dieses dauerhaft im Hintergrund und stellt der Nextcloud-KI dauerhaft einen worker zur Verfügung. Die Anfragen werden nun sofort bearbeitet und nicht zuerst in einer Warteschleife 'parkiert'.

Das bash-Skript habe ich mit gpt-oss:120b auf dem lokalen Ollama-Server erstellt. Eine Lösung mit parallelen Sessions hat nicht funktioniert, versuche das später noch einmal.

gpt-oss:120b lieferte hier das deutlich bessere Resultat als die Online-KI Gemini 2.5 Flash.

Skript:

#!/usr/bin/env bash
# ------------------------------------------------------------
# Nextcloud‑Worker‑Restarter
# Aufruf über das UNRAID User‑Script‑Plugin (oder CLI)
# ------------------------------------------------------------

set -euo pipefail

# ---- Konfiguration -------------------------------------------------
# Name des Docker‑Containers
NC_CONTAINER="nextcloud"
WORKER_CMD=(
    php /app/www/public/occ
    background-job:worker
    -t 60 "OC\TaskProcessing\SynchronousBackgroundJob"
)
# Pfad zur Log‑Datei
LOGFILE="/mnt/user/appdata/scripts/nextcloud-worker.log"
# Sekunden, bevor neu gestartet wird      
RESTART_DELAY=5                            
# --------------------------------------------------------------------

# ---- Hilfsfunktionen ------------------------------------------------
log() {
    local ts
    ts=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$ts] $*" | tee -a "$LOGFILE"
}

die() {
    log "ERROR: $*"
    exit 1
}
# --------------------------------------------------------------------

# ---- Vorab‑Checks ---------------------------------------------------
if ! command -v docker >/dev/null 2>&1; then
    die "Docker ist nicht installiert oder nicht im PATH."
fi

if ! docker ps -q -f "name=^${NC_CONTAINER}$" | grep -q .; then
    die "Container '${NC_CONTAINER}' läuft nicht oder existiert nicht."
fi
# --------------------------------------------------------------------

# ---- Abbruch‑Handling ------------------------------------------------
trap 'log "Abbruch durch Nutzer – Skript wird beendet."; exit 0' SIGINT SIGTERM
# --------------------------------------------------------------------

log "= Start des Nextcloud‑Worker‑Restarters ="
while true; do
    log "Starting Nextcloud Worker (Timeout: 60 s)…"

    # Docker‑exec mit Array‑Syntax, damit Sonderzeichen sicher übergeben werden
    if docker exec "$NC_CONTAINER" "${WORKER_CMD[@]}"; then
        log "Worker beendet (Exit‑Code 0)."
    else
        rc=$?
        log "Worker beendet mit Fehler‑Exit‑Code $rc."
    fi

    log "Restarting in ${RESTART_DELAY}s…"
    sleep "$RESTART_DELAY"
done

Erklärung wird gleich mitgeliefert:

Befehl Nutzen
#!/usr/bin/env bash Portabler Shebang.
set -euo pipefail Skript bricht bei Fehlern sofort ab – verhindert ungewolltes Weiterlaufen.
log() + tee Sowohl in der Konsole (wenn du das Skript aus Obsidian startest) als auch in einer Log‑Datei sichtbar.
WORKER_CMD als Array Keine Probleme mehr mit Anführungszeichen oder Escape‑Sequenzen.
Vorab‑Check, ob Docker läuft & Container existiert Frühzeitige Fehlermeldung, statt endlos zu warten.
trap fĂĽr SIGINT/SIGTERM Sauberer Abbruch, wenn du das Skript aus Obsidian stoppst.
RESTART_DELAY als Variable Einfach anpassbar.
die()‑Funktion Einheitliche Fehlermeldungen.

Kontrolle im log:

root@ASRockMini:~# cat /mnt/user/appdata/scripts/nextcloud-worker.log
[2025-10-01 22:31:39] = Start des Nextcloud‑Worker‑Restarters =
[2025-10-01 22:31:40] Starting Nextcloud Worker (Timeout: 60 s)…
[2025-10-01 22:31:57] Abbruch durch Nutzer – Skript wird beendet.
[2025-10-01 22:32:13] = Start des Nextcloud‑Worker‑Restarters =
[2025-10-01 22:32:13] Starting Nextcloud Worker (Timeout: 60 s)…
[2025-10-01 22:33:15] Worker beendet (Exit‑Code 0).
[2025-10-01 22:33:15] Restarting in 5s…
[2025-10-01 22:33:20] Starting Nextcloud Worker (Timeout: 60 s)…
[2025-10-01 22:34:22] Worker beendet (Exit‑Code 0).
[2025-10-01 22:34:22] Restarting in 5s…
[2025-10-01 22:34:27] Starting Nextcloud Worker (Timeout: 60 s)…

Hardware

Die Hardware läuft im eigenen Haus.

UNRAID Server

[ASRock DeskMini X300]

Mac Studio KI Server

[Mac Studio Ultra M3]
[Ollama]

Stromverbrauch

Beide Geräte sind an eine APC UPS angeschlossen. Der Stromverbrauch der angeschlossenen Geräte wird im Dashboard von UNRAID angezeigt.

Im Ruhezustand werden nur 23 W benötigt. Der Mini PC benötigt hier 13 W, der Mac Studio 10 W. Bei einer KI-Anfrage steigt der Stromverbrauch dann für einige Sekunden auf bis zu 180 W.


Nextcloud Assistant

Nextcloud kann auf OpenAI kompatible lokale Server zugreifen.

Diese KI-Anfrage benötigt für einige Sekunden etwa 150 W.


Auf Facebook teilen Auf Linkedin teilen Auf Twitter teilen Per E-Mail senden

Newsletter abonnieren

Einschreiben und kostenlos News direkt per E-Mail erhalten.

einschreiben