Cerca

infrastructureblogia

Distribuzione automatizzata di LibreChat su EC2 AWS

Distribuzione automatizzata di LibreChat su EC2 AWS

Questo articolo presenta un progetto POC (Proof of Concept) per la distribuzione automatizzata di LibreChat su AWS EC2, utilizzando Terraform per orchestrare l’infrastruttura secondo il principio di Infrastructure as Code, uno script User-Data Bash per installare i componenti su EC2, e AWS Systems Manager per una gestione centralizzata delle chiavi API e il monitoraggio del deployment. L’enfasi è posta sull’automazione e sull’ottimizzazione dei costi tramite l’uso delle Spot Instances.

Introduzione

LibreChat è un’applicazione avanzata di chatbot che integra diversi modelli di IA, incluso Mistral AI, e offre funzionalità quali la ricerca nelle conversazioni, la creazione di preset personalizzati, la modifica e la continuazione dei messaggi, oltre all’integrazione di plugin. Propone un’interfaccia utente multilingue e multimodale, la gestione multi-utente con autenticazione sicura, ed è interamente open-source. Questo progetto esplora il suo deployment su AWS EC2, utilizzando strumenti avanzati per una implementazione completamente automatizzata.

Architettura

L’architettura deployata comprende i seguenti elementi:

  1. Un’istanza EC2 eseguente Ubuntu Server.
  2. Uno script User-Data in bash per automatizzare l’installazione e la configurazione dei componenti necessari a LibreChat.
  3. Terraform per definire e provisionare l’infrastruttura AWS necessaria al deployment di LibreChat.
  4. AWS Systems Manager (SSM) per memorizzare e recuperare le chiavi API necessarie a LibreChat e per seguire l’avanzamento del deployment.

Automazione e Infrastructure as Code

Terraform

Terraform è uno strumento che permette di definire e provisionare l’infrastruttura come codice (Infrastructure as Code). In questo progetto, Terraform è utilizzato per creare e configurare l’istanza EC2, così come le risorse AWS associate, quali i gruppi di sicurezza e i ruoli IAM.

User-Data

Lo script User-Data in bash viene eseguito al primo avvio dell’istanza EC2. Automatizza l’installazione e la configurazione dei componenti necessari a LibreChat, come Docker, Docker Compose, Git, Node.js e NPM. Lo script User-Data permette anche di configurare le chiavi API necessarie a LibreChat, quali le chiavi OpenAI, MistralAI, Anthropic, Google API e Google CSE ID, recuperandole da AWS Systems Manager (SSM).

Una funzione update_status è definita nello script User-Data per aggiornare lo stato del deployment tramite AWS SSM. Questa funzione permette di monitorare lo stato del deployment e individuare rapidamente eventuali problemi. Lo script User-Data carica inoltre la funzione update_registration.sh e la aggiunge al cron per attivare o disattivare le registrazioni.

Esempio della funzione 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
}

Esempio della funzione 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 funzione update_registration.sh è utilizzata per aggiornare lo stato di attivazione delle registrazioni nel SSM Parameter Store e nel file di configurazione di LibreChat. Il servizio LibreChat viene poi riavviato per applicare le modifiche.

Monitoraggio dell’avanzamento del deployment con SSM

AWS Systems Manager (SSM) è un servizio che consente di gestire e configurare le istanze EC2 in modo centralizzato. In questo progetto, SSM è utilizzato per memorizzare e recuperare le chiavi API necessarie a LibreChat, oltre che per monitorare l’avanzamento del deployment.

Una funzione check_deployment_status è inoltre definita nello script export.sh per verificare lo stato del deployment tramite AWS SSM. Questa funzione permette di seguire in tempo reale l’avanzamento del deployment e di individuare rapidamente eventuali problemi.

Esempio della funzione 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
}
}

Lo stato del deployment è memorizzato in un parametro SSM, il che permette di consultare lo stato del deployment in qualsiasi momento e da qualsiasi luogo.

Gestione degli errori con set -e e trap 'error_handler' ERR

Nello script User-Data è stata implementata una gestione degli errori robusta utilizzando set -e e trap 'error_handler' ERR. Questo approccio garantisce che lo script si fermi immediatamente in caso di errore e fornisca informazioni dettagliate sul problema riscontrato.

Ecco un estratto dello script User-Data con la gestione degli errori integrata :

#!/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 funzione error_handler viene chiamata ogni volta che si verifica un errore nello script. Riceve un messaggio di errore come parametro, lo visualizza sulla console, aggiorna lo stato del deployment tramite AWS SSM usando la funzione update_status, e termina lo script con un codice di errore.

Grazie a set -e e trap 'error_handler' ERR, il deployment si arresta non appena si verifica un errore, facilitando il debugging e la risoluzione dei problemi. Inoltre, l’aggiornamento dello stato del deployment in AWS SSM permette di monitorare l’avanzamento e di rilevare rapidamente eventuali anomalie.

Riduzione dei costi con le Spot Instances

Le Spot Instances sono istanze EC2 che consentono di sfruttare capacità inutilizzate a prezzi ridotti rispetto alle istanze on-demand. In questo progetto, vengono utilizzate Spot Instances per ridurre i costi di hosting dell’applicazione. Lo script User-Data gestisce la configurazione delle Spot Instances, permettendo di beneficiare di significative riduzioni dei costi senza compromettere le prestazioni dell’applicazione.

Uso comune di export.sh nel deployment automatizzato di LibreChat su AWS EC2

Nel contesto del deployment automatizzato di LibreChat su AWS EC2, è stato creato uno script shell chiamato export.sh per facilitare la gestione delle diverse attività legate al deployment e alla configurazione dell’infrastruttura. Questo script è utilizzato sia dal workstation locale sia nelle pipeline GitLab CI, permettendo un uso comune e coerente delle funzioni in esso contenute.

Lo script export.sh raccoglie diverse funzioni utili per il deployment e la gestione dell’infrastruttura AWS. Tra queste si trovano:

  • terraform_plan : genera un piano Terraform per visualizzare in anteprima le modifiche da apportare all’infrastruttura.
  • terraform_apply : applica le modifiche Terraform sull’infrastruttura AWS.
  • terraform_destroy : elimina le risorse Terraform create durante il deployment.
  • check_deployment_status : verifica lo stato del deployment in corso interrogando AWS SSM.

Ecco un esempio di utilizzo di queste funzioni in una 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"

In questo esempio, le funzioni terraform_plan, terraform_apply e terraform_destroy sono utilizzate nelle diverse fasi della pipeline GitLab CI. Sorgendo lo script export.sh, le funzioni in esso contenute diventano accessibili nell’ambiente di esecuzione della pipeline.

L’uso comune di export.sh tra la workstation locale e GitLab CI facilita la gestione del deployment automatizzato di LibreChat su AWS EC2. Le funzioni contenute in questo script semplificano le operazioni e assicurano coerenza nelle azioni eseguite sull’infrastruttura.

Per saperne di più sul progetto e consultare il codice sorgente, visita il repository GitLab. Troverai informazioni dettagliate sull’architettura, la configurazione e le best practice adottate in questo progetto di deployment automatizzato.

Connessione predefinita con SSM sull’istanza

AWS Systems Manager (SSM) permette di connettersi di default all’istanza EC2 senza dover usare SSH. Questa funzionalità semplifica l’accesso all’istanza e aumenta la sicurezza evitando di esporre la porta SSH su Internet. Tuttavia, è sempre possibile accedere all’istanza via SSH aprendo il traffico appropriato tramite la variabile associata.

Certificato SSL auto-firmato e sicurezza

Per impostazione predefinita, LibreChat rende la porta 80 accessibile senza abilitare la porta 443. In questo progetto, la porta 443 è abilitata di default con un certificato auto-firmato, e la porta 80 reindirizza alla porta 443. Anche se nel browser apparirà un avviso HTTPS, l’uso del protocollo HTTPS offre protezione contro il furto di password sulla rete.

Conclusione

Questo progetto esplora il modo di distribuire e configurare LibreChat su un’istanza EC2 AWS utilizzando Terraform per l’infrastruttura, uno script User-Data in bash per l’installazione dei componenti, e AWS Systems Manager per la gestione centralizzata delle configurazioni e il monitoraggio dell’avanzamento del deployment. L’enfasi è posta anche sulla riduzione dei costi con le Spot Instances e sulla sicurezza tramite un certificato SSL auto-firmato e la configurazione delle intestazioni di sicurezza HTTP.

Utilizzando questo progetto, sarai in grado di distribuire e configurare LibreChat su un’istanza EC2 AWS in modo efficiente, sicuro ed economico. Questo progetto può essere esteso e adattato per distribuire altre applicazioni web su AWS usando gli stessi principi di automazione, Infrastructure as Code e gestione centralizzata delle configurazioni.

Proseguire l’esplorazione con il progetto GitLab

Per una comprensione approfondita e i dettagli tecnici sul deployment di LibreChat su AWS EC2, inclusa l’architettura e le configurazioni, ti invito caldamente a consultare il README del progetto su GitLab. Questo articolo introduce il progetto, i concetti chiave e i vantaggi di questo deployment, ma è nel link del progetto che troverai tutti i dettagli.

Questo documento è stato tradotto dalla versione fr alla lingua it utilizzando il modello gpt-5-mini. Per maggiori informazioni sul processo di traduzione, consultare https://gitlab.com/jls42/ai-powered-markdown-translator