Auto-hospedar LibreChat para tu propia app estilo ChatGPT
Sigue esto en tu propio servidor. Empieza gratis, sin tarjeta
LibreChat es una interfaz web de código abierto, al estilo ChatGPT, que habla con OpenAI, Anthropic, Google y docenas de otros proveedores de modelos (o uno local) a través de tus propias API keys, en lugar de hacer pasar tus conversaciones por el propio producto de chat de un tercero. Lo único que necesita y que no encaja con los complementos habituales de Postgres o Redis de Railyard es MongoDB, que es donde la mayoría de los intentos de auto-hospedaje se tuercen. Al final de esta guía tendrás LibreChat y MongoDB corriendo juntos detrás de HTTPS, con secretos reales generados en lugar de los valores por defecto, y un respaldo desde el cual restaurar.
Lo que necesitas
- Un servidor con Docker y el plugin de Compose. Un Hetzner CX23 (2 vCPU, 4 GB de RAM, 40 GB NVMe, 5,99 €/mes sin IVA) corre LibreChat y MongoDB cómodamente, ya que la inferencia del modelo en sí ocurre en los servidores del proveedor, no en el tuyo.
- Un dominio o subdominio apuntado a la dirección IP del servidor.
- Al menos una API key de un proveedor de modelos (OpenAI, Anthropic, o cualquier otro que admita LibreChat), agregada después de que la app esté corriendo.
- Acceso SSH al servidor.
Paso 1: generar los secretos reales
LibreChat viene con valores de marcador de posición para sus secretos de JWT y de cifrado de credenciales que funcionan para una prueba local pero no son seguros para usar en producción. Cuatro valores necesitan datos reales y únicos: un secreto JWT, un secreto JWT de refresco, una llave de cifrado de credenciales, y su vector de inicialización. Los últimos dos tienen requisitos exactos de longitud que los otros no, CREDS_KEY tiene que ser una llave de 32 bytes (64 caracteres hexadecimales), y CREDS_IV exactamente un IV de 16 bytes (32 caracteres hexadecimales), o el propio cifrado AES-CBC de LibreChat lanza algorithm.iv must contain exactly 16 bytes al arrancar:
openssl rand -hex 32 # JWT_SECRET
openssl rand -hex 32 # JWT_REFRESH_SECRET
openssl rand -hex 32 # CREDS_KEY (32 bytes)
openssl rand -hex 16 # CREDS_IV (16 bytes)
openssl rand -hex 24 # MONGO_PASSWORD
mkdir -p /opt/librechat
cat > /opt/librechat/.env <<'EOF'
JWT_SECRET=paste-the-first-value-here
JWT_REFRESH_SECRET=paste-the-second-value-here
CREDS_KEY=paste-the-third-value-here
CREDS_IV=paste-the-fourth-value-here
MONGO_PASSWORD=paste-the-fifth-value-here
EOF
chmod 600 /opt/librechat/.env
Paso 2: escribir el archivo Compose
services:
librechat:
image: ghcr.io/danny-avila/librechat:v0.8.7
restart: unless-stopped
env_file: .env
depends_on:
- mongo
environment:
MONGO_URI: mongodb://librechat:${MONGO_PASSWORD}@mongo:27017/LibreChat?authSource=admin
DOMAIN_CLIENT: https://chat.yourdomain.com
DOMAIN_SERVER: https://chat.yourdomain.com
ALLOW_REGISTRATION: "true"
volumes:
- librechat_uploads:/app/uploads
expose:
- "3080"
mongo:
image: mongo:7
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: librechat
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
volumes:
- librechat_mongo_data:/data/db
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- librechat
volumes:
librechat_uploads:
librechat_mongo_data:
caddy_data:
caddy_config:
Esta guía fija v0.8.7, la versión estable vigente al momento de escribir esto. MONGO_URI lleva el usuario y la contraseña con los que se inicializó MongoDB en el Paso 1, junto con authSource=admin, ya que el usuario root se crea en la base de datos admin, no en LibreChat. DOMAIN_CLIENT y DOMAIN_SERVER necesitan ambos la URL HTTPS exacta donde los usuarios alcanzarán la app; LibreChat las usa para construir cookies y reglas de CORS, así que una discrepancia aquí se manifiesta como un fallo de inicio de sesión confuso en lugar de un error de configuración obvio. ALLOW_REGISTRATION viene en true por defecto en la imagen original, y aquí importa porque LibreChat no tiene ninguna otra forma integrada de crear la primera cuenta, el inicio de sesión social también está apagado por defecto, así que esto no es opcional hasta el Paso 4.
Verifica que el archivo se analiza:
docker compose config
Paso 3: apuntar el DNS, agregar Caddy, arrancar la pila
chat.yourdomain.com {
reverse_proxy librechat:3080
}
docker compose up -d
docker compose ps
curl -I https://chat.yourdomain.com
Deberías ver ambos servicios en estado Up y el curl devolver HTTP/2 200 con un certificado válido.
Paso 4: crear tu cuenta, y luego cerrar la puerta
Visita https://chat.yourdomain.com, regístrate a través del formulario normal de registro, y confirma que puedas iniciar sesión. Una vez que todas las cuentas que necesitas existen, apaga el registro:
environment:
ALLOW_REGISTRATION: "false"
docker compose up -d librechat
Paso 5: agregar un proveedor de modelos
LibreChat en sí nunca viene con una API key de modelo incluida; es un cliente para los proveedores que tú mismo traigas. Agrega tu llave como una variable de entorno, OpenAI como ejemplo:
environment:
OPENAI_API_KEY: ${OPENAI_API_KEY}
Agrega OPENAI_API_KEY=your-real-key a .env, y luego vuelve a ejecutar docker compose up -d librechat. Abre la app, elige el proveedor desde el menú desplegable de modelos, y envía un mensaje. Deberías obtener una respuesta real de vuelta, no un error sobre una llave faltante o inválida.
Paso 6: respaldar MongoDB y los archivos subidos
Las conversaciones, las cuentas y las credenciales cifradas viven todas en MongoDB; los archivos subidos viven en el volumen librechat_uploads.
cat > /opt/librechat/backup.sh <<'EOF'
#!/bin/sh
cd /opt/librechat
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
docker compose exec -T mongo mongodump --authenticationDatabase admin \
-u librechat -p "${MONGO_PASSWORD}" --db LibreChat --archive --gzip > backups/mongo-$TIMESTAMP.archive.gz
find backups -mtime +14 -delete
EOF
mkdir -p /opt/librechat/backups
chmod +x /opt/librechat/backup.sh
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/librechat/backup.sh") | crontab -
Ejecútalo una vez a mano y verifica que haya funcionado: ./backup.sh && ls -lh backups. Deberías ver un archivo .archive.gz con fecha. Restaurar es mongorestore --authenticationDatabase admin -u librechat -p "$MONGO_PASSWORD" --archive=path/to/file --gzip, corrido de la misma forma a través de docker compose exec. Copia los respaldos fuera del servidor; perder tanto el volumen vivo de MongoDB como el único respaldo que tienes significa que cada conversación y credencial guardada desaparece.
Paso 7: actualizar
docker compose pull librechat
docker compose up -d librechat
LibreChat corre sus propias migraciones de datos contra MongoDB automáticamente al arrancar cuando hace falta. Revisa las notas de la versión a la que te mudas antes de un salto de varias versiones, ya que un cambio importante en el esquema de cifrado de credenciales sería la única categoría que vale la pena leer primero.
El atajo: hazlo con Railyard
Todo lo anterior, MongoDB como el único almacén de datos que LibreChat genuinamente no puede compartir con los complementos de Postgres o Redis de Railyard, los secretos JWT y de credenciales generados en lugar de dejados en sus valores por defecto, el volumen de archivos subidos, es también lo que configura por ti la plantilla de pila LibreChat de Railyard. Conecta un servidor, y luego elige LibreChat en el catálogo de plantillas: app.railyard.run/deploy?stack=librechat. Railyard genera JWT_SECRET, JWT_REFRESH_SECRET, CREDS_KEY y el CREDS_IV de 16 bytes por ti con las longitudes correctas, conecta automáticamente la cadena de conexión de MongoDB, y emite el HTTPS para tu dominio; tú sigues agregando tu propia llave de proveedor de modelos después, igual que en el Paso 5 de arriba.
Consulta desplegar con un botón y bases de datos y copias de seguridad para ver cómo funcionan las plantillas y los datos persistentes en la plataforma de forma más general.
Solución de problemas
El inicio de sesión funciona pero nada parece persistir entre reinicios. Confirma que librechat_mongo_data sea un volumen nombrado real en la salida de docker compose ps -a, no uno anónimo que se haya eliminado con un prune; esto normalmente se remonta a una ejecución anterior de docker compose down -v por accidente, que elimina los volúmenes junto con los contenedores.
algorithm.iv must contain exactly 16 bytes al arrancar. CREDS_IV no se generó con exactamente 16 bytes (32 caracteres hexadecimales). Vuelve a ejecutar openssl rand -hex 16 del Paso 1 y revisa que el valor en .env tenga exactamente 32 caracteres de largo, sin truncar ni rellenar.
El formulario de registro devuelve un 403. ALLOW_REGISTRATION está en false y todavía no existe ninguna cuenta, un problema de huevo y gallina si lo apagaste demasiado pronto. Vuelve a ponerlo en true, crea las cuentas que necesitas, y apágalo de nuevo como en el Paso 4.
El menú desplegable de modelos muestra un proveedor pero cada mensaje falla. La API key de ese proveedor no está definida, es inválida, o se quedó sin crédito del lado del proveedor; revisa docker compose logs librechat para ver el error específico del proveedor, LibreChat generalmente pasa el mensaje propio del proveedor tal cual.
El HTTPS no se emite. Que docker compose logs caddy muestre errores de ACME repetidos casi siempre significa que el DNS del Paso 3 no se ha propagado o apunta a la IP equivocada.
Preguntas frecuentes
¿Puedo correr más de un proveedor de modelos a la vez? Sí, agrega tantas API keys de proveedores como variables de entorno quieras; los usuarios eligen qué modelo usar por conversación desde el mismo menú desplegable.
¿LibreChat guarda mis conversaciones con el proveedor del modelo? No, el proveedor solo ve la solicitud que le envías; LibreChat guarda el historial de conversaciones en tu propio MongoDB, el proveedor no es una segunda copia de tus datos.
¿Puedo correr un modelo local en lugar de una API alojada? Sí, LibreChat admite cualquier endpoint compatible con OpenAI, incluyendo servidores de inferencia locales, apuntado a través de una configuración de endpoint personalizada en lugar de una API key de proveedor.
¿Por qué MongoDB específicamente, cuando todo lo demás en Railyard es Postgres o Redis? El propio esquema y los patrones de consulta de LibreChat están construidos alrededor del modelo de documentos de MongoDB desde el inicio; no es una elección que haga esta guía ni Railyard, es lo que exige el proyecto original.
¿Qué pasa si pierdo el servidor sin un respaldo? Cada conversación, cuenta y credencial guardada desaparece; no hay forma de recuperar datos de MongoDB que nunca se respaldaron en otro lugar, por lo que el Paso 6 no es opcional en la práctica.
Una vez que los secretos reales están en su lugar y el registro está cerrado, un LibreChat auto-hospedado básicamente desaparece de fondo. El trabajo continuo es el hábito de respaldo del Paso 6 y agregar el proveedor de modelos que realmente quieras usar.
Por qué eligen Railyard para esto
- Tu propia cuenta en la nube. Despliega en DigitalOcean, Hetzner, Vultr, AWS, OVHcloud, o cualquier servidor Linux por SSH, facturado directamente por tu proveedor, sin márgenes adicionales.
- Un precio fijo por equipo. El plan Free es gratis para siempre: un servidor más un servidor de base de datos, tres apps, sin tarjeta. Pro cuesta $19 al mes por hasta cinco servidores y apps ilimitadas. Team cuesta $49 al mes con servidores ilimitados. Sin cargos por app, por despliegue, por asiento ni por gigabyte.
- Plantillas de un clic. Despliega apps de código abierto, como bases de datos, analítica y herramientas de desarrollo, en tu propio servidor con un clic.
- Bases de datos administradas. Postgres, MySQL y Redis, con copias de seguridad programadas y verificadas por restauración, y recuperación a un punto en el tiempo.
- Despliegue con git push. Despliega desde GitHub, GitLab o la CLI, con HTTPS automático y lanzamientos sin tiempo de inactividad.