El chat de tu equipo con los agentes de IA como miembros y el conocimiento de la empresa dentro.
10K+
El chat de tu equipo donde los agentes de IA son miembros, no un chatbot aparte. Con el conocimiento de la empresa dentro, permisos por colección, y tareas que se siguen solas.
Un contenedor: app, Postgres, worker y servicio de grafo. Multi-arquitectura
(linux/amd64 y linux/arm64), así que el mismo comando sirve en un servidor
Linux, en un Mac con Apple Silicon y en Windows con Docker Desktop.
docker pull neogeeks/geekindex:latest
Lo mínimo que funciona, para probarlo en tu máquina:
docker run -d --name brain \
-p 3000:3000 \
-v brain-datos:/data \
-e SITE_URL=http://localhost:3000 \
-e GEEKINDEX_PUBLIC_URL=http://localhost:3000 \
neogeeks/geekindex:latest
Abre http://localhost:3000 y el asistente de instalación te pide el primer
administrador. Los secretos se generan solos en el primer arranque y se
guardan en el volumen: no hay que inventarse SESSION_SECRET ni JWT_SECRET.
Tarda unos segundos la primera vez (crea la base y aplica migraciones). Para ver
qué hace: docker logs -f brain.
Para crear ese primer administrador hace falta un código de un solo uso que la instancia imprime en su log:
docker logs brain 2>&1 | grep -A6 "CÓDIGO DE RECLAMACIÓN"
También queda en /data/reclamacion-admin.txt dentro del volumen, con permisos
600.
Para qué sirve. Una instalación nueva arranca funcionando y sin administrador, así que la pantalla que crea el primero tiene que ser pública — todavía no hay nadie a quien pedirle permiso. Sin código, entre que arranca el contenedor y tú abres el asistente, cualquiera que llegue a esa dirección se queda como administrador de la instalación entera. El código solo se puede leer desde el anfitrión, que es donde tú ya eres dueño de todo.
Si lo pierdes, se emite otro: borra la fila reclamacion_admin de
app_settings y recarga /setup. Con GEEKINDEX_ADMIN_EMAIL y
GEEKINDEX_ADMIN_PASSWORD no hace falta código — el administrador ya existe
antes de que nadie abra el asistente.
docker run -d --name brain --restart unless-stopped \
-p 3000:3000 \
-v brain-datos:/data \
-e GEEKINDEX_DOMAIN=brain.tuempresa.com \
-e GEEKINDEX_PUBLIC_URL=https://brain.tuempresa.com \
-e SITE_URL=https://brain.tuempresa.com \
-e GEEKINDEX_TZ=America/Panama \
neogeeks/geekindex:latest
GEEKINDEX_DOMAIN decide además si la cookie de sesión va como Secure, así
que ponlo cuando haya HTTPS delante (un proxy inverso: Caddy, nginx,
Cloudflare Tunnel).
Funciona igual —Docker baja la imagen amd64 sola—, con dos diferencias:
-v brain-datos:/data), no una carpeta de
C:\. El traductor de rutas cambia los permisos de los ficheros del corpus.--network host no existe en Docker Desktop. Si además vas a instalar el
conector de un agente en esa máquina, la URL de despertar tiene que ser
http://host.docker.internal:PUERTO./data contiene la base de datos, el corpus (los .md de las colecciones),
los originales subidos y los secretos. Respaldar eso es respaldar Brain.
Brain sabe cuándo hay una versión nueva y no puede bajarla solo: un contenedor no se reemplaza a sí mismo. Hace falta alguien fuera, y ese alguien es Watchtower. Sin esto, el botón «Actualizar ahora» de la pantalla de configuración existe y no hace nada — y eso se descubre el día que hace falta.
Dos cosas que hay que saber antes:
neogeeks/geekindex:0.17.76 clavado, ese tag no
cambia nunca y no hay nada que actualizar. Usa :latest.docker-compose.yml:
services:
brain:
image: neogeeks/geekindex:latest # sin número: tiene que moverse
restart: unless-stopped
ports: ["3000:3000"]
volumes: ["brain-datos:/data"]
environment:
GEEKINDEX_DOMAIN: brain.tuempresa.com
GEEKINDEX_PUBLIC_URL: https://brain.tuempresa.com
SITE_URL: https://brain.tuempresa.com
GEEKINDEX_TZ: America/Panama
labels:
# Watchtower solo toca lo que lleva esta etiqueta. Sin esto actualizaría
# TODOS los contenedores del host, incluidos los que no son tuyos.
- "com.centurylinklabs.watchtower.enable=true"
watchtower:
image: containrrr/watchtower
restart: unless-stopped
volumes: ["/var/run/docker.sock:/var/run/docker.sock"]
environment:
# Solo API: no vigila por su cuenta, espera a que Brain se lo pida.
WATCHTOWER_HTTP_API_UPDATE: "true"
WATCHTOWER_HTTP_API_TOKEN: "${WATCHTOWER_TOKEN:?define WATCHTOWER_TOKEN}"
WATCHTOWER_LABEL_ENABLE: "true"
# Borra la imagen vieja. Sin esto el disco crece con cada versión hasta
# que un día la base no arranca por falta de espacio.
WATCHTOWER_CLEANUP: "true"
# El puerto NO se publica: Brain lo alcanza por la red interna del compose.
# Publicarlo sería exponer «recrea mis contenedores» a la LAN.
volumes:
brain-datos:
En tu .env, al lado del compose:
WATCHTOWER_TOKEN=<openssl rand -hex 32>
Ese token permite recrear contenedores en ese servidor: trátalo como una contraseña de administración.
Y decírselo a Brain: Configuración → la tarjeta de versión → configurar el actualizador
http://watchtower:8080/v1/updateWATCHTOWER_TOKENDesde ahí, «Actualizar ahora» funciona y la casilla de actualización automática
también. Quién puede aplicarla es una persona concreta, no cualquier admin:
por defecto el administrador fundador, y se cambia por ajuste o con
GEEKINDEX_ACTUALIZA_EMAIL. Reiniciar el contenedor tira las sesiones de quien
esté dentro y corre migraciones — la decisión de cuándo es de quien responde
por esa instalación.
Brain funciona sin modelo: el chat entre personas, las colecciones, los permisos y los canales van igual. Lo que no funciona sin modelo es todo lo que piensa, y eso incluye cosas que no parecen de IA:
| Sin modelo | Con modelo |
|---|---|
| El chat entre personas, tal cual | Los agentes contestan cuando se les menciona |
| Las colecciones y sus permisos | Se puede preguntar al conocimiento en lenguaje normal |
| Las tareas, con sus estados | Brain-PM conduce los privados: reparte, pregunta y escala |
| Subir un PDF y guardarlo | Leerlo y transcribirlo |
Brain-PM es el que más se nota: es el que te habla en tu privado cuando una tarea vence, cuando alguien pide más plazo o cuando algo lleva días sin moverse. Sin modelo designado, esos avisos salen como mensajes de sistema — correctos y secos.
Configuración → Modelos → Registrar. Se acepta:
| Proveedor | Qué poner | Clave |
|---|---|---|
openai | El nombre del modelo (p. ej. gpt-5). La URL se deja vacía: usa la oficial de OpenAI | sí |
anthropic | El nombre del modelo (p. ej. claude-sonnet-5) | sí |
google | El nombre del modelo | sí |
compatible | Cualquier endpoint que hable el dialecto de OpenAI: Ollama, exo, LM Studio, vLLM. La URL es obligatoria (p. ej. http://10.10.0.14:11434/v1) | opcional |
La distinción que importa: un endpoint local no tiene clave y exigírsela lo dejaría fuera del producto, que es justo el caso on-prem. Un proveedor de nube sin clave, en cambio, no es una configuración parcial: no es nada.
La clave se guarda cifrada y no vuelve a salir en pantalla. Al guardar puedes probar la conexión ahí mismo: si contesta, está listo.
Sí, y es el camino más corto para tener Brain-PM funcionando:
openai, modelo gpt-5 (o el que uses), URL vacía, y tu
API key de OpenAI.Un modelo gestionado no es un agente: no tiene credencial propia, no mantiene ninguna conexión y no hay nada que instalar del otro lado. Brain lo conduce y solo habla cuando se le menciona o cuando le toca conducir una tarea.
Y un aviso que no es menor: agregar un modelo a un canal autoriza que el contenido de ese canal salga hacia su proveedor. Por eso lo decide un administrador canal por canal, y no se hace solo.
Un agente sí es distinto: corre un proceso tuyo —OpenClaw, Hermes, un script— que decide y contesta por su cuenta. Necesita credencial y un conector.
Ajustes → Agentes → Conectar un agente, y son cuatro pasos:
openclaw agents list. Cópialo de la primera línea, no de la
Identity: el agente principal se llama main aunque su identidad diga
«Charli», y con el id equivocado el despertar falla en cada mensaje.El modal se queda mirando: verás subir la escalera de conexión y, cuando esté listo, Brain le escribe una prueba y espera su respuesta. Cuando contesta, Salir — y ya está en la lista.
Arranca el conector (brain-bridge), un proceso pequeño que vive al lado
de tu agente. Es el único que habla con Brain: mantiene la conexión, guarda los
mensajes si se cae la red, reintenta, y cuando llega trabajo le da un toque a
tu agente.
Brain ──(conexión permanente)──► Conector ──(un toque)──► Tu agente
Dos cosas que ahorran una tarde:
BRAIN_HOME, así que no se pisan el cursor. La línea que te da la pantalla ya
lo trae.Si tu agente no es OpenClaw, el contrato es corto: el mensaje llega en el
archivo $BRAIN_EVENT_FILE (JSON, el texto en message.body_md), lo que el
comando escriba es la respuesta, y exit 0 significa «acepto el trabajo».
Y se puede verificar sin Brain de por medio, en la máquina del agente:
curl -fsSL https://brain.tuempresa.com/bridge.sh -o bridge.sh
BRAIN_WAKE_STDOUT_ES_RESPUESTA=1 BRAIN_WAKE_CMD='TU-COMANDO' sh bridge.sh --probar
Dice si arrancó, cuánto tardó y el texto exacto que Brain publicaría. Si falla, reconoce las averías conocidas y dice qué cambiar.
A un agente no se le pone fecha de entrega, se le declara «avisarme si no hay resultado en [N]». Brain no le pregunta nunca «¿cómo vas?» — mira su actividad y te avisa a ti si se atasca, con botones para reintentar o reasignar. Un agente no llega tarde: se atasca, y eso se arregla distinto.
docker logs brain | grep -A6 RECLAMACIÓN).GEEKINDEX_TZ): decide el «hoy» de los plazos y de las
estadísticas.El tour de bienvenida lleva por los puntos 2 a 8 la primera vez que entras como administrador, y está siempre en Ayuda.
Ninguna es obligatoria salvo las de dominio: el resto tiene valor por defecto o se configura desde la pantalla.
| Variable | Para qué |
|---|---|
GEEKINDEX_DOMAIN | Tu dominio. Decide también si la cookie de sesión va Secure |
GEEKINDEX_PUBLIC_URL | La URL pública completa. Manda sobre la anterior |
SITE_URL | La que aparece en correos y enlaces |
GEEKINDEX_INTERNAL_URL | Opcional. La URL que se sirve a agentes que llegan por IP en la LAN |
GEEKINDEX_TZ | Zona de la instancia: el «hoy» de plazos y estadísticas |
GEEKINDEX_ACTUALIZA_EMAIL | Quién puede APLICAR actualizaciones. Vacío = el admin fundador |
INFERENCE_PROVIDER | ollama · anthropic · google · openai. Alternativa a registrar modelos por pantalla |
INFERENCE_API_KEY | La clave del anterior. Vacía con Ollama |
OLLAMA_BASE_URL | Donde escucha tu Ollama |
FCM_SERVICE_ACCOUNT_JSON | Opcional: notificaciones push nativas. Vacío = apagadas, y se dice en el panel de salud |
GEEKINDEX_IOS_APP_ID | Opcional: TeamID.bundle para Universal Links |
GEEKINDEX_ADMIN_EMAIL + GEEKINDEX_ADMIN_PASSWORD | Opcional: crea el primer administrador en el arranque, para despliegues automatizados. Sin ellas, lo crea el asistente en /setup |
DATABASE_URL | No la pongas. La base va dentro; apuntarla fuera aborta el arranque a propósito, porque pisarla en silencio dejaba a alguien con dos bases y una vacía |
GET /api/instance responde sin sesión: sirve para saber si está vivo
({"product":"brain", ...}).Producto de ponteGEEK. El soporte va por la instancia de tu organización o por el canal que te haya dado quien te la instaló.
Content type
Image
Digest
sha256:844ce4018…
Size
603.8 MB
Last updated
about 1 hour ago
docker pull neogeeks/geekindex