Este artículo presenta un proyecto POC (Proof of Concept) para el despliegue automatizado de LibreChat en AWS EC2, utilizando Terraform para orquestar la infraestructura según el principio de Infrastructure as Code, un script User-Data Bash para instalar los componentes en EC2, y AWS Systems Manager para una gestión centralizada de las claves API y el seguimiento del despliegue. El énfasis está en la automatización y la optimización de costes mediante el uso de instancias Spot.
Introducción
LibreChat es una aplicación avanzada de chatbot que integra varios modelos de IA, incluyendo Mistral AI, y ofrece funcionalidades como la búsqueda en las conversaciones, la creación de preajustes personalizados, la edición y continuación de mensajes, así como la integración de plugins. Proporciona una interfaz de usuario multilingüe y multimodal, gestión multiusuario con autenticación segura, y es completamente open-source. Este proyecto explora su despliegue en AWS EC2, empleando herramientas avanzadas para una implementación totalmente automatizada.
Arquitectura
La arquitectura desplegada comprende los siguientes elementos:
- Una instancia
EC2ejecutandoUbuntu Server. - Un script
User-Dataen bash para automatizar la instalación y configuración de los componentes necesarios para LibreChat. Terraformpara definir y aprovisionar la infraestructura AWS necesaria para el despliegue de LibreChat.AWS Systems Manager (SSM)para almacenar y recuperar las claves API necesarias para LibreChat y seguir el avance del despliegue.
Automatización e Infrastructure as Code
Terraform
Terraform es una herramienta que permite definir y aprovisionar la infraestructura como código (Infrastructure as Code). En este proyecto, Terraform se utiliza para crear y configurar la instancia EC2, así como los recursos AWS asociados, como los grupos de seguridad y los roles IAM.
User-Data
El script User-Data en bash se ejecuta durante el primer arranque de la instancia EC2. Automatiza la instalación y configuración de los componentes necesarios para LibreChat, como Docker, Docker Compose, Git, Node.js y NPM. El script User-Data también permite configurar las claves API necesarias para LibreChat, como las claves de OpenAI, MistralAI, Anthropic, Google API y Google CSE ID, recuperándolas desde AWS Systems Manager (SSM).
Una función update_status se define en el script User-Data para actualizar el estado del despliegue vía AWS SSM. Esta función permite supervisar el estado del despliegue y detectar rápidamente posibles problemas. El script User-Data también sube la función update_registration.sh y la coloca en cron para activar o desactivar los registros.
Ejemplo de la función update_status :
update_status() {
STATUS_MESSAGE=$1
aws ssm put-parameter --name "/librechat/deployment-status" --type "String" --value "$STATUS_MESSAGE" --overwrite --region $AWS_DEFAULT_REGION
}
Ejemplo de la función update_registration.sh :
#!/bin/bash
set -e
# Update registration status in SSM Parameter Store
aws ssm put-parameter --name "/librechat/registration_enabled" --type "String" --value "$1" --overwrite --region $AWS_DEFAULT_REGION
# Update LibreChat configuration file
if [ "$1" == "true" ]; then
sed -i 's/enabled: false/enabled: true/g' /opt/librechat/config.yaml
else
sed -i 's/enabled: true/enabled: false/g' /opt/librechat/config.yaml
fi
# Restart LibreChat service
systemctl restart librechat
La función update_registration.sh se usa para actualizar el estado de activación de los registros en el SSM Parameter Store y en el archivo de configuración de LibreChat. A continuación se reinicia el servicio LibreChat para aplicar los cambios.
Seguimiento del avance del despliegue con SSM
AWS Systems Manager (SSM) es un servicio que permite gestionar y configurar las instancias EC2 de forma centralizada. En este proyecto, SSM se utiliza para almacenar y recuperar las claves API necesarias para LibreChat, así como para seguir el avance del despliegue.
También se define una función check_deployment_status en el script export.sh para comprobar el estado del despliegue vía AWS SSM. Esta función permite seguir en directo el progreso del despliegue y detectar rápidamente posibles problemas.
Ejemplo de la función check_deployment_status :
check_deployment_status() {
LAST_STATUS=""
INSTANCE_ID=$(terraform output -raw instance_id) # Récupère l'ID de l'instance Terraform.
if [ -z "$INSTANCE_ID" ]; then
echo "Aucune instance EC2 n'est actuellement déployée ou terraform output n'est pas configuré correctement."
return 1
fi
IP_ADDRESS=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query "Reservations[*].Instances[*].PublicIpAddress" --output text --region $AWS_DEFAULT_REGION 2>/dev/null)
URL="https://$IP_ADDRESS/"
echo "Vérification de l'état de déploiement..."
ATTENTE_STATUS=true # Utilisée pour contrôler l'affichage du message d'attente.
while true; do
STATUS=$(aws ssm get-parameter --name "/librechat/deployment-status" --query "Parameter.Value" --output text --region $AWS_DEFAULT_REGION 2>/dev/null)
if [ $? -ne 0 ]; then
if [ "$ATTENTE_STATUS" = true ]; then
echo -ne "\rEn attente des informations de statut de déploiement.\n"
ATTENTE_STATUS=false # Empêche la répétition du message.
fi
sleep 1
continue
else
ATTENTE_STATUS=true # Réinitialise pour le prochain cycle.
fi
if [[ "$STATUS" != "$LAST_STATUS" ]]; then
if [[ "$LAST_STATUS" != "" ]]; then
echo -e " \e[32m✓\e[0m" # Affiche une coche verte pour le statut précédent.
fi
echo -ne "\rÉtat actuel du déploiement : $STATUS"
LAST_STATUS="$STATUS"
if [[ "$STATUS" == "100% - Installation terminée" ]]; then
echo -e "\n\e[32m✓ Installation terminée avec succès\e[0m"
echo -e "Accédez à l'instance Librechat via : $URL"
break
elif [[ "$STATUS" == "Echec de l'installation" ]]; then
echo -e "\n\e[31m✗ Échec de l'installation\e[0m"
exit 1
fi
fi
sleep 1
done
}
}
El estado del despliegue se almacena en un parámetro SSM, lo que permite consultar el estado del despliegue en cualquier momento y desde cualquier lugar.
Gestión de errores con set -e y trap 'error_handler' ERR
En el script User-Data, se ha implementado una gestión de errores robusta utilizando set -e y trap 'error_handler' ERR. Este enfoque garantiza que el script se detenga inmediatamente en caso de error y proporcione información detallada sobre el problema encontrado.
Aquí hay un fragmento del script User-Data con la gestión de errores integrada:
#!/bin/bash
set -e
trap 'error_handler' ERR
error_handler() {
local error_message=$1
echo "Error occurred: ${error_message}"
update_status "ERROR: ${error_message}"
exit 1
}
update_status() {
STATUS_MESSAGE=$1
aws ssm put-parameter --name "/librechat/deployment-status" --type "String" --value "$STATUS_MESSAGE" --overwrite --region $AWS_DEFAULT_REGION
}
La función error_handler se llama cada vez que ocurre un error en el script. Toma un mensaje de error como parámetro, lo muestra en la consola, actualiza el estado del despliegue vía AWS SSM usando la función update_status, y sale del script con un código de error.
Gracias a set -e y trap 'error_handler' ERR, el despliegue se detiene en cuanto ocurre un error, lo que facilita la depuración y resolución de problemas. Además, la actualización del estado del despliegue en AWS SSM permite seguir el avance del despliegue y detectar rápidamente posibles incidencias.
Reducción de costes con Spot Instances
Las Spot Instances son instancias EC2 que permiten usar capacidad no utilizada a precios reducidos en comparación con las instancias bajo demanda. En este proyecto, se utilizan Spot Instances para reducir los costes de alojamiento de la aplicación. El script User-Data admite la configuración de Spot Instances, lo que permite beneficiarse de importantes reducciones de coste sin comprometer el rendimiento de la aplicación.
Uso compartido de export.sh en el despliegue automatizado de LibreChat en AWS EC2
En el marco del despliegue automatizado de LibreChat en AWS EC2, se creó un script shell llamado export.sh para facilitar la gestión de las distintas tareas relacionadas con el despliegue y la configuración de la infraestructura. Este script se usa tanto desde la estación de trabajo local como en los pipelines de GitLab CI, lo que permite un uso común y coherente de las funciones que contiene.
El script export.sh agrupa varias funciones útiles para el despliegue y la gestión de la infraestructura AWS. Entre ellas se encuentran:
terraform_plan: genera un plan de Terraform para previsualizar los cambios a realizar en la infraestructura.terraform_apply: aplica los cambios de Terraform en la infraestructura AWS.terraform_destroy: elimina los recursos de Terraform creados durante el despliegue.check_deployment_status: verifica el estado del despliegue en curso consultando AWS SSM.
Aquí hay un ejemplo de uso de estas funciones en un pipeline de GitLab CI:
stages:
- Vérifications
- Déploiements
- Suppressions
Vérification Terraform:
stage: Vérifications
script:
- /bin/bash -c "source export.sh && terraform_plan"
Déploiement Terraform:
stage: Déploiements
script:
- /bin/bash -c "source export.sh && terraform_apply && check_deployment_status"
Suppression Terraform:
stage: Suppressions
script:
- /bin/bash -c "source export.sh && terraform_destroy"
En este ejemplo, las funciones terraform_plan, terraform_apply y terraform_destroy se utilizan en las diferentes etapas del pipeline de GitLab CI. Al sourcear el script export.sh, las funciones que contiene pasan a estar accesibles en el entorno de ejecución del pipeline.
El uso compartido de export.sh entre la estación de trabajo local y GitLab CI facilita la gestión del despliegue automatizado de LibreChat en AWS EC2. Las funciones contenidas en este script simplifican las tareas y aseguran coherencia en las operaciones realizadas sobre la infraestructura.
Para saber más sobre el proyecto y consultar el código fuente, visita el repositorio GitLab. Allí encontrarás información detallada sobre la arquitectura, la configuración y las buenas prácticas implementadas en este proyecto de despliegue automatizado.
Conexión por defecto con SSM en la instancia
AWS Systems Manager (SSM) permite conectarse por defecto a la instancia EC2 sin necesidad de usar SSH. Esta funcionalidad simplifica el acceso a la instancia y refuerza la seguridad al evitar exponer el puerto SSH a Internet. No obstante, siempre es posible acceder a la instancia vía SSH abriendo el flujo correspondiente mediante la variable asociada.
Certificado SSL autofirmado y seguridad
Por defecto, LibreChat deja el puerto 80 accesible sin activar el puerto 443. En este proyecto, el puerto 443 se activa por defecto con un certificado autofirmado, y el puerto 80 redirige al puerto 443. Aunque el navegador mostrará una advertencia HTTPS, el uso de HTTPS ofrece seguridad frente al robo de contraseñas en la red.
Conclusión
Este proyecto explora cómo desplegar y configurar LibreChat en una instancia EC2 AWS usando Terraform para la infraestructura, un script User-Data en bash para la instalación de los componentes, y AWS Systems Manager para la gestión centralizada de las configuraciones y el seguimiento del avance del despliegue. El énfasis también está en la reducción de costes con Spot Instances y en la seguridad mediante un certificado SSL autofirmado y la configuración de cabeceras de seguridad HTTP.
Usando este proyecto, podrás desplegar y configurar LibreChat en una instancia EC2 AWS de forma eficaz, segura y económica. Este proyecto puede ampliarse y adaptarse para desplegar otras aplicaciones web en AWS empleando los mismos principios de automatización, Infrastructure as Code y gestión centralizada de configuraciones.
Seguir explorando con el proyecto GitLab
Para una comprensión profunda y los detalles técnicos del despliegue de LibreChat en AWS EC2, incluyendo la arquitectura y las configuraciones, te animo encarecidamente a consultar el README del proyecto en GitLab. Este artículo introduce el proyecto, sus conceptos clave y las ventajas de este despliegue, pero en el enlace del proyecto encontrarás todos los detalles.
Este documento ha sido traducido de la versión fr al idioma es utilizando el modelo gpt-5-mini. Para más información sobre el proceso de traducción, consulte https://gitlab.com/jls42/ai-powered-markdown-translator