Cet article présente un projet POC (Proof of Concept) pour le déploiement automatisé de LibreChat sur AWS EC2, utilisant Terraform pour orchestrer l’infrastructure selon le principe d’Infrastructure as Code, un script User-Data Bash pour installer les composants sur EC2, et AWS Systems Manager pour une gestion centralisée des clés API et le suivi du déploiement. L’accent est mis sur l’automatisation et l’optimisation des coûts via l’utilisation des instances Spot.

Introduction

LibreChat est une application avancée de chatbot qui intègre plusieurs modèles d’IA, y compris Mistral AI, et offre des fonctionnalités telles que la recherche dans les conversations, la création de préréglages personnalisés, l’édition et la continuation des messages, ainsi que l’intégration de plugins. Elle propose une interface utilisateur multilingue et multimodale, la gestion multi-utilisateur avec authentification sécurisée, et est entièrement open-source. Ce projet explore son déploiement sur AWS EC2, utilisant des outils avancés pour une mise en œuvre entièrement automatisée.

Architecture

L’architecture déployée comprend les éléments suivants :

  1. Une instance EC2 exécutant Ubuntu Server.
  2. Un script User-Data en bash pour automatiser l’installation et la configuration des composants nécessaires à LibreChat.
  3. Terraform pour définir et provisionner l’infrastructure AWS nécessaire au déploiement de LibreChat.
  4. AWS Systems Manager (SSM) pour stocker et récupérer les clés d’API nécessaires à LibreChat et suivre l’avancement du déploiement.

Automatisation et Infrastructure as Code

Terraform

Terraform est un outil qui permet de définir et provisionner l’infrastructure en tant que code (Infrastructure as Code). Dans ce projet, Terraform est utilisé pour créer et configurer l’instance EC2, ainsi que les ressources AWS associées, telles que les groupes de sécurité et les rôles IAM.

User-Data

Le script User-Data en bash est exécuté lors du premier démarrage de l’instance EC2. Il automatise l’installation et la configuration des composants nécessaires à LibreChat, tels que Docker, Docker Compose, Git, Node.js et NPM. Le script User-Data permet également de configurer les clés d’API nécessaires à LibreChat, telles que les clés OpenAI, MistralAI, Anthropic, Google API et Google CSE ID, en les récupérant depuis AWS Systems Manager (SSM).

Une fonction update_status est définie dans le script User-Data pour mettre à jour le statut du déploiement via AWS SSM. Cette fonction permet de surveiller l’état du déploiement et de détecter rapidement les éventuels problèmes. Le script User-Data pousse également la fonction update_registration.sh et la met en cron pour activer ou désactiver les registrations.

Exemple de la fonction 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
}

Exemple de la fonction 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 fonction update_registration.sh est utilisée pour mettre à jour le statut d’activation des registrations dans le SSM Parameter Store et le fichier de configuration de LibreChat. Le service LibreChat est ensuite redémarré pour prendre en compte les modifications.

Suivi de l’avancement du déploiement avec SSM

AWS Systems Manager (SSM) est un service qui permet de gérer et de configurer les instances EC2 de manière centralisée. Dans ce projet, SSM est utilisé pour stocker et récupérer les clés d’API nécessaires à LibreChat, ainsi que pour suivre l’avancement du déploiement.

Une fonction check_deployment_status est également définie dans le script export.sh pour vérifier le statut du déploiement via AWS SSM. Cette fonction permet de suivre en direct l’état d’avancement du déploiement et de détecter rapidement les éventuels problèmes.

Exemple de la fonction 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
}
}

Le statut du déploiement est stocké dans un paramètre SSM, ce qui permet de consulter l’état du déploiement à tout moment et depuis n’importe quel endroit.

Gestion des erreurs avec set -e et trap 'error_handler' ERR

Dans le script User-Data, une gestion des erreurs robuste a été mise en place en utilisant set -e et trap 'error_handler' ERR. Cette approche garantit que le script s’arrête immédiatement en cas d’erreur et fournit des informations détaillées sur le problème rencontré.

Voici un bout script User-Data avec la gestion des erreurs intégrée :

#!/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 fonction error_handler est appelée chaque fois qu’une erreur se produit dans le script. Elle prend un message d’erreur en paramètre, l’affiche dans la console, met à jour le statut du déploiement via AWS SSM en utilisant la fonction update_status, et quitte le script avec un code d’erreur.

Grâce à set -e et trap 'error_handler' ERR, le déploiement s’arrête dès qu’une erreur survient, ce qui facilite le débogage et la résolution des problèmes. De plus, la mise à jour du statut du déploiement dans AWS SSM permet de suivre l’avancement du déploiement et de détecter rapidement les éventuels problèmes.

Réduction des coûts avec Spot Instances

Les Spot Instances sont des instances EC2 qui permettent d’utiliser des capacités inutilisées à des prix réduits par rapport aux instances à la demande. Dans ce projet, des Spot Instances sont utilisées pour réduire les coûts d’hébergement de l’application. Le script User-Data prend en charge la configuration des Spot Instances, ce qui permet de bénéficier de réductions de coûts importantes sans compromettre les performances de l’application.

Utilisation commune de export.sh dans le déploiement automatisé de LibreChat sur AWS EC2

Dans le cadre du déploiement automatisé de LibreChat sur AWS EC2, un script shell nommé export.sh a été créé pour faciliter la gestion des différentes tâches liées au déploiement et à la configuration de l’infrastructure. Ce script est utilisé à la fois depuis le poste de travail local et dans les pipelines GitLab CI, permettant ainsi une utilisation commune et cohérente des fonctions qu’il contient.

Le script export.sh regroupe plusieurs fonctions utiles pour le déploiement et la gestion de l’infrastructure AWS. Parmi celles-ci, on retrouve :

  • terraform_plan : génère un plan Terraform pour prévisualiser les modifications à apporter à l’infrastructure.
  • terraform_apply : applique les modifications Terraform sur l’infrastructure AWS.
  • terraform_destroy : supprime les ressources Terraform créées lors du déploiement.
  • check_deployment_status : vérifie l’état du déploiement en cours en interrogeant AWS SSM.

Voici un exemple d’utilisation de ces fonctions dans un pipeline 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"

Dans cet exemple, les fonctions terraform_plan, terraform_apply, et terraform_destroy sont utilisées dans les différentes étapes du pipeline GitLab CI. En sourceant le script export.sh, les fonctions qu’il contient deviennent accessibles dans l’environnement d’exécution du pipeline.

L’utilisation commune de export.sh entre le poste de travail local et GitLab CI permet de faciliter la gestion du déploiement automatisé de LibreChat sur AWS EC2. Les fonctions contenues dans ce script simplifient les tâches et assurent une cohérence dans les opérations effectuées sur l’infrastructure.

Pour en savoir plus sur le projet et consulter le code source, rendez-vous sur le dépôt GitLab. Vous y trouverez des informations détaillées sur l’architecture, la configuration et les bonnes pratiques mises en œuvre dans ce projet de déploiement automatisé.

Connexion par défaut avec SSM sur l’instance

AWS Systems Manager (SSM) permet de se connecter par défaut à l’instance EC2 sans avoir à utiliser SSH. Cette fonctionnalité simplifie l’accès à l’instance et renforce la sécurité en évitant d’exposer le port SSH à Internet. Toutefois, il est toujours possible d’accéder à l’instance via SSH en ouvrant le flux approprié à l’aide de la variable associée.

Certificat SSL auto-signé et sécurité

Par défaut, Librechat rend le port 80 accessible sans activer le port 443. Dans ce projet, le port 443 est activé par défaut avec un certificat auto-signé, et le port 80 redirige vers le port 443. Bien qu’un avertissement HTTPS s’affiche dans le navigateur, l’utilisation du protocole HTTPS offre une sécurité contre le vol de mot de passe sur le réseau.

Conclusion

Ce projet explore la manière de déployer et configurer LibreChat sur une instance EC2 AWS en utilisant Terraform pour l’infrastructure, un script User-Data en bash pour l’installation des composants, et AWS Systems Manager pour la gestion centralisée des configurations et le suivi de l’avancement du déploiement. L’accent est également mis sur la réduction des coûts avec les Spot Instances et la sécurité en utilisant un certificat SSL auto-signé et en configurant les en-têtes de sécurité HTTP.

En utilisant ce projet, vous serez en mesure de déployer et configurer LibreChat sur une instance EC2 AWS de manière efficace, sécurisée et économique. Ce projet peut être étendu et adapté pour déployer d’autres applications web sur AWS en utilisant les mêmes principes d’automatisation, d’Infrastructure as Code et de gestion centralisée des configurations.

Poursuivre l’Exploration avec le Projet GitLab

Pour une compréhension approfondie et les détails techniques du déploiement de LibreChat sur AWS EC2, y compris l’architecture et les configurations, je vous encourage vivement à consulter le README du projet sur GitLab. Cet article introduit le projet, ces concepts clés et les avantages de ce déploiement, mais c’est dans le lien du projet que vous trouverez tous les détails.