Dit artikel presenteert een project POC (Proof of Concept) voor de geautomatiseerde implementatie van LibreChat op AWS EC2, met behulp van Terraform om de infrastructuur te orkestreren volgens het principe van Infrastructure as Code, een User-Data Bash-script om de componenten op EC2 te installeren en AWS Systems Manager om centraal API-sleutels te beheren en de implementatie te volgen. De nadruk ligt op automatisering en kostenoptimalisatie door gebruik te maken van Spot-instances.

Introductie

LibreChat is een geavanceerde chatbot-applicatie die meerdere AI-modellen integreert, waaronder Mistral AI, en functies biedt zoals zoeken in gesprekken, het maken van aangepaste presets, het bewerken en voortzetten van berichten en de integratie van plugins. Het biedt een meertalige en multimodale gebruikersinterface, multi-user management met beveiligde authenticatie, en is volledig open source. Dit project onderzoekt de implementatie ervan op AWS EC2 met behulp van geavanceerde tools voor een volledig geautomatiseerde uitvoering.

Architectuur

De geïmplementeerde architectuur omvat de volgende elementen:

  1. Een EC2-instance die Ubuntu Server draait.
  2. Een User-Data bash-script om de installatie en configuratie van de benodigde componenten voor LibreChat te automatiseren.
  3. Terraform om de benodigde AWS-infrastructuur voor de implementatie van LibreChat te definiëren en te voorzien.
  4. AWS Systems Manager (SSM) om de benodigde API-sleutels voor LibreChat op te slaan en op te halen en de voortgang van de implementatie te volgen.

Automatisering en Infrastructure as Code

Terraform

Terraform is een tool waarmee je de infrastructuur als code kunt definiëren en voorzien (Infrastructure as Code). In dit project wordt Terraform gebruikt om de EC2-instance te maken en te configureren, evenals de bijbehorende AWS-resources, zoals security groups en IAM-rollen.

User-Data

Het User-Data bash-script wordt uitgevoerd bij de eerste start van de EC2-instance. Het automatiseert de installatie en configuratie van de benodigde componenten voor LibreChat, zoals Docker, Docker Compose, Git, Node.js en NPM. Het User-Data script configureert ook de benodigde API-sleutels voor LibreChat, zoals de OpenAI, MistralAI, Anthropic, Google API en Google CSE ID-sleutels, door ze op te halen vanuit AWS Systems Manager (SSM).

Een functie update_status is gedefinieerd in het User-Data-script om de implementatiestatus bij te werken via AWS SSM. Deze functie maakt het mogelijk om de status van de implementatie te monitoren en snel eventuele problemen te detecteren. Het User-Data script pusht ook de functie update_registration.sh en zet deze in cron om registraties te activeren of deactiveren.

Voorbeeld van de functie 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
}

Voorbeeld van de functie 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

De functie update_registration.sh wordt gebruikt om de activatiestatus van registraties bij te werken in de SSM Parameter Store en het configuratiebestand van LibreChat. De LibreChat-service wordt vervolgens opnieuw gestart om de wijzigingen door te voeren.

Volgen van de voortgang van de implementatie met SSM

AWS Systems Manager (SSM) is een service die het mogelijk maakt om EC2-instances centraal te beheren en te configureren. In dit project wordt SSM gebruikt om de benodigde API-sleutels voor LibreChat op te slaan en op te halen, evenals om de voortgang van de implementatie te volgen.

Een functie check_deployment_status is ook gedefinieerd in het script export.sh om de implementatiestatus te controleren via AWS SSM. Deze functie maakt het mogelijk om de voortgang van de deployment live te volgen en snel mogelijke problemen te detecteren.

Voorbeeld van de functie 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
}
}

De deployment status wordt opgeslagen in een SSM-parameter, waardoor de status van de deployment op elk moment en vanaf elke locatie kan worden geraadpleegd.

Foutbeheer met set -e en trap 'error_handler' ERR

In het User-Data script is robuust foutbeheer geïmplementeerd met behulp van set -e en trap 'error_handler' ERR. Deze aanpak zorgt ervoor dat het script onmiddellijk stopt bij een fout en gedetailleerde informatie over het probleem biedt.

Hier is een voorbeeld van een User-Data script met geïntegreerd foutbeheer:

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

De functie error_handler wordt elke keer aangeroepen wanneer er een fout optreedt in het script. Het neemt een foutbericht als parameter, geeft dit weer in de console, werkt de deployment status bij via AWS SSM met behulp van de functie update_status, en stopt het script met een foutcode.

Dankzij set -e en trap 'error_handler' ERR stopt de deployment zodra er een fout optreedt, wat het debuggen en oplossen van problemen vergemakkelijkt. Bovendien maakt bijwerken van de deployment status in AWS SSM het mogelijk om de voortgang van de deployment te volgen en snel mogelijke problemen te detecteren.

Kostenbesparing met Spot Instances

Spot Instances zijn EC2-instances die ongebruikte capaciteit benutten tegen lagere prijzen in vergelijking met on-demand instances. In dit project worden Spot Instances gebruikt om de hostingkosten van de applicatie te verlagen. Het User-Data script ondersteunt de configuratie van Spot Instances, waardoor aanzienlijke kostenbesparingen mogelijk zijn zonder concessies te doen aan de prestaties van de applicatie.

Gemeenschappelijk gebruik van export.sh in de geautomatiseerde deployment van LibreChat op AWS EC2

In het kader van de geautomatiseerde deployment van LibreChat op AWS EC2 is een shell script genaamd export.sh gemaakt om het beheer van de verschillende deployment- en infrastructuurtaken te vergemakkelijken. Dit script wordt zowel vanaf de lokale werkplek als in de GitLab CI-pijplijnen gebruikt, waardoor een gemeenschappelijk en consistent gebruik van de functies die het bevat mogelijk wordt.

Het script export.sh bevat verschillende nuttige functies voor de deployment en het beheer van de AWS-infrastructuur. Deze omvatten:

  • terraform_plan: genereert een Terraform-plan om de wijzigingen aan de infrastructuur vooraf te bekijken.
  • terraform_apply: past de Terraform-wijzigingen toe op de AWS-infrastructuur.
  • terraform_destroy: verwijdert de door de deployment aangemaakte Terraform-bronnen.
  • check_deployment_status: controleert de status van de lopende deployment door AWS SSM te bevragen.

Hier is een voorbeeld van hoe deze functies in een GitLab CI-pijplijn worden gebruikt:

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 dit voorbeeld worden de functies terraform_plan, terraform_apply en terraform_destroy gebruikt in de verschillende stadia van de GitLab CI-pijplijn. Door het script export.sh te sourcen, worden de functies die het bevat toegankelijk in de uitvoeringomgeving van de pijplijn.

De gemeenschappelijke inzet van export.sh tussen de lokale werkplek en GitLab CI vergemakkelijkt het beheer van de geautomatiseerde deployment van LibreChat op AWS EC2. De functies in dit script vereenvoudigen de taken en zorgen voor consistentie in de uitgevoerde handelingen op de infrastructuur.

Meer informatie over het project en de broncode zijn te vinden in de GitLab repository. U zult gedetailleerde informatie vinden over de architectuur, de configuratie en de beste praktijken die zijn geïmplementeerd in dit project voor geautomatiseerde implementatie.

Standaardverbinding met SSM op de instantie

AWS Systems Manager (SSM) maakt standaard verbinding met de EC2-instantie zonder SSH te gebruiken. Deze functie vereenvoudigt de toegang tot de instantie en verbetert de beveiliging door te voorkomen dat de SSH-poort aan internet wordt blootgesteld. Het is echter nog steeds mogelijk om via SSH toegang te krijgen tot de instantie door de juiste flow te openen met behulp van de bijbehorende variabele.

Zelfondertekend SSL-certificaat en beveiliging

Standaard maakt Librechat poort 80 toegankelijk zonder poort 443 te activeren. In dit project is poort 443 standaard geactiveerd met een zelfondertekend certificaat en wordt poort 80 doorgestuurd naar poort 443. Hoewel er een HTTPS-waarschuwing in de browser wordt weergegeven, biedt het gebruik van het HTTPS-protocol beveiliging tegen wachtwoorddiefstal op het netwerk.

Conclusie

Dit project onderzoekt hoe LibreChat kan worden geïmplementeerd en geconfigureerd op een AWS EC2-instantie met behulp van Terraform voor de infrastructuur, een User-Data-script in bash voor de installatie van de componenten, en AWS Systems Manager voor gecentraliseerd configuratiebeheer en het volgen van de voortgang van de implementatie. Er wordt ook nadruk gelegd op het verlagen van de kosten met Spot Instances en beveiliging door een zelfondertekend SSL-certificaat te gebruiken en het configureren van HTTP-beveiligingskoppen.

Met dit project kunt u LibreChat op een AWS EC2-instantie efficiënt, veilig en kosteneffectief implementeren en configureren. Dit project kan worden uitgebreid en aangepast om andere webtoepassingen op AWS te implementeren met behulp van dezelfde principes van automatisering, Infrastructure as Code en gecentraliseerd configuratiebeheer.

Ga verder met het GitLab-project

Voor een volledig inzicht en technische details over de implementatie van LibreChat op AWS EC2, inclusief de architectuur en configuraties, raad ik u ten sterkste aan om de README van het project op GitLab te raadplegen. Dit artikel introduceert het project, deze kernconcepten en de voordelen van deze implementatie, maar alle details vindt u in de projectlink.

Dit document is vertaald van de fr versie naar de nl taal met behulp van het gpt-4o model. Voor meer informatie over het vertaalproces, zie https://gitlab.com/jls42/ai-powered-markdown-translator