Zoeken

infrastructureblogia

Geautomatiseerde uitrol van LibreChat op EC2 AWS

Geautomatiseerde uitrol van LibreChat op EC2 AWS

Dit artikel presenteert een project POC (Proof of Concept) voor de geautomatiseerde uitrol van LibreChat op AWS EC2. Het gebruikt 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 voor gecentraliseerd beheer van API-sleutels en het volgen van de uitrol. De nadruk ligt op automatisering en kostenoptimalisatie door gebruik van Spot-instances.

Inleiding

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

Architectuur

De uitgerolde architectuur omvat de volgende elementen:

  1. Une instance EC2 exécutant Ubuntu Server.
  2. Un script User-Data en bash om de installatie en configuratie van de componenten die voor LibreChat nodig zijn te automatiseren.
  3. Terraform om de benodigde AWS-infrastructuur voor de uitrol van LibreChat te definiëren en te provisionen.
  4. AWS Systems Manager (SSM) om de API-sleutels die voor LibreChat nodig zijn op te slaan en op te halen en de voortgang van de uitrol te volgen.

Automatisering en Infrastructure as Code

Terraform

Terraform is een tool die het mogelijk maakt om infrastructuur als code te definiëren en te provisionen (Infrastructure as Code). In dit project wordt Terraform gebruikt om de EC2-instance te creëren en configureren, evenals de bijbehorende AWS-resources zoals security groups en IAM-rollen.

User-Data

Het User-Data bash-script wordt uitgevoerd bij de eerste opstart van de EC2-instance. Het automatiseert de installatie en configuratie van de componenten die LibreChat nodig heeft, zoals Docker, Docker Compose, Git, Node.js en NPM. Het User-Data-script zorgt ook voor het configureren van de API-sleutels die LibreChat nodig heeft, zoals OpenAI-, MistralAI-, Anthropic-, Google API- en Google CSE ID-sleutels, door deze op te halen uit AWS Systems Manager (SSM).

Een functie update_status is gedefinieerd in het User-Data-script om de status van de uitrol bij te werken via AWS SSM. Deze functie maakt het mogelijk de status van de uitrol 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 uitrol met SSM

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

Een functie check_deployment_status is ook gedefinieerd in het script export.sh om de status van de uitrol te controleren via AWS SSM. Deze functie maakt het mogelijk de voortgang van de uitrol in realtime te volgen en snel eventuele 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 status van de uitrol wordt opgeslagen in een SSM-parameter, waardoor de status van de uitrol op elk moment en vanaf elke locatie kan worden geraadpleegd.

Foutafhandeling met set -e en trap 'error_handler' ERR

In het User-Data-script is een robuuste foutafhandeling 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 levert.

Hier is een fragment van het User-Data-script met geïntegreerde foutafhandeling :

#!/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 aangeroepen telkens wanneer een fout optreedt in het script. Ze neemt een foutmelding als parameter, toont deze in de console, werkt de status van de uitrol bij via AWS SSM door gebruik van de functie update_status, en beëindigt het script met een foutcode.

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

Kostenreductie met Spot-instances

Spot-instances zijn EC2-instances die gebruikmaken van ongebruikte capaciteit tegen lagere prijzen dan 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, wat aanzienlijke kostenbesparingen mogelijk maakt zonder de prestaties van de applicatie aan te tasten.

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

Als onderdeel van de geautomatiseerde uitrol van LibreChat op AWS EC2 is een shellscript genaamd export.sh gemaakt om het beheer van verschillende taken met betrekking tot de uitrol en configuratie van de infrastructuur te vereenvoudigen. Dit script wordt zowel vanaf de lokale werkplek als in GitLab CI-pijplijnen gebruikt, waardoor een gemeenschappelijk en consistent gebruik van de functies die het bevat mogelijk is.

Het script export.sh bevat meerdere nuttige functies voor de uitrol en het beheer van de AWS-infrastructuur. Hieronder enkele voorbeelden:

  • terraform_plan : genereert een Terraform-plan om wijzigingen aan de infrastructuur te previewen.
  • terraform_apply : past de Terraform-wijzigingen toe op de AWS-infrastructuur.
  • terraform_destroy : verwijdert de met Terraform aangemaakte resources na de uitrol.
  • check_deployment_status : controleert de status van de huidige uitrol door AWS SSM te raadplegen.

Hier is een voorbeeld van het gebruik van deze functies in een GitLab CI-pijplijn :

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 stappen van de GitLab CI-pijplijn. Door het script export.sh te sourcen, worden de functies die het bevat beschikbaar in de uitvoeringsomgeving van de pijplijn.

Het gemeenschappelijk gebruik van export.sh tussen de lokale werkplek en GitLab CI maakt het beheer van de geautomatiseerde uitrol van LibreChat op AWS EC2 eenvoudiger. De functies in dit script vereenvoudigen taken en zorgen voor consistentie in de handelingen op de infrastructuur.

Voor meer informatie over het project en de broncode, ga naar het GitLab-repository. Daar vind je gedetailleerde informatie over de architectuur, configuratie en best practices die in dit geautomatiseerde uitrolproject zijn toegepast.

Standaardverbinding met SSM op de instance

AWS Systems Manager (SSM) maakt het mogelijk standaard verbinding te maken met de EC2-instance zonder SSH te gebruiken. Deze functionaliteit vereenvoudigt de toegang tot de instance en verhoogt de beveiliging door te voorkomen dat de SSH-poort aan het internet wordt blootgesteld. Het blijft echter mogelijk om via SSH toegang te krijgen tot de instance door de juiste poort 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 ingeschakeld met een zelfondertekend certificaat, en poort 80 wordt doorgestuurd naar poort 443. Hoewel er een HTTPS-waarschuwing in de browser kan verschijnen, biedt het gebruik van HTTPS bescherming tegen het stelen van wachtwoorden op het netwerk.

Conclusie

Dit project onderzoekt hoe je LibreChat kunt uitrollen en configureren op een AWS EC2-instance met Terraform voor de infrastructuur, een User-Data bash-script voor het installeren van componenten, en AWS Systems Manager voor gecentraliseerd configuratiebeheer en het volgen van de voortgang van de uitrol. De nadruk ligt ook op kostenreductie met Spot-instances en beveiliging door gebruik van een zelfondertekend SSL-certificaat en het instellen van HTTP-security headers.

Met dit project kun je LibreChat efficiënt, veilig en kosteneffectief uitrollen en configureren op een AWS EC2-instance. Het project kan worden uitgebreid en aangepast om andere webapplicaties op AWS te deployen met behulp van dezelfde principes van automatisering, Infrastructure as Code en gecentraliseerd configuratiebeheer.

Verder verkennen met het GitLab-project

Voor een diepgaander begrip en technische details van de uitrol van LibreChat op AWS EC2, inclusief architectuur en configuraties, raad ik je aan het README van het project op GitLab te raadplegen. Dit artikel introduceert het project, de kernconcepten en de voordelen van deze uitrol, maar in de link naar het project vind je alle details.

Dit document is vertaald van de Franse versie naar het Nederlands met behulp van het model gpt-5-mini. Voor meer informatie over het vertaalproces, raadpleeg https://gitlab.com/jls42/ai-powered-markdown-translator