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 della distribuzione. L’accento è posto sull’automazione e l’ottimizzazione dei costi tramite l’uso delle istanze Spot.

Introduzione

LibreChat è un’applicazione avanzata di chatbot che integra diversi modelli di IA, compreso Mistral AI, e offre funzionalità come la ricerca nelle conversazioni, la creazione di preset personalizzati, la modifica e il proseguimento dei messaggi, nonché l’integrazione di plugin. Propone un’interfaccia utente multilingue e multimodale, la gestione multi-utente con autenticazione sicura, ed è completamente open-source. Questo progetto esplora la sua distribuzione su AWS EC2, utilizzando strumenti avanzati per una implementazione completamente automatizzata.

Architettura

L’architettura distribuita comprende i seguenti elementi:

  1. Un’istanza EC2 che esegue Ubuntu Server.
  2. Uno script User-Data in bash per automatizzare l’installazione e la configurazione dei componenti necessari per LibreChat.
  3. Terraform per definire e fornire l’infrastruttura AWS necessaria alla distribuzione di LibreChat.
  4. AWS Systems Manager (SSM) per archiviare e recuperare le chiavi API necessarie a LibreChat e monitorare l’avanzamento della distribuzione.

Automazione e Infrastructure as Code

Terraform

Terraform è uno strumento che permette di definire e fornire l’infrastruttura come codice (Infrastructure as Code). In questo progetto, Terraform è utilizzato per creare e configurare l’istanza EC2, nonché le risorse AWS associate, come 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, come 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 della distribuzione tramite AWS SSM. Questa funzione permette di monitorare lo stato della distribuzione e di rilevare rapidamente eventuali problemi. Lo script User-Data trasferisce anche la funzione update_registration.sh e la imposta in 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 viene utilizzata per aggiornare lo stato di attivazione delle registrazioni nel SSM Parameter Store e nel file di configurazione di LibreChat. Il servizio LibreChat viene quindi riavviato per applicare le modifiche.

Monitoraggio dell’avanzamento della distribuzione con SSM

AWS Systems Manager (SSM) è un servizio che permette di gestire e configurare le istanze EC2 in modo centralizzato. In questo progetto, SSM è utilizzato per archiviare e recuperare le chiavi API necessarie a LibreChat, nonché per monitorare l’avanzamento della distribuzione.

Una funzione check_deployment_status è anch’essa definita nello script export.sh per verificare lo stato della distribuzione tramite AWS SSM. Questa funzione consente di seguire in tempo reale lo stato di avanzamento del deployment e di rilevare 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

Nel script User-Data, è stata implementata una gestione robusta degli errori usando set -e e trap 'error_handler' ERR. Questo approccio garantisce che lo script si interrompa immediatamente in caso di errore e fornisca informazioni dettagliate sul problema incontrato.

Ecco un pezzo di 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. Prende un messaggio di errore come parametro, lo visualizza nella 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 interrompe non appena si verifica un errore, il che facilita il debug e la risoluzione dei problemi. Inoltre, l’aggiornamento dello stato del deployment in AWS SSM permette di seguire l’avanzamento del deployment e di rilevare rapidamente eventuali problemi.

Riduzione dei costi con le Spot Instances

Le Spot Instances sono istanze EC2 che permettono di utilizzare capacità non utilizzate a prezzi ridotti rispetto alle istanze a richiesta. In questo progetto, le Spot Instances sono utilizzate per ridurre i costi di hosting dell’applicazione. Lo script User-Data supporta la configurazione delle Spot Instances, il che consente di beneficiare di riduzioni significative dei costi senza compromettere le prestazioni dell’applicazione.

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

Nell’ambito del deployment automatizzato di LibreChat su AWS EC2, è stato creato uno script shell chiamato export.sh per facilitare la gestione delle diverse attività relative al deployment e alla configurazione dell’infrastruttura. Questo script è utilizzato sia dal terminale locale sia nelle pipeline di GitLab CI, consentendo così un uso comune e coerente delle funzioni che contiene.

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

  • terraform_plan: genera un piano Terraform per visualizzare in anteprima le modifiche da apportare all’infrastruttura.
  • terraform_apply: applica le modifiche Terraform all’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 di 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 di GitLab CI. Sorgendo lo script export.sh, le funzioni che contiene diventano accessibili nell’ambiente di esecuzione della pipeline.

L’uso comune di export.sh tra il terminale locale e GitLab CI consente di facilitare la gestione del deployment automatizzato di LibreChat su AWS EC2. Le funzioni contenute in questo script semplificano le attività e assicurano coerenza nelle operazioni effettuate sull’infrastruttura.

Per saperne di più sul progetto e consultare il codice sorgente, visita il repository GitLab. Troverete informazioni dettagliate sull’architettura, la configurazione e le buone pratiche implementate in questo progetto di distribuzione automatizzata.

Connessione predefinita con SSM sull’istanza

AWS Systems Manager (SSM) consente di connettersi di default all’istanza EC2 senza dover utilizzare SSH. Questa funzionalità semplifica l’accesso all’istanza e rafforza la sicurezza evitando di esporre la porta SSH a Internet. Tuttavia, è sempre possibile accedere all’istanza tramite SSH aprendo il flusso appropriato utilizzando la variabile associata.

Certificato SSL auto-firmato e sicurezza

Di default, Librechat rende la porta 80 accessibile senza attivare la porta 443. In questo progetto, la porta 443 è attivata di default con un certificato auto-firmato, e la porta 80 reindirizza alla porta 443. Sebbene venga visualizzato un avviso HTTPS nel browser, l’uso del protocollo HTTPS offre sicurezza contro il furto della 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 della distribuzione. L’attenzione è anche posta sulla riduzione dei costi con le Spot Instances e la sicurezza utilizzando un certificato SSL auto-firmato e configurando le intestazioni di sicurezza HTTP.

Utilizzando questo progetto, sarete 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 utilizzando 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 della distribuzione di LibreChat su AWS EC2, comprese l’architettura e le configurazioni, vi incoraggio vivamente a consultare il README del progetto su GitLab. Questo articolo introduce il progetto, i concetti chiave e i vantaggi di questa distribuzione, ma è nel link del progetto che troverete tutti i dettagli.

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