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).
🔑 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
Keyvacía (no_user_key) +CREDS_IVinválido (16 chars hex = 8 bytes) →algorithm.iv must contain exactly 16 bytesal cifrar/descifrar. - Origen: el 31-jul se rotaron
CREDS_KEYyCREDS_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.envNO se versiona;.bak-*locales).