Saltar a contenido

LibreChat

Chat multi-model con AI agents, web search y RAG. Node.js + MongoDB + MeiliSearch. Acceso: librechat.matias7235.com.ar (Caddy → 127.0.0.1:3080).

📁 Rutas y configs

Qué Dónde
Compose /opt/docker/librechat/docker-compose.yml (+ docker-compose.override.yml)
Variables de entorno /opt/docker/librechat/.env
Config de endpoints/modelos /opt/docker/librechat/librechat.yaml
Logs /opt/docker/librechat/logs/

Contenedores: LibreChat (v0.8.7, librechat-dev:latest), chat-mongodb (mongo:8.0), chat-meilisearch, rag_api. Solo se escucha en 127.0.0.1:3080 (Caddy reverse proxy).

MCP Office Executor

office-mcp genera DOCX/XLSX/PPTX/PDF mediante la herramienta run_python. Comparte shared_net con LibreChat y se alcanza internamente como http://office-mcp:8530/mcp; el puerto host 8530 queda ligado a 127.0.0.1 y no debe reabrirse en LAN. LibreChat debe registrar 1 servidor MCP y 4 herramientas (run_python, cloud_list, cloud_upload, list_libraries).

docker logs LibreChat 2>&1 | grep 'Initialized with 1 configured server and 4 tools'

🔑 Endpoints custom (user_provided)

Ambos endpoints usan apiKey: 'user_provided'cada usuario pega su propia key desde la UI:

Endpoint baseURL Modelos
OpenCode Go https://opencode.ai/zen/go/v1 minimax-m3, kimi-k2.7-code, glm-5.2, deepseek-v4-pro, qwen3.7-max (fetch: true)
OpenRouter https://openrouter.ai/api/v1 openai/gpt-5.6-luna, deepseek/deepseek-v4-flash-0731, minimax/minimax-m3, qwen/qwen3.7-flash

Cómo guardar la key: LibreChat → Settings → API Keys → seleccionar el endpoint → pegar la key. La key queda cifrada en MongoDB (colección Key, cifrado v3: con CREDS_KEY). NO se declara la key en .env (la variable del proveedor debe quedar en user_provided).

Verificación del endpoint sin exponer secretos:

curl -s https://opencode.ai/zen/go/v1/models -H "Authorization: Bearer <TU_KEY>"
# 200 = key válida; 401 {"type":"AuthError","message":"Invalid API key."} = key inválida

🔥 Problemas comunes

Problema Solución
{"type":"no_user_key"} en logs / error "No API key" en la UI La colección Key está vacía: el usuario nunca guardó su key (Settings → API Keys) o se perdió al rotar CREDS_KEY. Verificar: docker exec chat-mongodb mongosh --quiet --eval 'db.getSiblingDB("LibreChat").Key.countDocuments({})'
error: algorithm.iv must contain exactly 16 bytes CREDS_IV en .env debe tener 32 chars hex (16 bytes), CREDS_KEY 64 chars hex (32 bytes). Verificar: grep -E '^CREDS_(KEY|IV)=' /opt/docker/librechat/.env. Generar IV válido: openssl rand -hex 16. Luego docker restart LibreChat.
Key guardada que deja de funcionar tras rotar .env Rotar CREDS_KEY/CREDS_IV invalida todas las keys cifradas (se pierde el descifrado). Las keys cifradas con el par anterior quedan irrecuperables → re-guardarlas desde la UI.
Cambios en .env no surten efecto El compose carga .env vía env_file → alcanza con docker restart LibreChat para variables de entorno; para cambios en librechat.yaml (bind mount) también alcanza el restart.

Incidente 2026-08-03 (OpenCode Go no aceptaba la key)

  • Causa raíz: colección Key vacía (no_user_key) + CREDS_IV inválido (16 chars hex = 8 bytes) → algorithm.iv must contain exactly 16 bytes al cifrar/descifrar.
  • Origen: el 31-jul se rotaron CREDS_KEY y CREDS_IV (ver .env.bak-20260731-171116), invalidando cualquier secret cifrado previo; la key de OpenCode Go nunca se re-guardó.
  • Fix aplicado: regenerar CREDS_IV (32 chars hex, openssl rand -hex 16), docker restart LibreChat, re-guardar la key desde Settings → API Keys. La DB no tenía secrets cifrados (agentapikeys/pluginauths/totp = 0), así que el cambio fue sin pérdida. Backup pre-fix: /opt/backups/librechat/librechat-20260803-pre-fix.archive.

💾 Backups

  • Dump MongoDB (pre-cambios): docker exec chat-mongodb mongodump --db LibreChat --archive > /opt/backups/librechat/librechat-<fecha>.archive
  • Config: /opt/docker/librechat/{.env,librechat.yaml,docker-compose*.yml} (el .env NO se versiona; .bak-* locales).