Bot de Nextcloud Talk con IA local
Qué cubre este artículo
- Cómo construir un bot para Nextcloud Talk con Ollama.
- Dos enfoques: bots basados en webhooks (oficiales) y el flujo “Webhook Listener”.
- Crear un bot, recibir mensajes, responder, completamente on-premise.
- Extensiones: analizar archivos, RAG en documentos de Nextcloud, notificaciones.
- Cuándo Nextcloud Talk es la plataforma adecuada y cuándo no.
Introducción
Si ya ejecutas Nextcloud, tienes Nextcloud Talk como plataforma de chat prácticamente incluida, con videollamadas, canales y compartición de archivos, todo en tu propio servidor. Los bots se soportan oficialmente desde Talk 18+: como “bots” con registro de webhook o como comandos de chat clásicos.
La combinación Nextcloud Talk + Ollama es probablemente la solución de bot más soberana que existe: chat, archivos e IA en un único servidor propio. Para familias, asociaciones y pequeñas empresas con Nextcloud ya instalado, esto supone el mínimo esfuerzo adicional.
Escenarios de uso típicos
- Asistente de archivos: “Résumeme ese PDF”, el bot accede directamente a archivos de Nextcloud sin necesidad de carga.
- IA familiar: Niños y padres conversan con el asistente en el servidor familiar.
- Chat de asociación: Preguntas sobre el wiki de la asociación mediante RAG.
- Notificaciones: Eventos de Nextcloud (archivo nuevo, recordatorio de calendario) como comentario de IA.
- Bot interno de empresa: Para equipos que ya usan Nextcloud como centro de archivos.
Requisitos previos
- Instancia de Nextcloud (28+) con Nextcloud Talk instalado
- Acceso de administrador (el registro de bot se realiza mediante comando occ o UI de administrador)
- Ollama con modelo
- Python 3.10+, Flask/FastAPI para el endpoint del webhook
Paso 1: Registrar el bot en Talk
Nextcloud Talk conoce dos tipos de bot:
- Bot de Webhook: Talk invoca tu endpoint HTTP en cada mensaje nuevo (con verificación de firma).
- Comando: Un
/comandoen Talk ejecuta un script, es la entrada más simple.
Registra un bot de webhook mediante occ:
sudo -u www-data php occ talk:bot:install \
"Asistente de IA" \
"secreto-compartido-secreto" \
"https://tu-dominio.de/talk-bot/webhook"
Retorna: ID del bot + secret. El secret verifica que las solicitudes provengan realmente de tu Nextcloud.
.env:
NC_URL=https://cloud.tu-dominio.de
BOT_SECRET=secreto-compartido-secreto
BOT_ID=123
OLLAMA_URL=http://localhost:11434
OLLAMA_MODEL=llama3.1:8b
Paso 2: Endpoint del webhook (Python/Flask)
Talk envía un POST JSON a tu endpoint en cada mensaje en conversaciones con bots, firmado con el 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 = "Eres el asistente de IA de Nextcloud. Responde de forma concisa en español."
def verify_signature(req):
"""Talk firma las solicitudes con el 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):
"""Publica una respuesta en la conversación de Talk."""
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()), # Autenticación de bot mediante 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}
# Responder solo si se menciona o en chats 1:1
if data.get("object", {}).get("type") == "chat_message":
if "@" in message or convo.get("type") == 1:
text = message.replace("@asistente-ia", "").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)
Un proxy inverso (Nginx/Caddy) enruta https://tu-dominio.de/talk-bot/ hacia 127.0.0.1:5050.
Extensiones
Analizar archivos de Nextcloud
El bot puede acceder a archivos a través de la API WebDAV de Nextcloud (con contraseña de aplicación propia o usuario bot). “Résumeme el archivo X” → cargar archivo → extraer texto → Ollama:
def fetch_file(path):
r = requests.get(
f"{NC_URL}/remote.php/dav/files/bot/{path}",
auth=("bot", APP_PASSWORD))
return r.content
Convierte PDFs a texto usando Stirling-PDF o pypdf, luego envía al modelo.
RAG en documentos de Nextcloud
Indexa carpetas de Nextcloud regularmente (extracción de texto → embeddings → Qdrant): el bot responde basándose en todos los documentos del equipo. Consulta RAG local.
Notificaciones proactivas
El bot puede publicar en conversaciones sin ser preguntado, por ejemplo cuando un trabajo cron reenvía eventos de Nextcloud (archivo nuevo, recordatorio de calendario) al bot.
Variante de comando (entrada más simple)
En lugar de webhook: registra un comando /ia de Talk: Talk ejecuta tu script con los parámetros:
sudo -u www-data php occ talk:command:add ia "Hacer una pregunta de IA" \
--script "/opt/bot/ia.sh {ARGUMENTS}" --response 2
Funciona bien para comandos simples, no requiere servidor web, pero no permite contexto de conversación.
Despliegue
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:
Seguridad
- Verificación de firma: Siempre verifica, de lo contrario cualquiera que conozca la URL puede atribuir mensajes al bot.
- Shared secret: Trata como una contraseña, nunca lo incluyas en el repositorio.
- HTTPS: Talk requiere endpoints HTTPS: proxy inverso con TLS.
- Permisos del bot: El bot solo lee conversaciones en las que ha sido invitado.
Problemas comunes
- La firma falla: Haz hash de
X-Nextcloud-Talk-Random+ body en el orden correcto; toma el body como bytes brutos, no JSON re-parseado. - El bot no ve el canal: El bot debe añadirse a la conversación: UI u
occ talk:bot:add-to-room. - El webhook no es alcanzable: Talk invoca desde el servidor Nextcloud, los endpoints localhost solo funcionan si Nextcloud se ejecuta localmente.
- Talk no instalado: Las características de bot requieren la aplicación Talk, instálala en Nextcloud Apps.
Enlaces de referencia
- IRC-Coding.de: Tutoriales avanzados de programación: webhooks, Flask, verificación de firmas.
- Nextcloud-Integration: Automatiza Nextcloud con n8n.
- Matrix-Bots: Plataforma de chat más robusta para comunidades.
- Mattermost-Bot: Alternativa de chat en equipo.
- Docker: Fundamentos de deployment.
Puntos clave:
- Nextcloud Talk + Ollama = la solución de bot completamente soberana (chat, archivos e IA on-premise).
- Registro de bot mediante comando occ, webhook con verificación de firma.
- Característica principal: el bot accede directamente a los archivos de Nextcloud, sin necesidad de cargar.
- Para usuarios de Nextcloud existentes es lo más simple; como chat independiente, Mattermost/Matrix son más potentes.
- Variante de comandos para órdenes simples tipo /comando, webhook para lógica de bot completa.
Preguntas frecuentes
¿Qué necesito como mínimo?
¿Webhook o comando?
¿Están cifrados los chats de Talk?
¿Qué rendimiento tiene Talk con muchos usuarios?
¿Puede el bot leer archivos de Nextcloud?
¿Cuánto cuesta?
¿Talk o Matrix?
Fuentes y lecturas complementarias
- Nextcloud Talk Bots: Documentación oficial de bots.
- Nextcloud: Cloud self-hosted.
- Ollama: Servidor de modelos local.
- IRC-Coding.de: Tutoriales de programación.


