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
/befehlin 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.
Weiterführende Links
- IRC-Coding.de: Vertiefende Programmier-Tutorials: Webhooks, Flask, Signature-Verifikation.
- Nextcloud-Integration: Nextcloud mit n8n automatisieren.
- Matrix-Bots: Stärkere Chat-Plattform für Communitys.
- Mattermost-Bot: Team-Chat-Alternative.
- Docker: Deployment-Grundlagen.
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?
Webhook-Bot oder Command?
Sind Talk-Chats verschlüsselt?
Wie performant ist Talk mit vielen Usern?
Kann der Bot Nextcloud-Dateien lesen?
Was kostet das?
Talk oder Matrix?
Quellen und weiterführende Literatur
- Nextcloud Talk Bots: Offizielle Bot-Doku.
- Nextcloud: Self-hosted Cloud.
- Ollama: Lokaler Modellserver.
- IRC-Coding.de: Programmier-Tutorials.


