Tutorial

Open-WebUI + Ollama en VPS: interfaz web multiusuario para LLM

Inteligencia Artificial17 min de lectura9 pasos

Ollama sirve tus modelos de lenguaje a través de una API local. Open-WebUI añade la capa de interfaz: una aplicación web completa con gestión de usuarios, RAG sobre documentos, historial de conversaciones y autenticación SSO. Al desplegar ambos en tu VPS, das acceso a todo tu equipo a LLM privados sin exponer la API bruta ni requerir acceso a la línea de comandos. Esta guía cubre la instalación, el proxy inverso, el SSO y la gestión de permisos. También cubre la búsqueda web con SearXNG, qué hacer cuando deja de devolver resultados y qué se puede medir realmente del uso de una instancia de equipo.

Contenido· Por qué añadir Open-WebUI a tu servidor Ollama1/17
  1. 01Por qué añadir Open-WebUI a tu servidor Ollama
  2. 02Lo que Open-WebUI aporta concretamente a tu stack Ollama
  3. 03Requisitos de hardware y software
  4. 04Desplegar Open-WebUI y Ollama con Docker Compose
  5. 05Configurar el SSO con OpenID Connect
  6. 06Activar el RAG sobre tus documentos
  7. 07Añadir la búsqueda web con SearXNG
  8. 08Open-WebUI, AnythingLLM, LibreChat: qué interfaz elegir
  9. 09Solución de problemas: errores comunes
  10. 10Solución de problemas: la búsqueda web no devuelve nada
  11. 11Diagnosticar una búsqueda web vacía
  12. 12Seguir el uso de una instancia de equipo
  13. 13Las cuatro fuentes de medida
  14. 14Lo que el seguimiento de uso aún no hace
  15. 15Asegurar el acceso a la API de Ollama
  16. 16Funciones avanzadas para explorar tras el despliegue
  17. 17Documentación oficial

Por qué añadir Open-WebUI a tu servidor Ollama

Ollama expone una API REST compatible con OpenAI — eficiente para desarrolladores, inaccesible para otros miembros del equipo. Open-WebUI cierra esa brecha: una interfaz web completa que se conecta a Ollama (o cualquier proveedor compatible con OpenAI) y convierte un servidor de inferencia en una herramienta colaborativa.

El repositorio supera las 155 000 estrellas en GitHub. Cuidado con la licencia: no es MIT. El proyecto publica una licencia propia, de tipo BSD de tres cláusulas, con una condición añadida: por encima de 50 usuarios en 30 días móviles, está prohibido modificar o retirar la marca « Open WebUI », salvo permiso escrito o licencia empresarial. Para un equipo pequeño nada cambia; más allá, lee el archivo LICENSE antes de personalizar la interfaz. Por su parte, Ollama anunció en julio de 2026 una ronda Serie B de 65 millones de dólares, señal de que el motor de inferencia se instala a largo plazo en los equipos de desarrollo.

El proyecto se mantiene de forma continua y publica etiquetas estables a buen ritmo: la versión 0.12.4 es del 25 de octubre de 2026. Ese ritmo tiene un reverso, porque los comportamientos por defecto cambian de una versión menor a otra (la llamada nativa a herramientas pasó a ser la opción por defecto en la 0.10.0). De ahí el interés de fijar una etiqueta y leer las notas de versión antes de cada actualización. Open-WebUI cubre necesidades que van mucho más allá del chat: RAG sobre archivos locales, gestión de múltiples modelos, grupos de usuarios, búsqueda web e integración SSO mediante OpenID Connect.

Lo que Open-WebUI aporta concretamente a tu stack Ollama

  • Interfaz multiusuario: cada miembro del equipo tiene su cuenta, historial y conversaciones — sin acceso a la API bruta ni a la línea de comandos.
  • RAG nativo: importa archivos PDF, Markdown o Word directamente desde la interfaz; Open-WebUI los indexa y los inyecta en el contexto de cada conversación.
  • Gestión de modelos: descarga, elimina y activa modelos de Ollama desde la interfaz web, sin pasar por docker exec.
  • SSO con OpenID Connect: conecta Open-WebUI a tu proveedor de identidad (Keycloak, Authentik, Google Workspace…) para acceso unificado y revocación centralizada.
  • Grupos y roles: define quién accede a qué modelos, quién puede subir archivos, quién tiene derechos de administración.
  • Sin dependencia de la nube: todos los tokens, conversaciones y archivos permanecen en tu infraestructura.

Requisitos de hardware y software

Open-WebUI se ejecuta en un contenedor Docker y se conecta a Ollama a través de la red Docker interna. Ambos pueden coexistir en el mismo VPS.

Para un equipo de 5 a 10 personas con modelos 7B cuantizados (Q4), planifica como mínimo:

- 8 GB de RAM (6 GB para el modelo + margen para Open-WebUI y el sistema)
- 4 vCPU: la inferencia en CPU es lenta con menos núcleos; pasa a 8 vCPU para un uso diario cómodo
- 30 GB de almacenamiento SSD mínimo, más espacio para tus modelos (un modelo 7B Q4 ≈ 4,5 GB, un modelo 13B ≈ 8 GB)
- Docker y Docker Compose instalados
- Un nombre de dominio apuntando a tu VPS (necesario para TLS y SSO)
- Un proxy inverso con HTTPS — Nginx, Traefik o Caddy (servido en HTTP sobre un dominio o una IP no locales, Open-WebUI pierde funciones en el navegador: ver la solución de problemas)

Desplegar Open-WebUI y Ollama con Docker Compose

  1. Crear el archivo Docker Compose

    Crea un directorio de trabajo y escribe el archivo de composición:

    mkdir -p /opt/openwebui && cd /opt/openwebui

    Contenido de compose.yml:

    services:
      ollama:
        image: ollama/ollama:latest
        container_name: ollama
        volumes:
          - ollama_data:/root/.ollama
        restart: unless-stopped
    
      open-webui:
        image: ghcr.io/open-webui/open-webui:main
        container_name: open-webui
        depends_on:
          - ollama
        ports:
          - "127.0.0.1:3000:8080"
        environment:
          - OLLAMA_BASE_URL=http://ollama:11434
          - WEBUI_SECRET_KEY=cambia-esto-por-una-cadena-aleatoria
        volumes:
          - open_webui_data:/app/backend/data
        restart: unless-stopped
    
    volumes:
      ollama_data:
      open_webui_data:

    La clave WEBUI_SECRET_KEY debe ser una cadena aleatoria larga: genera una con openssl rand -hex 32.

  2. Iniciar el stack

    Lanza los dos servicios:

    docker compose up -d

    Verifica que ambos contenedores estén activos:

    docker compose ps
  3. Descargar un primer modelo

    Desde el host, descarga un modelo mediante Ollama:

    docker exec -it ollama ollama pull llama3.1:8b

    También puedes hacerlo desde la interfaz Open-WebUI una vez conectado, en Panel de administración → Modelos → Descargar desde Ollama.com.

  4. Configurar el proxy inverso Nginx con HTTPS

    Open-WebUI escucha en 127.0.0.1:3000. Crea un virtual host en Nginx para exponerlo en HTTPS:

    server {
        listen 443 ssl;
        server_name openwebui.yourdomain.com;
    
        ssl_certificate /etc/letsencrypt/live/openwebui.yourdomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/openwebui.yourdomain.com/privkey.pem;
    
        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 300s;
        }
    }

    Obtén el certificado con Certbot:

    certbot --nginx -d openwebui.yourdomain.com
  5. Crear la cuenta de administrador

    Abre https://openwebui.yourdomain.com en tu navegador. La primera cuenta creada se convierte automáticamente en administrador. Introduce un correo y una contraseña.

Configurar el SSO con OpenID Connect

Open-WebUI admite de forma nativa la autenticación mediante OpenID Connect (OIDC). Puedes integrarlo con Keycloak, Authentik, Authelia o cualquier proveedor compatible (incluido Google Workspace o Microsoft Entra).

En compose.yml, añade las siguientes variables de entorno al servicio open-webui:

environment:
  - OAUTH_CLIENT_ID=tu-client-id
  - OAUTH_CLIENT_SECRET=tu-client-secret
  - OPENID_PROVIDER_URL=https://tu-idp.example.com/.well-known/openid-configuration
  - OAUTH_PROVIDER_NAME=Mi SSO
  - ENABLE_OAUTH_SIGNUP=true

La URL de callback que debes declarar en tu proveedor de identidad es https://openwebui.yourdomain.com/oauth/oidc/callback.

Reinicia el stack tras la modificación:

docker compose up -d

Para restringir el acceso SSO a un dominio de correo específico (p. ej. @tu-empresa.com), configura la restricción directamente en tu proveedor de identidad, no en Open-WebUI. Keycloak y Authentik permiten filtrar por dominio a nivel del cliente OIDC — es el punto de control más seguro, ya que también cubre la API.

Activar el RAG sobre tus documentos

Open-WebUI integra un pipeline RAG (Generación Aumentada por Recuperación) que permite consultar tus documentos locales en una conversación. El procesamiento se realiza completamente en tu VPS — ningún documento se envía a un servicio externo.

Para activar el RAG:

1. Desde la interfaz, haz clic en el clip en la zona de entrada de una conversación, o usa la pestaña Documentos en el menú lateral.
2. Importa un archivo PDF, Markdown, DOCX o TXT. Open-WebUI lo trocea, vectoriza y almacena en su base de datos local.
3. En la conversación, prefija tu mensaje con # seguido del nombre del documento para inyectarlo como contexto.

Añadir la búsqueda web con SearXNG

La búsqueda web no viene integrada en Open-WebUI: la interfaz consulta un motor externo y luego inyecta las páginas encontradas en el contexto del modelo. SearXNG, un metabuscador autoalojado, evita depender de una clave de API de pago: consulta por ti varios motores públicos y devuelve una lista única. Ahí está también su fragilidad, detallada en la sección de solución de problemas más abajo.

Bastan tres ajustes. En SearXNG, abre settings.yml y añade json a la lista formats situada bajo search, junto a html: sin eso, Open-WebUI recibe un error 403. En Open-WebUI, abre Panel de administración → Ajustes → Búsqueda web, elige searxng e introduce la URL de consulta, por ejemplo http://searxng:8080/search?q=<query> (variable SEARXNG_QUERY_URL). También puedes definir ENABLE_WEB_SEARCH=true y WEB_SEARCH_ENGINE=searxng en el compose.yml. Si los dos servicios comparten una red Docker, el nombre del servicio sirve de host y el puerto de SearXNG no hace falta publicarlo en Internet.

Queda una trampa: tres interruptores deben estar activados a la vez, la búsqueda web global, la capacidad « búsqueda web » del modelo y el botón de la conversación en curso. Un solo olvido da una respuesta sin búsqueda, a menudo sin error visible.

Open-WebUI, AnythingLLM, LibreChat: qué interfaz elegir

Desplace la tabla

CriterioOpen-WebUIAnythingLLM / LibreChat
Backend LLMOllama nativo + cualquier endpoint OpenAIOpenAI, Ollama, Azure, LM Studio
Gestión de usuariosIntegrada, grupos, OIDC nativoIntegrada (AnythingLLM: espacios aislados)
RAGNativo, sin configuraciónNativo, configurable (LanceDB, pgvector)
Estrellas GitHub155 000+ (licencia propia, marca protegida)65 000+ (MIT) / 45 000+ (MIT)
Caso de uso principalEquipo con Ollama ya desplegadoRAG multi-fuente avanzado / chat multi-backend

Solución de problemas: errores comunes

Connection refused al iniciar Open-WebUI.
Ollama aún no está listo cuando Open-WebUI intenta conectarse. Espera 20 segundos y ejecuta docker compose restart open-webui.

El streaming se interrumpe tras 60 segundos.
Tu proxy inverso aplica un timeout HTTP por defecto. Añade proxy_read_timeout 300s; en el bloque Nginx location /.

WebSocket connection failed.
Verifica que las cabeceras Upgrade y Connection se transmitan correctamente por el proxy inverso.

La autenticación SSO devuelve redirect_uri_mismatch.
La URL de callback declarada en tu proveedor de identidad no coincide con la que envía Open-WebUI. Debe ser exactamente https://openwebui.yourdomain.com/oauth/oidc/callback.

Un usuario SSO puede iniciar sesión pero no tiene acceso a ningún modelo.
DEFAULT_USER_ROLE vale pending por defecto: toda cuenta nueva, SSO incluido, espera a que un administrador la active, y ENABLE_OAUTH_SIGNUP solo gobierna la creación de la cuenta. Cambia su rol a user en Panel de administración → Usuarios, o establece DEFAULT_USER_ROLE=user en las variables de entorno.

Pantalla que no responde, crypto.randomUUID is not a function en la consola del navegador.
Open-WebUI se sirve en HTTP sobre un dominio o una dirección no locales: el navegador solo ofrece esta función en un contexto seguro (HTTPS o localhost). Termina la configuración TLS del proxy inverso antes de probar las funciones de IA.

La búsqueda web no devuelve nada.
Consulta la sección dedicada más abajo: prueba SearXNG por separado antes de culpar a Open-WebUI.

Solución de problemas: la búsqueda web no devuelve nada

Síntoma. La búsqueda web está activada, pero la conversación muestra No results found from web search (un error 404 en el registro de Open-WebUI), o el modelo responde sin haber buscado.

Qué dice ese mensaje. Open-WebUI sí llegó a SearXNG, le envió la consulta y recibió una lista vacía. Un caso público lo ilustra (issue open-webui #32401, abierta el 14 de octubre de 2026 tras pasar a la 0.12.0): el autor sospechaba de la nueva versión, el equipo de mantenimiento culpó primero al modelo y luego, con el registro de SearXNG en mano, comprobó que DuckDuckGo respondía con un CAPTCHA, Brave con « Too many requests » (motor suspendido 3 minutos cada vez) y Startpage con una redirección a su CAPTCHA. Todos los motores bloqueados, es decir, cero resultados. Según el mantenimiento, esos sitios bloqueaban la dirección IP con independencia de la actualización. La issue se cerró ese mismo día sin corrección del lado de Open-WebUI, y el autor acabó eligiendo el proveedor DDGS.

El método que conviene recordar: antes de culpar a la versión o al modelo, consulta SearXNG por separado.

Diagnosticar una búsqueda web vacía

  1. Consultar SearXNG sin Open-WebUI

    Desde el VPS, ejecuta curl -s 'http://127.0.0.1:8080/search?q=test&format=json' adaptando host y puerto a tu instalación (si SearXNG solo es accesible por la red Docker, ejecuta el comando desde un contenedor de esa red). Tres resultados posibles: un error 403 significa que falta json en formats; una lista results vacía significa que los motores fallan; una lista con resultados significa que SearXNG funciona y que el problema está en Open-WebUI o en el modelo (ver el recuadro más abajo).

  2. Leer el registro de SearXNG

    docker compose logs --tail 200 searxng muestra lo que respondió cada motor. Busca las líneas que nombran un motor (duckduckgo, brave, startpage…) con un CAPTCHA, un rechazo por exceso de peticiones o un tiempo agotado. Un motor que reaparece en cada búsqueda con el mismo error está bloqueado para la dirección IP de tu VPS, algo que ocurre con más facilidad en una dirección de centro de datos.

  3. Activar o sustituir motores

    En settings.yml, sección engines, activa motores generalistas que no estén bloqueados: el mantenimiento de Open-WebUI cita Google, Bing, Mojeek y Qwant. Una entrada name: mojeek con disabled: false activa un motor presente en los ajustes por defecto; con use_default_settings: true al principio del archivo, solo listas tus diferencias. Reinicia con docker compose restart searxng y repite el paso 1 hasta obtener resultados. Activa varios motores: uno solo vuelve enseguida a quedar bloqueado.

  4. Usar un proveedor con clave si la IP sigue bloqueada

    Si todos los motores fallan, un proveedor por API evita el problema: Brave Search API, Tavily o Serper se eligen en la misma pantalla de administración. Para el plan gratuito de Brave, define WEB_SEARCH_CONCURRENT_REQUESTS=1. El proveedor DDGS, que eligió el autor de la issue, no requiere clave.

¿SearXNG devuelve resultados pero el asistente nunca busca? Desde la versión 0.10.0 (finales de junio de 2026), la llamada nativa a herramientas es el modo por defecto: la búsqueda web pasa a ser una herramienta que el modelo debe invocar por sí mismo, y un modelo antiguo o pequeño la omite o escribe una llamada mal formada. Elige un modelo reciente que gestione herramientas y comprueba que Function Calling esté en Native en los parámetros avanzados del modelo; el mantenimiento describe el modo Legacy como no soportado. Si la búsqueda funciona pero las páginas no se cargan, revisa WEB_SEARCH_TRUST_ENV detrás de un proxy HTTP y luego USER_AGENT.

Seguir el uso de una instancia de equipo

Saber quién consume qué se convierte pronto en una cuestión de presupuesto cuando los desarrolladores llaman a la instancia por la API. Hoy, cuatro fuentes se complementan, cada una con un punto ciego:

Las cuatro fuentes de medida

  • El panel Analytics (ajustes de administración, sección Analytics): mensajes, tokens de entrada y de salida, por modelo y por usuario, con filtro por grupo y por periodo; desde la 0.12.4, la clasificación es por tokens. Se calcula a partir del historial de mensajes guardado en la base de datos: lo que no se guarda ahí no aparece. ENABLE_ADMIN_ANALYTICS=False lo oculta.
  • La vista personal (ajustes, pestaña Usage, desde la 0.11.0 de julio de 2026): cada usuario ve su propia actividad, y nada de la de los demás.
  • El registro de auditoría: desactivado por defecto (AUDIT_LOG_LEVEL=NONE). Con AUDIT_LOG_LEVEL=METADATA, Open-WebUI escribe audit.log en su directorio de datos (rotación a 10 MB) para las peticiones autenticadas por cabecera Authorization o por cookie: las llamadas de API aparecen, por tanto, con el modelo solicitado. Para obtener también los tokens de cada respuesta (desde la 0.12.4), quita /chat de AUDIT_EXCLUDED_PATHS, que por defecto vale /chats,/chat,/folders. Evita los niveles REQUEST y REQUEST_RESPONSE, que registran el contenido de las conversaciones, y repite una llamada de prueba para leer la entrada generada antes de construir un recuento sobre ella.
  • Los registros del proxy inverso: el ángulo más simple para el volumen. Con el formato combined de Nginx, awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head clasifica las rutas más llamadas; añade $request_time a tu log_format para detectar peticiones lentas. Este registro no ve ni al usuario ni los tokens, y la cabecera Authorization nunca debe quedar registrada en él.

Lo que el seguimiento de uso aún no hace

La petición de un seguimiento que separe la interfaz de la API y atribuya las llamadas a cada clave está abierta en el repositorio del proyecto: issue open-webui #21675, « enh: analytics », creada el 20 de febrero de 2026 y todavía abierta el 28 de octubre de 2026, con un centenar de comentarios. El hilo cuenta que un usuario de API colocado en un grupo no aparece en Analytics, y el 14 de octubre un equipo cuyos desarrolladores usan sobre todo la API seguía pidiendo esa visibilidad. No se anuncia ninguna fecha: no planifiques nada sobre esta función.

El mantenimiento responde que un filtro, es decir, una función Python instalada en la interfaz, puede contar las peticiones, incluidas las de la API; un colaborador precisa que las rutas en passthrough se le escapan. Sitúa los límites por usuario o por grupo en la limitación de tasa, fuera del tema Analytics. Leer directamente la base SQLite webui.db sigue siendo posible sobre una copia, pero su esquema no es un contrato y cambia de una versión a otra. Un colaborador también ha publicado un plugin de cuotas de terceros: una función se ejecuta con los derechos del servidor, así que revisa su código antes de activarla.

Da a cada desarrollador su cuenta y su propia clave de API en lugar de una clave compartida: sin una identidad distinta, ninguna de las cuatro fuentes puede atribuir el uso. Si la API pasa a ser el canal principal, una pasarela delante de Ollama que cuente las llamadas en origen (LiteLLM, ya en el catálogo de ServOrbit, ofrece claves virtuales y seguimiento del gasto) es una pista que conviene probar antes de adoptarla.

Asegurar el acceso a la API de Ollama

Por defecto, Ollama escucha en 0.0.0.0:11434 dentro de su contenedor. La configuración compose.yml propuesta arriba no publica este puerto en el host — solo Open-WebUI accede a él a través de la red Docker interna. Esta es la postura correcta.

Si necesitas acceder a la API de Ollama directamente (desde un IDE, un notebook Jupyter o una aplicación externa):

1. Túnel SSH: ssh -L 11434:localhost:11434 user@tu-vps — la API es accesible localmente sin exposición pública.
2. Proxy inverso con autenticación: expón Ollama detrás de Nginx con auth_basic o un token Bearer.

Nunca publiques el puerto 11434 directamente en la interfaz pública sin autenticación: la API de Ollama no tiene protección nativa contra accesos no autorizados.

Para mantener Open-WebUI actualizado, cambia la imagen de ghcr.io/open-webui/open-webui:main a ghcr.io/open-webui/open-webui:v0.12.4 (o la última etiqueta estable) en tu compose.yml. La etiqueta :main sigue el desarrollo continuo — útil para probar nuevas funciones, menos predecible en producción. Consulta las notas de la versión en GitHub antes de cada actualización: algunas versiones han introducido migraciones de base de datos, otras cambian comportamientos por defecto (la llamada nativa a herramientas en la 0.10.0), y las notas de la 0.12.0 recomiendan actualizar pronto los despliegues de producción por sus correcciones de seguridad.

Funciones avanzadas para explorar tras el despliegue

  • Pipelines y funciones: Open-WebUI permite escribir funciones Python que se intercalan en el flujo de conversación — filtros, enriquecedores de contexto, conectores a APIs externas.
  • Modelos personalizados: crea 'modelos' preconfigurados (instrucciones de sistema, temperatura, contexto) y compártelos con grupos de usuarios específicos.
  • Generación de imágenes: conecta Open-WebUI a una instancia local de Stable Diffusion o ComfyUI para generar imágenes directamente en el chat.
  • Integración con herramientas externas: mediante el protocolo MCP (Model Context Protocol), Open-WebUI puede llamar a herramientas externas — bases de datos, APIs REST, búsqueda web.

Documentación oficial

Para la configuración avanzada y las opciones propias de la herramienta, consulta la documentación oficial de Open-WebUI. Esta guía cubre el despliegue básico y las configuraciones más habituales — los parámetros específicos de tu entorno (integración LDAP, configuración de pipelines, ajuste de embeddings) se encuentran en la documentación del proyecto.

Un VPS listo para Open-WebUI y Ollama

Open-WebUI con Ollama requiere un VPS con acceso root, Docker y suficiente RAM para cargar tus modelos. El VPS Cloud de ServOrbit ofrece la escalabilidad vertical necesaria para pasar de un modelo 7B a uno 13B sin migración.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva