Tu propio ChatGPT, con todos los modelos de NaN, corriendo en tu equipo y montado en 2 minutos.
Version actual: v0.0.9. Cambios: CHANGELOG.md.
Una interfaz web tipo ChatGPT (Open WebUI) ya conectada a la API de NaN. Self-hosted, en Docker, con tu propia API key. Tus chats y tus cuentas se quedan en tu máquina.
¿No has usado Docker nunca? Sigue la guia paso a paso, a prueba de errores y no te equivocaras. Si te atascas, hasta puedes pedirle a un asistente de IA (como OpenCode con un modelo de NaN, p. ej.
mimo-v2.5) que te lo monte: le abres dentro de la carpeta y le dices "levanta esta imagen Docker siguiendo el README".
- Un único frontend para todo NaN. Chat, visión, audio y embeddings de todos los modelos de NaN desde la misma interfaz, sin saltar de herramienta.
- Tus datos, tu casa. Las conversaciones, usuarios y ajustes viven en tu Docker, no en la nube de un tercero. La API key es tuya y solo sale hacia NaN.
- Coste predecible. Pagas tu inferencia en NaN y punto: la interfaz es gratuita y open source, sin capas de suscripción por encima.
- Listo para equipos. Levanta un servidor para tu equipo o comunidad: cada persona con su cuenta, tú administras quién entra (ver Multiusuario).
- Sin lock-in. Es compatible con la API de OpenAI; si mañana cambias de proveedor, cambias una URL.
En una frase: la experiencia ChatGPT, con el catálogo de NaN, bajo tu control.
- Open WebUI (la UI self-hosted de referencia) preconfigurada para NaN, publicada
como imagen Docker lista para usar (
ghcr.io/686f6c61/nan-open-webui, sin ningún secreto dentro). - Modelos de NaN disponibles desde el selector:
qwen3.6,deepseek-v4-flash,mimo-v2.5,gemma4(chat / visión / razonamiento / coding),whisper(audio -> texto),kokoro(texto -> voz),qwen3-embedding(embeddings) yflux-2-klein(generación / edición de imágenes). - Capacidades: chat con historial, visión (subir imágenes a los modelos
multimodales), búsqueda web (incluye SearXNG autoalojado, sin API key: el modelo
busca en internet y responde con fuentes), voz (lee las respuestas con
kokorode NaN y dicta con un whisper local), intérprete de código (el modelo escribe y ejecuta Python en el navegador), RAG sobre tus documentos (embeddings conqwen3-embedding), generación y edición de imágenes conflux-2-klein, multiusuario con control de acceso, y persistencia. - Despliegue en un comando con Docker Compose.
- API key segura por diseño: solo vive en tu
.env, nunca en la imagen ni en el repo.
- Docker y Docker Compose.
- Una API key de NaN -> https://nan.builders
# 0) Descarga el proyecto desde GitHub
git clone https://github.com/686f6c61/NaN-Open-WebUI.git
cd NaN-Open-WebUI
# 1) Crea tu .env (genera tambien los secretos locales)
./setup.sh
# 2) Edita .env y pon tu API key en NAN_API_KEY
nano .env
# 3) Arranca
docker compose up -dAbre http://localhost:3000. La primera cuenta que crees sera la de administrador.
Windows/Mac sin
./setup.sh: copia.env.examplea.env, pon tuNAN_API_KEYy generaWEBUI_SECRET_KEYySEARXNG_SECRETconopenssl rand -hex 32. Luegodocker compose up -d.
La imagen publicada en GHCR ya trae la preconfiguración de NaN (modelos, imágenes,
voz, RAG apuntando a https://api.nan.builders/v1), así que solo necesitas inyectar
tu key y los secretos en runtime:
docker run -d --name nan-open-webui -p 127.0.0.1:3000:8080 \
-e OPENAI_API_KEY=sk-tu-key-de-nan \
-e WEBUI_SECRET_KEY=$(openssl rand -hex 32) \
-e ENABLE_WEB_SEARCH=false \
-v nan-open-webui-data:/app/backend/data \
ghcr.io/686f6c61/nan-open-webui:v0.0.9Imagen: ghcr.io/686f6c61/nan-open-webui (tags vX.Y.Z y latest).
Nota: este modo de un solo contenedor no incluye la búsqueda web (que necesita el servicio SearXNG), por eso se desactiva. Para tener búsqueda web, usa el
docker compose up -dde arriba.
Open WebUI es multiusuario con roles (admin / user / pending). El flujo recomendado para un equipo o comunidad con este paquete:
- Tú creas la primera cuenta (esa es la de administrador).
- Los demás se registran solos: con
DEFAULT_USER_ROLE=pending(por defecto), cada registro queda en espera hasta que tú lo apruebes desde Panel de administración > Users. Si prefieres que entren sin aprobación, ponDEFAULT_USER_ROLE=useren el.env. - Cuando el censo esté cerrado, pon
ENABLE_SIGNUP=falseen el.envydocker compose up -d. - Modelos por grupo (opcional):
BYPASS_MODEL_ACCESS_CONTROL=false(por defecto) respeta el control de acceso; desde el panel puedes reservar modelos concretos a grupos concretos. Contrue, todos ven todos los modelos siempre.
Importante: con una única
NAN_API_KEYcompartida, el consumo de todos los usuarios (chat, imágenes, voz) sale de tu cuenta de NaN: cuota y facturación son agregadas y no se puede atribuir por persona. Para una comunidad grande valora que cada usuario ponga su propia key en Ajustes > Conexiones (el admin debe permitirlo), quedando la tuya solo como conexión por defecto.
Para exponerlo en internet con HTTPS, backups y actualizaciones controladas, sigue PRODUCCION.md.
| Variable | Obligatoria | Por defecto | Descripcion |
|---|---|---|---|
NAN_API_KEY |
Si | — | Tu API key de NaN |
WEBUI_SECRET_KEY |
Recomendado | (se genera) | Firma las sesiones de la web |
SEARXNG_SECRET |
Si | (se genera) | Secreto local de SearXNG para la busqueda web |
OPENWEBUI_IMAGE |
No | ghcr.io/686f6c61/nan-open-webui:v0.0.9 |
Imagen y tag a usar; sube el tag para actualizar |
WEBUI_BIND |
No | 127.0.0.1 |
Interfaz donde se publica; 0.0.0.0 para red local |
WEBUI_PORT |
No | 3000 |
Puerto local de la interfaz |
WEBUI_NAME |
No | NaN Chat |
Nombre mostrado en la UI |
ENABLE_SIGNUP |
No | true |
Permitir nuevos registros (ponlo false al cerrar el censo) |
DEFAULT_USER_ROLE |
No | pending |
Rol de los registros nuevos: pending (aprobación) o user |
BYPASS_MODEL_ACCESS_CONTROL |
No | false |
false respeta el control de modelos por grupo |
ENABLE_PERSISTENT_CONFIG |
No | true |
Ver Configuracion persistente |
WEBUI_URL |
No | — | URL pública (producción con dominio) |
CORS_ALLOW_ORIGIN |
No | * |
Orígenes CORS permitidos, ; para separar |
OPENAI_API_BASE_URL |
No | https://api.nan.builders/v1 |
Endpoint OpenAI-compatible |
OPENAI_API_CONFIGS |
No | (en .env.example) |
Modelos de chat visibles en el selector |
DEFAULT_MODEL_PARAMS |
No | {"function_calling":"legacy"} |
Fuerza herramientas legacy para que Image funcione con modelos sin tool calling nativo declarado |
ENABLE_IMAGE_GENERATION |
No | true |
Activar generación de imágenes |
ENABLE_IMAGE_PROMPT_GENERATION |
No | false |
Evita reescribir el prompt con el modelo de chat antes de llamar a flux-2-klein |
ENABLE_IMAGE_EDIT |
No | true |
Activar edición / image-to-image |
IMAGE_GENERATION_MODEL |
No | flux-2-klein |
Modelo de imágenes de NaN |
IMAGE_SIZE |
No | 1024x1024 |
Tamaño por defecto; múltiplos de 16, 256-1536 px y ratio 1:3-3:1 |
IMAGES_OPENAI_PARAMS |
No | — | JSON opcional para generación, por ejemplo {"seed":42,"guidance":3.5} |
Tras crear tu cuenta admin, si no quieres mas registros pon ENABLE_SIGNUP=false y
docker compose up -d.
Open WebUI guarda su configuración en su base de datos interna: lo que cambies en el
panel de administración manda sobre el .env en los siguientes reinicios. Esto
afecta a cosas como la API key de las conexiones, los modelos visibles o el registro.
- Para cambiar la API key después del primer arranque: hazlo en el panel
(Admin > Settings > Connections) y, para mantener el
.envsincronizado, también enNAN_API_KEY(así un despliegue desde cero queda idéntico). - Si prefieres que el
.envsea siempre la fuente de verdad (útil en despliegues gestionados), ponENABLE_PERSISTENT_CONFIG=false: los cambios hechos en el panel se perderán al reiniciar.
- La key vive solo en tu
.envlocal. No esta en la imagen Docker, ni en eldocker-compose.yml, ni en el repositorio. - La imagen publicada en GHCR es pública y no contiene ningún secreto: solo valores no sensibles (URLs de NaN, nombres de modelo, interruptores).
- Los secretos internos (
WEBUI_SECRET_KEYySEARXNG_SECRET) tambien se generan en.env; el repo no comparte valores reales entre instalaciones. - El
.gitignorey el.dockerignoreexcluyen.env: no lo subes a git por error ni entra en el contexto de build. - Si arrancas sin key, Compose se detiene con un aviso claro en vez de arrancar mal.
- Por defecto la web solo escucha en
127.0.0.1(tu equipo). ConWEBUI_BIND=0.0.0.0la compartes en tu red local, bajo tu responsabilidad. - No compartas tu
.env. Para pasarle esto a otra persona, dale el proyecto sin el.env(o solo el.env.example); que cada uno ponga la suya. - Si tu key se filtra, revocala/rotala en NaN, actualiza el
.envy el panel de administración (ver Configuracion persistente).
docker compose up -d # arrancar / aplicar cambios del .env
docker compose logs -f # ver logs
docker compose down # parar (conserva los datos)
docker compose pull && docker compose up -d # actualizar (SearXNG; ver nota)La imagen de Open WebUI va fijada por tag (
OPENWEBUI_IMAGE): actualizar es una decision deliberada. Para subir de version: cambia el tag en el.env(p. ej. av0.0.9), haz un backup si tienes datos importantes, ydocker compose up -d. SearXNG sí se actualiza solo (latest): es un servicio sin estado que no guarda tus datos. Los datos (cuentas, chats, ajustes) persisten en el volumennan-open-webui-data.
En un chat, pulsa el boton Integrations junto a la caja de texto y activa Image
(icono de foto). Escribe el prompt y envia. No selecciones flux-2-klein en el selector
superior de modelos: el selector superior es para chat; la integracion Image usa
flux-2-klein por debajo. Que arriba siga seleccionado qwen3.6 es normal.
- No aparece ningun modelo -> la
NAN_API_KEYes incorrecta o vacia. Verificala:curl https://api.nan.builders/v1/models -H "Authorization: Bearer TU_KEY" - El puerto 3000 esta ocupado -> cambia
WEBUI_PORTen.envydocker compose up -d. - "Falta NAN_API_KEY" al arrancar -> ejecuta
./setup.shy rellena el.env. - Una imagen da "no soporta imagenes" -> selecciona un modelo de vision
(
qwen3.6,gemma4,mimo-v2.5), no uno de solo texto comodeepseek-v4-flash. - Pides una foto y responde texto / no adjunta imagen -> no esta activa la
integracion Image o el chat esta en tool calling nativo. Activa Integrations >
Image y deja
DEFAULT_MODEL_PARAMS={"function_calling":"legacy"}. - No puedo entrar desde otro equipo de mi red -> por defecto la web solo escucha en
127.0.0.1. PonWEBUI_BIND=0.0.0.0en el.envpara compartirla en tu red local. - Generar/editar imagenes falla -> comprueba que tu cuenta de NaN tiene membresia
inference-tier, que no has agotado la cuota deflux-2-klein(100 requests/mes), que no estas disparando mas de 1 request/s, y queIMAGE_SIZEusa valores soportados (256-1536 px, múltiplos de 16 y ratio 1:3-3:1). docker compose upse queda esperando a SearXNG -> el contenedornan-searxngdebe quedarhealthy; revisadocker compose logs searxng.
- Por defecto la web escucha en
127.0.0.1:WEBUI_PORT, solo accesible desde tu equipo. Para tu red local:WEBUI_BIND=0.0.0.0. Para internet: proxy inverso con HTTPS, ver PRODUCCION.md. - Compatible con cualquier endpoint estilo OpenAI: cambia
OPENAI_API_BASE_URLpara usar otro proveedor.
Hecho para la comunidad de NaN. Open WebUI es un proyecto open source independiente; NaN es el proveedor de inferencia. Cada usuario aporta su propia API key.
