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 Infraestructura como Código, un script de User-Data en 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 enfoque está en la automatización y la optimización de costos a través del 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 características como la búsqueda en conversaciones, la creación de ajustes preestablecidos personalizados, la edición y continuación de mensajes, así como la integración de plugins. Propone una interfaz de usuario multilingüe y multimodal, la gestión multiusuario con autenticación segura, y es completamente open-source. Este proyecto explora su despliegue en AWS EC2, utilizando herramientas avanzadas para una implementación completamente automatizada.

Arquitectura

La arquitectura desplegada incluye los siguientes elementos:

  1. Una instancia EC2 ejecutando Ubuntu Server.
  2. Un script User-Data en Bash para automatizar la instalación y configuración de los componentes necesarios para LibreChat.
  3. Terraform para definir y aprovisionar la infraestructura de AWS necesaria para el despliegue de LibreChat.
  4. AWS Systems Manager (SSM) para almacenar y recuperar las claves API necesarias para LibreChat y seguir el progreso del despliegue.

Automatización e Infraestructura como Código

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 de AWS asociados, como los grupos de seguridad y los roles IAM.

User-Data

El script User-Data en Bash se ejecuta durante el primer inicio de la instancia EC2. Automatiza la instalación y configuración de los componentes necesarios para LibreChat, tales 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 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 a través de AWS SSM. Esta función permite monitorear el estado del despliegue y detectar rápidamente cualquier problema posible. El script User-Data también empuja la función update_registration.sh y la coloca en cron para activar o desactivar las inscripciones.

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 utiliza para actualizar el estado de activación de las inscripciones en el SSM Parameter Store y el archivo de configuración de LibreChat. El servicio LibreChat se reinicia entonces para aplicar los cambios.

Seguimiento del progreso del despliegue con SSM

AWS Systems Manager (SSM) es un servicio que permite gestionar y configurar las instancias EC2 de manera centralizada. En este proyecto, SSM se utiliza para almacenar y recuperar las claves API necesarias para LibreChat, así como para seguir el progreso del despliegue.

También se define una función check_deployment_status en el script export.sh para verificar el estado del despliegue a través de AWS SSM. Esta función permite seguir en vivo el estado de progreso del despliegue y detectar rápidamente cualquier problema.

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 de User-Data, se ha establecido 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 proporciona información detallada sobre el problema encontrado.

Aquí hay un trozo de script de 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 a través de AWS SSM utilizando 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 tan pronto como ocurre un error, lo que facilita la depuración y la resolución de problemas. Además, la actualización del estado del despliegue en AWS SSM permite seguir el progreso del despliegue y detectar rápidamente cualquier problema.

Reducción de costos con Instancias Spot

Las Instancias Spot son instancias de EC2 que permiten utilizar capacidades no utilizadas a precios reducidos en comparación con las instancias bajo demanda. En este proyecto, se utilizan Instancias Spot para reducir los costos de alojamiento de la aplicación. El script de User-Data maneja la configuración de las Instancias Spot, lo que permite beneficiarse de importantes reducciones de costos sin comprometer el rendimiento de la aplicación.

Uso común de export.sh en el despliegue automatizado de LibreChat en AWS EC2

En el contexto del despliegue automatizado de LibreChat en AWS EC2, se ha creado un script de 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 utiliza tanto desde el puesto de trabajo local como en los pipelines 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 de AWS. Entre estas, encontramos:

  • terraform_plan: genera un plan Terraform para previsualizar los cambios a realizar en la infraestructura.
  • terraform_apply: aplica los cambios de Terraform en la infraestructura de 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 incluir el script export.sh, las funciones que contiene se vuelven accesibles en el entorno de ejecución del pipeline.

El uso común de export.sh entre el puesto 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 en la infraestructura.

Para obtener más información sobre el proyecto y consultar el código fuente, visita el repositorio de GitLab. Encontrarán 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 conectar por defecto a la instancia EC2 sin tener que utilizar SSH. Esta funcionalidad simplifica el acceso a la instancia y refuerza la seguridad al evitar exponer el puerto SSH a Internet. Sin embargo, todavía es posible acceder a la instancia vía SSH abriendo el flujo apropiado utilizando la variable asociada.

Certificado SSL auto-firmado y seguridad

Por defecto, Librechat hace accesible el puerto 80 sin activar el puerto 443. En este proyecto, el puerto 443 está activado por defecto con un certificado auto-firmado, y el puerto 80 redirige hacia el puerto 443. Aunque una advertencia HTTPS aparece en el navegador, el uso del protocolo HTTPS ofrece seguridad contra el robo de contraseña en la red.

Conclusión

Este proyecto explora la manera de desplegar y configurar LibreChat en una instancia EC2 AWS utilizando 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. También se pone énfasis en la reducción de costos con las Spot Instances y la seguridad utilizando un certificado SSL auto-firmado y configurando los encabezados de seguridad HTTP.

Al usar este proyecto, serán capaces de desplegar y configurar LibreChat en una instancia EC2 AWS de manera eficiente, segura y económica. Este proyecto puede ser extendido y adaptado para desplegar otras aplicaciones web en AWS utilizando los mismos principios de automatización, de Infrastructure as Code y de gestión centralizada de configuraciones.

Continuar la Exploración 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, les 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 es en el enlace del proyecto donde encontrarán todos los detalles.

Este documento ha sido traducido de la versión francesa al idioma español utilizando el modelo gpt-4-1106-preview. Para obtener más información sobre el proceso de traducción, consulte https://gitlab.com/jls42/ai-powered-markdown-translator