Acest articol prezintă un proiect POC (Proof of Concept) pentru deplasarea automatizată a LibreChat pe AWS EC2, utilizând Terraform pentru orchestrarea infrastructurii conform principiului Infrastructure as Code, un script User-Data Bash pentru a instala componentele pe EC2, și AWS Systems Manager pentru o gestionare centralizată a cheilor API și urmărirea desfășurării. Se pune accent pe automatizare și optimizarea costurilor prin utilizarea instanțelor Spot.

Introducere

LibreChat este o aplicație avansată de chatbot care integrează mai multe modele de IA, inclusiv Mistral AI, și oferă funcționalități precum căutarea în conversații, crearea de presetări personalizate, editarea și continuarea mesajelor, precum și integrarea de pluginuri. Oferă o interfață utilizator multilingvă și multimodală, gestionare multi-utilizator cu autentificare securizată și este complet open-source. Acest proiect explorează desfășurarea sa pe AWS EC2, utilizând instrumente avansate pentru o implementare complet automatizată.

Arhitectură

Arhitectura desfășurată include următoarele elemente:

  1. O instanță EC2 rulând Ubuntu Server.
  2. Un script User-Data în bash pentru a automatiza instalarea și configurarea componentelor necesare pentru LibreChat.
  3. Terraform pentru a defini și aproviziona infrastructura AWS necesară pentru desfășurarea LibreChat.
  4. AWS Systems Manager (SSM) pentru a stoca și recupera cheile API necesare pentru LibreChat și urmărirea desfășurării.

Automatizare și Infrastructure as Code

Terraform

Terraform este un instrument care permite definirea și aprovizionarea infrastructurii ca și cod (Infrastructure as Code). În acest proiect, Terraform este utilizat pentru a crea și configura instanța EC2, precum și resursele AWS asociate, cum ar fi grupurile de securitate și rolurile IAM.

User-Data

Scriptul User-Data în bash este executat la prima pornire a instanței EC2. Automatizează instalarea și configurarea componentelor necesare pentru LibreChat, cum ar fi Docker, Docker Compose, Git, Node.js și NPM. Scriptul User-Data permite, de asemenea, configurarea cheilor API necesare pentru LibreChat, cum ar fi cheile OpenAI, MistralAI, Anthropic, Google API și Google CSE ID, recuperându-le de la AWS Systems Manager (SSM).

O funcție update_status este definită în scriptul User-Data pentru a actualiza starea desfășurării prin AWS SSM. Această funcție permite monitorizarea stării desfășurării și detectarea rapidă a eventualelor probleme. Scriptul User-Data împinge, de asemenea, funcția update_registration.sh și o pune în cron pentru a activa sau dezactiva înregistrările.

Exemplu de funcție 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
}

Exemplu de funcție 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

Funcția update_registration.sh este utilizată pentru a actualiza starea activării înregistrărilor în SSM Parameter Store și într-un fișier de configurare LibreChat. Serviciul LibreChat este apoi repornit pentru a prelua modificările.

Monitorizarea stadiului desfășurării cu SSM

AWS Systems Manager (SSM) este un serviciu care permite gestionarea și configurarea centralizată a instanțelor EC2. În acest proiect, SSM este utilizat pentru a stoca și recupera cheile API necesare pentru LibreChat, precum și pentru a urmări stadiul desfășurării.

O funcție check_deployment_status este, de asemenea, definită în scriptul export.sh pentru a verifica starea desfășurării prin AWS SSM. Această funcție permite urmărirea în timp real a stării progresului implementării și detectarea rapidă a eventualelor probleme.

Exemplu de funcție 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
}
}

Starea implementării este stocată într-un parametru SSM, ceea ce permite consultarea stării implementării oricând și oriunde.

Gestionarea erorilor cu set -e și trap 'error_handler' ERR

În scriptul User-Data, o gestionare robustă a erorilor a fost implementată folosind set -e și trap 'error_handler' ERR. Aceasta abordare garantează că scriptul se oprește imediat în caz de eroare și oferă informații detaliate despre problema întâmpinată.

Iată o bucățică de script User-Data cu gestionarea erorilor integrată:

#!/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
}

Funcția error_handler este apelată de fiecare dată când apare o eroare în script. Ea ia un mesaj de eroare ca parametru, îl afișează în consolă, actualizează starea implementării prin AWS SSM folosind funcția update_status, și închide scriptul cu un cod de eroare.

Datorită set -e și trap 'error_handler' ERR, implementarea se oprește de îndată ce apare o eroare, ceea ce facilitează depanarea și rezolvarea problemelor. În plus, actualizarea stării implementării în AWS SSM permite urmărirea progresului implementării și detectarea rapidă a eventualelor probleme.

Reducerea costurilor cu Spot Instances

Spot Instances sunt instanțe EC2 care permit utilizarea capacităților nefolosite la prețuri reduse comparativ cu instanțele la cerere. În acest proiect, Spot Instances sunt utilizate pentru a reduce costurile de găzduire a aplicației. Scriptul User-Data suportă configurarea Spot Instances, ceea ce permite beneficii semnificative de costuri fără a compromite performanțele aplicației.

Utilizarea comună a export.sh în implementarea automatizată a LibreChat pe AWS EC2

În cadrul implementării automatizate a LibreChat pe AWS EC2, a fost creat un script shell numit export.sh pentru a facilita gestionarea diferitelor sarcini legate de implementare și configurarea infrastructurii. Acest script este utilizat atât din statia de lucru locală, cât și în pipeline-urile GitLab CI, permițând astfel o utilizare comună și coerentă a funcțiilor pe care le conține.

Scriptul export.sh reunește mai multe funcții utile pentru implementarea și gestionarea infrastructurii AWS. Dintre acestea, amintim:

  • terraform_plan: generează un plan Terraform pentru a previzualiza modificările ce urmează a fi aduse infrastructurii.
  • terraform_apply: aplică modificările Terraform pe infrastructura AWS.
  • terraform_destroy: șterge resursele Terraform create în timpul implementării.
  • check_deployment_status: verifică starea implementării în curs prin interogarea AWS SSM.

Iată un exemplu de utilizare a acestor funcții într-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"

În acest exemplu, funcțiile terraform_plan, terraform_apply, și terraform_destroy sunt utilizate în diferitele etape ale pipeline-ului GitLab CI. Prin sursarea scriptului export.sh, funcțiile pe care le conține devin accesibile în mediul de execuție al pipeline-ului.

Utilizarea comună a export.sh între statia de lucru locală și GitLab CI facilitează gestionarea implementării automatizate a LibreChat pe AWS EC2. Funcțiile conținute în acest script simplifică sarcinile și asigură o coerență în operațiunile efectuate pe infrastructură.

Pentru a afla mai multe despre proiect și a consulta codul sursă, accesați depozitul GitLab. Veți găsi informații detaliate despre arhitectura, configurația și bunele practici implementate în acest proiect de implementare automatizată.

Conexiune implicită cu SSM pe instanță

AWS Systems Manager (SSM) permite conectarea implicită la instanța EC2 fără a utiliza SSH. Această funcționalitate simplifică accesul la instanță și îmbunătățește securitatea prin evitarea expunerii portului SSH la Internet. Totuși, este întotdeauna posibil să accesați instanța prin SSH deschizând fluxul corespunzător cu ajutorul variabilei asociate.

Certificat SSL auto-semnat și securitate

Implicit, Librechat face portul 80 accesibil fără a activa portul 443. În acest proiect, portul 443 este activat implicit cu un certificat auto-semnat, iar portul 80 redirecționează către portul 443. Deși un avertisment HTTPS apare în browser, utilizarea protocolului HTTPS oferă securitate împotriva furtului de parole pe rețea.

Concluzie

Acest proiect explorează modul de implementare și configurare a LibreChat pe o instanță EC2 AWS utilizând Terraform pentru infrastructură, un script User-Data în bash pentru instalarea componentelor, și AWS Systems Manager pentru gestionarea centralizată a configurațiilor și urmărirea progresului implementării. Se pune, de asemenea, accent pe reducerea costurilor cu Spot Instances și pe securitate prin folosirea unui certificat SSL auto-semnat și configurarea antetelor de securitate HTTP.

Utilizând acest proiect, veți fi în măsură să implementați și să configurați LibreChat pe o instanță EC2 AWS într-un mod eficient, sigur și economic. Acest proiect poate fi extins și adaptat pentru a implementa alte aplicații web pe AWS folosind aceleași principii de automatizare, Infrastructure as Code și gestionare centralizată a configurațiilor.

Continuarea Explorării cu Proiectul GitLab

Pentru o înțelegere aprofundată și detalii tehnice despre implementarea LibreChat pe AWS EC2, inclusiv arhitectura și configurațiile, vă încurajez să consultați README-ul proiectului pe GitLab. Acest articol introduce proiectul, conceptele sale cheie și avantajele acestei implementări, dar în linkul proiectului veți găsi toate detaliile.

Acest document a fost tradus din versiunea fr în limba ro folosind modelul gpt-4o. Pentru mai multe informații despre procesul de traducere, consultați https://gitlab.com/jls42/ai-powered-markdown-translator