Skip to content
BotServBotServ
Nextcloud TalkBotKI-BotOllamaSelf-HostingNextcloudOpen Source

Nextcloud-Talk-Bot mit lokaler KI

Nextcloud-Talk-Bot mit Ollama bauen: Webhook-Integration, Webhook-Listener-Library, Chat-Kommandos und komplett self-hosted KI-Chat.

S

schutzgeist

5 min read
Nextcloud-Talk-Bot mit lokaler KI

Nextcloud-Talk-Bot mit lokaler KI

Was dieser Artikel behandelt

  • Wie Du einen Bot für Nextcloud Talk mit Ollama baust.
  • Zwei Wege: Webhook-basierte Bots (offiziell) und der „Webhook Listener”-Flow.
  • Bot anlegen, Nachrichten empfangen, antworten, komplett on-premise.
  • Erweiterungen: Dateien analysieren, RAG auf Nextcloud-Dokumente, Benachrichtigungen.
  • Wann Nextcloud Talk die richtige Plattform ist und wann nicht.

Einleitung

Wer schon Nextcloud betreibt, hat mit Nextcloud Talk eine Chat-Plattform quasi umsonst dabei, mit Video-Calls, Channels und File-Sharing, alles auf dem eigenen Server. Bots sind seit Talk 18+ offiziell unterstützt: als „Bots” mit Webhook-Registrierung oder als klassische Chat-Kommandos.

Die Kombination Nextcloud Talk + Ollama ist die vielleicht souveränste Bot-Lösung überhaupt: Chat, Dateien UND KI auf einem einzigen eigenen Server. Für Familien, Vereine und kleine Firmen mit bestehender Nextcloud ist das der geringste Zusatzaufwand.

Typische Anwendungsszenarien

  • Datei-Assistent: „Fass mir das PDF zusammen”, der Bot greift direkt auf Nextcloud-Dateien zu, kein Upload nötig.
  • Familien-KI: Kinder/Eltern chatten mit dem Assistenten auf dem Familien-Server.
  • Vereins-Chat: Fragen zum Vereins-Wiki per RAG.
  • Benachrichtigungen: Nextcloud-Events (neue Datei, Kalender) als KI-Kommentar.
  • Firmeninterner Bot: Für Teams, die Nextcloud schon als File-Hub nutzen.

Voraussetzungen

  • Nextcloud-Instanz (28+) mit Nextcloud Talk installiert
  • Admin-Zugang (Bot-Registrierung geht per occ-Kommando oder Admin-UI)
  • Ollama mit Modell
  • Python 3.10+, Flask/FastAPI für den Webhook-Endpoint

Schritt 1: Bot in Talk registrieren

Nextcloud Talk kennt zwei Bot-Typen:

  • Webhook-Bot: Talk ruft bei jeder neuen Nachricht Deinen HTTP-Endpoint auf (Signatur-verifiziert).
  • Command: Ein /befehl in Talk löst ein Skript aus, einfachster Einstieg.

Webhook-Bot per occ registrieren:

sudo -u www-data php occ talk:bot:install \
    "KI-Assistent" \
    "geheimes-shared-secret" \
    "https://deine-domain.de/talk-bot/webhook"

Rückgabe: Bot-ID + Secret. Das Secret verifiziert, dass Requests wirklich von Deinem Nextcloud kommen.

.env:

NC_URL=https://cloud.deine-domain.de
BOT_SECRET=geheimes-shared-secret
BOT_ID=123
OLLAMA_URL=http://localhost:11434
OLLAMA_MODEL=llama3.1:8b

Schritt 2: Webhook-Endpoint (Python/Flask)

Talk sendet bei jeder Nachricht in Bot-Konversationen einen JSON-POST an Deinen Endpoint, signiert mit dem Secret:

import hashlib
import hmac
import os
import requests
import ollama
from flask import Flask, request, abort
from dotenv import load_dotenv

load_dotenv()
app = Flask(__name__)

NC_URL = os.environ["NC_URL"]
SECRET = os.environ["BOT_SECRET"].encode()
MODEL = os.environ.get("OLLAMA_MODEL", "llama3.1:8b")
ollama_client = ollama.Client(host=os.environ["OLLAMA_URL"])

SYSTEM = "Du bist der Nextcloud-KI-Assistent. Antworte kurz, Deutsch."


def verify_signature(req):
    """Talk signiert Requests mit dem Shared Secret."""
    signature = req.headers.get("X-Nextcloud-Talk-Bot-Signature", "")
    random_val = req.headers.get("X-Nextcloud-Talk-Random", "")
    backend = req.headers.get("X-Nextcloud-Talk-Backend", "")
    digest = hmac.new(SECRET, (random_val + req.get_data(as_text=True)).encode(),
                      hashlib.sha256).hexdigest()
    return hmac.compare_digest(signature, digest)


def reply(token, text, reference_id=None):
    """Antwort in die Talk-Konversation posten."""
    requests.post(
        f"{NC_URL}/ocs/v2.php/apps/spreed/api/v1/bot/{token}/message",
        headers={"OCS-APIRequest": "true"},
        json={"message": text[:32000], "referenceId": reference_id or ""},
        auth=("bot", SECRET.decode()),   # Bot-Auth via Secret
    )


def ask_ollama(text):
    resp = ollama_client.chat(model=MODEL, messages=[
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": text},
    ])
    return resp["message"]["content"]


@app.route("/talk-bot/webhook", methods=["POST"])
def webhook():
    if not verify_signature(request):
        abort(401)
    data = request.json or {}
    message = (data.get("object", {}).get("content") or "")
    actor = data.get("actor", {})
    convo = data.get("target", {})
    token = convo.get("id")

    if not message or not token:
        return {"ok": True}

    # Nur auf Erwähnung oder in 1:1-Chats antworten
    if data.get("object", {}).get("type") == "chat_message":
        if "@" in message or convo.get("type") == 1:
            text = message.replace("@ki-assistent", "").strip()
            answer = ask_ollama(text)
            reply(token, answer, data["object"].get("id"))

    return {"ok": True}


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5050)

Reverse Proxy (Nginx/Caddy) routet https://deine-domain.de/talk-bot/ auf 127.0.0.1:5050.

Erweiterungen

Nextcloud-Dateien analysieren

Der Bot kann über die Nextcloud-WebDAV-API auf Dateien zugreifen (mit eigenem App-Passwort oder Bot-User). „Fass die Datei X zusammen” → Datei laden → Text extrahieren → Ollama:

def fetch_file(path):
    r = requests.get(
        f"{NC_URL}/remote.php/dav/files/bot/{path}",
        auth=("bot", APP_PASSWORD))
    return r.content

PDFs per Stirling-PDF oder pypdf zu Text konvertieren, dann an das Modell.

RAG auf Nextcloud-Dokumente

Nextcloud-Ordner regelmäßig indexieren (Text-Extraktion → Embeddings → Qdrant): Bot beantwortet aus allen Team-Dokumenten. Siehe Lokales RAG.

Proaktive Benachrichtigungen

Der Bot kann in Konversationen posten, ohne gefragt zu werden, z. B. wenn ein Cron-Job Nextcloud-Events (neue Datei, Kalender-Reminder) an den Bot weitergibt.

Kommando-Variante (einfacher Einstieg)

Statt Webhook: Talk-Command /ki registrieren: Talk führt Dein Skript mit den Parametern aus:

sudo -u www-data php occ talk:command:add ki "KI fragen" \
    --script "/opt/bot/ki.sh {ARGUMENTS}" --response 2

Gut für einfache Kommandos, kein Webserver nötig, aber keine Konversations-Kontext-Möglichkeit.

Deployment

services:
  talk-bot:
    build: ./bot
    restart: always
    env_file: .env
    ports: ["127.0.0.1:5050:5050"]
    depends_on: [ollama]

  ollama:
    image: ollama/ollama:latest
    volumes: [ollama_data:/root/.ollama]
    restart: always

volumes:
  ollama_data:

Sicherheit

  • Signature-Verifizierung: Immer prüfen, sonst kann jeder, der die URL kennt, dem Bot Nachrichten unterschieben.
  • Shared Secret: Wie ein Passwort behandeln, nie ins Repo.
  • HTTPS: Talk verlangt HTTPS-Endpoints: Reverse Proxy mit TLS.
  • Bot-Rechte: Der Bot liest nur Konversationen, in die er eingeladen wurde.

Typische Stolpersteine

  • Signature schlägt fehl: X-Nextcloud-Talk-Random + Body in der richtigen Reihenfolge hashen; Body als Raw-Bytes nehmen, nicht re-parsed JSON.
  • Bot sieht Channel nicht: Bot muss zur Konversation hinzugefügt werden: UI oder occ talk:bot:add-to-room.
  • Webhook nicht erreichbar: Talk ruft von Nextcloud-Server aus, localhost-Endpoints gehen nur, wenn Nextcloud lokal läuft.
  • Talk nicht installiert: Bot-Features brauchen die Talk-App, in Nextcloud Apps installieren.

Key Takeaways:

  • Nextcloud Talk + Ollama = die komplett souveränste Bot-Lösung (Chat + Dateien + KI on-premise).
  • Bot-Registrierung per occ-Kommando, Webhook mit Signatur-Verifizierung.
  • Killer-Feature: Bot greift direkt auf Nextcloud-Dateien zu, kein Upload nötig.
  • Für bestehende Nextcloud-Nutzer der geringste Aufwand; als Standalone-Chat ist Mattermost/Matrix stärker.
  • Command-Variante für einfache /befehle, Webhook für volle Bot-Logik.

FAQ

Was brauche ich mindestens?

Nextcloud 28+ mit Talk-App, ein registrierter Bot (occ talk:bot:install), ein HTTPS-Endpoint für den Webhook und Ollama. Kein Cloud-Account, keine externe Registrierung.

Webhook-Bot oder Command?

Commands (/ki frage) für einfache Ein-Schritt-Aufrufe ohne Server-Aufwand. Webhook-Bots für Konversationen mit Kontext, Erwähnungen und proaktives Posten. Webhook ist die richtige Wahl für einen KI-Assistenten.

Sind Talk-Chats verschlüsselt?

Standardmäßig Transport- und Server-seitig, kein E2EE. Für E2EE-Chat bleiben Matrix und Signal die bessere Wahl. Dafür hast Du bei Talk volle Datenkontrolle auf Deinem Server.

Wie performant ist Talk mit vielen Usern?

Für kleine bis mittlere Installationen (bis ~50 User) gut. Bei vielen gleichzeitigen Chat-Nutzern hilft das High-Performance-Backend (HPB), das ist ein extra Setup. Für große Communitys: Matrix oder Mattermost.

Kann der Bot Nextcloud-Dateien lesen?

Ja, über die WebDAV-API mit eigenem Bot-User/App-Passwort. Dateien laden, Text extrahieren (PDF per Stirling-PDF oder pypdf) und an Ollama schicken. Kein manueller Upload nötig.

Was kostet das?

Nichts: Nextcloud Talk ist Open Source. Kosten nur für Deinen Server (und GPU für Ollama). Ideal für Familien/Vereine mit bestehender Nextcloud.

Talk oder Matrix?

Talk wenn Du schon Nextcloud hast (kein zweiter Server nötig, Dateien-Integration). Matrix wenn Du eine eigenständige Chat-Plattform mit Federation und E2EE willst. Beide sind self-hosted und Open Source.

Quellen und weiterführende Literatur

Zurück zum KI Blog
Share:

Ähnliche Beiträge