Saltar al contenido
Menú

Producto

Soluciones

Integraciones

Desarrolladores

Idioma

Desarrolladores

Instalación avanzada e infraestructura

Para cuando el servidor sale de tu portátil. Cada tema trae un diagrama o una tabla, la configuración correcta más corta y un enlace al documento completo en GitHub.

Cuatro sitios donde puede correr

El binario es el mismo en los cuatro. Cambia la dirección de escucha, y con ella cuánta autenticación y cuánto cifrado te toca poner.

Cuatro topologías de despliegue una al lado de la otra: solo portátil, con el servidor dentro del portátil; un equipo de homelab al que se conectan dos portátiles; un servidor en la LAN con un escudo TLS delante; y un servidor al que se llega por un túnel saliente hacia un edge en la nube.
Cada paso a la derecha da más alcance y añade un requisito. En ninguna hay replicación entre servidores: muchas máquinas llegan a un solo servidor.
TopologíaEscuchaAutenticaciónTLSSe ejecuta como
Solo portátil127.0.0.1:49374No hace faltaNounidad de usuario de systemd, agente de launchd o un contenedor
Equipo de homelab0.0.0.0:49374Bearer token y lista de hosts permitidos, ambos obligatoriosRecomendadoDocker con healthcheck, o el servicio de sistema del AUR
LAN con TLS0.0.0.0:49374 detrás de un proxyToken root, más un usuario y una clave de API por personaSí. Caddy con su CA interna funciona sin dominioDocker Compose con Caddy como sidecar
TúnelNingún puerto en el hostIgual que el servidor en la LANSí, en el edge de CloudflareDocker Compose con cloudflared como sidecar

Un portátil puede prescindir de HTTP con ai-memory serve --transport stdio. Para un homelab, el repositorio trae un script bin/deploy con plantillas de compose y de env. Sigue el paso a paso de despliegue en homelab.

TLS con un proxy inverso

ai-memory no termina TLS por sí mismo, por diseño. Un bearer token autentica una petición. No la cifra.

Puedes prescindir de TLS cuando

  • el agente habla con él por stdio
  • el servidor solo escucha en loopback, para un usuario, y nadie abre /web desde otra máquina
  • es desarrollo local o un experimento puntual

Necesitas TLS cuando

  • existen cuentas, porque entonces las claves aim_ viajan por la red
  • el servidor escucha más allá de loopback
  • abres /web desde otra máquina
  • se puede llegar al servidor desde fuera de la LAN
Dos portátiles se conectan por HTTPS a un proxy inverso. El proxy reenvía HTTP plano a ai-memory. El proxy y ai-memory están en el mismo host.
El certificado es cosa del proxy. ai-memory se queda en HTTP plano detrás de él, accesible solo por la red de Docker o por loopback.

Para un dominio público con los puertos 80 y 443 accesibles. Caddy emite y renueva solo el certificado de Let’s Encrypt. El repositorio tiene el archivo compose completo en docker/compose.tls.caddy.yml.

Caddyfile
memory.example.com {
    reverse_proxy ai-memory:49374
}

Después, avisa al servidor

La lista de hosts permitidos debe incluir el hostname público, o la protección contra DNS rebinding rechaza las peticiones del proxy. La opción de cookie segura es obligatoria en cuanto la gente inicia sesión por un listener que va más allá de loopback.

.env.production
AI_MEMORY_AUTH_TOKEN=...long-random-token-from-generate-auth-token...
AI_MEMORY_AUTH__SECURE_COOKIE=true
AI_MEMORY_ALLOWED_HOSTS=memory.example.com,localhost,127.0.0.1
AI_MEMORY_BIND=0.0.0.0:49374

Y reapunta los clientes

La URL de MCP termina en /mcp. La URL de los hooks es el origen sin ruta.

Terminal
ai-memory install-mcp   --client claude-code --apply \
    --server-url "https://memory.example.com/mcp" --auth-token "$AI_MEMORY_AUTH_TOKEN"
ai-memory install-hooks --agent  claude-code --apply \
    --server-url "https://memory.example.com" --auth-token "$AI_MEMORY_AUTH_TOKEN"

Lee la guía completa de HTTPS, con subrutas y timeouts del proxy para ejecuciones largas de bootstrap

Mantén el servidor en marcha

ai-memory no se reinicia solo. De eso se encarga el gestor de servicios de cada sistema operativo.

Para una estación de trabajo de un solo usuario. Los paquetes del AUR instalan la unidad. No necesita sudo y guarda el estado en ~/.local/share/ai-memory. Una unidad de usuario se detiene al cerrar sesión, salvo que actives lingering.

Terminal
systemctl --user daemon-reload
systemctl --user enable --now ai-memory.service
systemctl --user status ai-memory.service
journalctl --user -u ai-memory.service -f

# que siga corriendo después de cerrar sesión
loginctl enable-linger "$USER"

Unidades de systemd en la guía de instalaciónlaunchd en la guía de macOSWinSW en la guía de Windows

El directorio de datos y las copias de seguridad

La wiki es la verdad. Es markdown plano en un repositorio git, y el índice de búsqueda se construye a partir de ella.

Reindex reconstruye las páginas, los enlaces y la búsqueda de texto completo a partir de la wiki. No recupera sesiones, observaciones, traspasos, usuarios, claves, filas de auditoría ni embeddings, así que la base de datos también va en tu copia de seguridad.

DirectorioContieneTipo¿Hay que copiarlo?
wiki/Todas las páginas en markdown, en un solo repositorio gitVerdadSí. Va en el tarball de la copia de seguridad, y también puedes hacerle rsync o git push
raw/Segmentos de transcripción inmutables y saneados de los lanzamientos gestionadosVerdadSí, si usas ai-memory run. Cópialo aparte
db/memory.sqlite: índice de texto completo, entidades, embeddings, sesiones, usuarios, filas de auditoríaDerivado en su mayoríaSí. Las páginas, los enlaces y la búsqueda se reconstruyen desde la wiki. Las sesiones, los traspasos, los usuarios y las claves solo viven aquí
models/El modelo local de embeddings, unos 87 MBReconstruibleNo. Se vuelve a descargar, o colocas los archivos tú mismo
logs/Salida de trazas con rotaciónDesechableNo

Por defecto: ~/.local/share/ai-memory en Linux, ~/Library/Application Support/ai-memory en macOS, %LOCALAPPDATA%\ai-memory en Windows y /data en el contenedor. Cámbialo con AI_MEMORY_DATA_DIR.

Copia de seguridad y restauración

La copia de seguridad saca un archivo tar.gz de un servidor en marcha. La restauración va del archivo a un servidor detenido, que después se vuelve a arrancar.
La copia de seguridad se hace contra un servidor en marcha. La restauración trabaja directamente sobre el disco y se niega mientras haya algún proceso de ai-memory vivo.

Copiar

Usa la API de backup en línea de SQLite, así que las escrituras que ocurren durante la instantánea quedan coherentes. El tarball contiene el árbol de la wiki, la instantánea de la base de datos y config.toml.

Terminal
# seguro con el servidor en marcha
ai-memory backup --to /tmp/ai-memory-backup.tar.gz

Restaurar

--data-dir es la ruta del volumen en el host. Las rutas de aquí son las de la guía de despliegue. Usa las tuyas.

Terminal
# Primero detén el servidor.
docker compose -f ~/deploy/ai-memory/docker-compose.yml down
# Restaura (sysinfo se niega si el contenedor sigue corriendo).
ai-memory restore --from /tmp/ai-memory-backup.tar.gz --data-dir /var/opt/docker/utils/ai-memory/data --force
# Vuelve a arrancar.
docker compose -f ~/deploy/ai-memory/docker-compose.yml up -d

Lee las operaciones de ciclo de vida: purgar, renombrar, mover, restaurar una página, resetear

Enrutamiento e identidad

Un servidor compartido tiene que responder dos preguntas: a qué proyecto pertenece esta sesión y quién pregunta.

El archivo marcador

Por defecto, el proyecto es el nombre del directorio actual, en un workspace llamado default. Deja un .ai-memory.toml en cualquier directorio superior para cambiarlo. Los hooks suben desde el directorio de trabajo y usan el primer marcador que encuentran.

Trabajo y personal

Un marcador por directorio padre. Todos los repositorios que cuelgan de él caen en ese workspace, con el nombre del directorio como proyecto.

.ai-memory.toml
# ~/projects/movvia/.ai-memory.toml
workspace = "movvia"

# ~/personal/.ai-memory.toml
workspace = "personal"

Monorepo

Un marcador con un proyecto fija todos los subdirectorios a ese proyecto. Gana el marcador más cercano.

.ai-memory.toml
# ~/projects/movvia/pe-portais/.ai-memory.toml
workspace = "movvia"
project = "pe-portais"

Worktrees de git

Los worktrees enlazados y los subdirectorios se resuelven al repositorio principal, aunque el worktree viva fuera de él.

.ai-memory.toml
# ~/projects/.ai-memory.toml
workspace = "oss"
project_strategy = "repo-root"

El mismo archivo contiene las reglas de [capture] con ignore_paths, y ai-memory install-hooks --apply --capture-mode allowlist convierte el marcador en un opt-in: un repositorio sin marcador no emite eventos. Los hooks nativos aplican ambas cosas. Los hooks de shell del wrapper de Docker no. Lee la referencia del archivo marcador.

Modos de auto-scope

Una llamada MCP sin proyecto explícito se resuelve con un puntero de “proyecto actual”. El modo decide quién comparte ese puntero. El servidor registra el modo activo al arrancar.

ModoCuándo usarlo
per_actorEl modo por defecto. Aísla harness en paralelo y personas distintas en un mismo servidor.
per_sessionPara clientes con sesión que reenvían el id de sesión del hook en cada petición MCP.
singleEl comportamiento anterior a la v1.39. Un solo slot para todo el proceso, gana la última escritura. Inseguro en un servidor compartido.
config.toml
[auto_scope]
mode = "per_actor"        # "per_actor" (por defecto desde v1.39) | "per_session" | "single"
session_ttl_secs = 3600   # TTL de las entradas por clave (por defecto 1 h)
max_entries = 4096        # límite duro; se expulsan primero las inserciones más antiguas

Lee cómo funciona el aislamiento de auto-scope

SSO y OIDC

Cada desarrollador inicia sesión una vez con un device flow de OIDC contra cualquier emisor que cumpla el estándar, como Keycloak, Okta o Entra ID. Ese token autentica después los hooks nativos de ciclo de vida y los comandos de la CLI cuando no hay un bearer token estático configurado.

Terminal
ai-memory auth login oidc-device \
  --issuer "https://issuer.example.com/realms/team" \
  --client-id "ai-memory-cli"

Lee la página de SSO e identidad corporativa

Sin red, límites y actualizaciones

Lo que necesitan saber una revisión de seguridad, un plan de capacidad y una ventana de mantenimiento.

Instalación air-gapped (sin red)

Binarios

Cada archivo de una versión tiene su .sha256. Descárgalo en una máquina con red, verifícalo y llévalo dentro. Las versiones solo traen checksums, sin procedencia SLSA ni atestación de artefactos.

Compilar desde el código

SQLite va incluido y libgit2 va vendorizado, así que la compilación necesita un toolchain de C y tu mirror de crates. cargo vendor funciona.

El modelo de embeddings

Una instalación por defecto descarga el modelo de Hugging Face en el primer arranque. Para que no salga ninguna petición, coloca antes model.safetensors, tokenizer.json y config.json en <data_dir>/models/all-MiniLM-L6-v2/. Los checksums están fijados en el código.

El binario no tiene telemetría. El wrapper de Docker consulta Docker Hub en busca de una imagen más nueva como mucho una vez cada 24 horas, y AI_MEMORY_NO_VERSION_CHECK=1 lo desactiva. En un entorno air-gapped las actualizaciones son manuales, igual que la instalación. Lee la página de instalación sin red.

Capacidad

Todas las escrituras pasan por un solo escritor. El proyecto midió dónde está su tope, con cargo test -p ai-memory-store --test writer_throughput -- --ignored --nocapture.

Escritores concurrentesThroughputLatencia media
142/s23,9 ms
8295/s3,4 ms
32698/s1,43 ms
128700/s1,43 ms
  • El techo ronda las 700 escrituras por segundo y se alcanza cerca de los 32 escritores.
  • La cola de escritura está limitada a 1024. Pasado ese punto, los productores se frenan y todas las escrituras acaban llegando.
  • Los hooks de shell dejan de esperar al servidor a los 200 ms y guardan el evento en una cola local, así que un servidor lento no bloquea a tu agente.
  • AI_MEMORY_HOOK_RATE_PER_SEC y AI_MEMORY_HOOK_RATE_BURST añaden un rate limit opcional por actor y sesión. Viene desactivado.

Lee la sección de capacidad de la guía de despliegue

Actualización

Terminal
ai-memory upgrade
  • Con el wrapper de Docker, esto verifica y reemplaza el wrapper, descarga la imagen y vuelve a preparar los scripts de hooks. Un servidor en otro host se actualiza aparte.
  • Las migraciones del esquema y de la wiki corren al arrancar. Solo van hacia delante: un binario más antiguo se niega a abrir un directorio migrado, así que ejecuta antes ai-memory backup si cabe la posibilidad de volver atrás.

Lee la guía de migración a la 2.0, con el camino de vuelta incluido

Preguntas y respuestas

¿ai-memory necesita TLS?

No en un portátil de un solo usuario escuchando en 127.0.0.1, ni por stdio. Añade un proxy TLS cuando existan cuentas, cuando el servidor escuche más allá de loopback, cuando abras la interfaz web desde otra máquina o cuando se pueda llegar a él desde fuera de la LAN. ai-memory no termina TLS por sí mismo.

¿De qué tengo que hacer copia de seguridad?

Ejecuta ai-memory backup, que es seguro con el servidor en marcha. El tarball contiene el árbol de la wiki, una instantánea consistente de SQLite y config.toml. La wiki es la fuente de verdad. Las páginas, los enlaces y la búsqueda se pueden reconstruir desde ella con ai-memory reindex, pero las sesiones, los traspasos, los usuarios y las claves solo existen en la base de datos.

¿ai-memory es compatible con SSO?

Admite autenticación por dispositivo con OIDC para los hooks de ciclo de vida y los comandos de la CLI, contra cualquier emisor que cumpla el estándar. El servidor no valida tokens OIDC por sí mismo, así que poner la API del servidor detrás de tu proveedor de identidad requiere un gateway compatible con OIDC delante.

¿Pueden dos servidores compartir un directorio de datos?

No. Ejecuta un servidor por directorio de datos. Desde la 2.0 el servidor toma un bloqueo exclusivo sobre .serve.lock y un segundo servidor se niega a arrancar.

¿Lo ejecutas en un sitio poco habitual?

Abre un issue y describe tu entorno. El código, la documentación y el tracker son públicos.