Sök

infrastructureblogia

Automatiserad driftsättning av LibreChat på AWS EC2

Automatiserad driftsättning av LibreChat på AWS EC2

Denna artikel presenterar ett projekt POC (Proof of Concept) för automatiserad driftsättning av LibreChat på AWS EC2, som använder Terraform för att orkestrera infrastrukturen enligt principen Infrastructure as Code, ett User-Data Bash-skript för att installera komponenterna på EC2, och AWS Systems Manager för central hantering av API-nycklar och övervakning av driftsättningen. Fokus ligger på automatisering och kostnadsoptimering genom användning av Spot-instanser.

Introduktion

LibreChat är en avancerad chattbot-applikation som integrerar flera AI-modeller, inklusive Mistral AI, och erbjuder funktioner som sökning i konversationer, skapande av anpassade förinställningar, redigering och fortsättning av meddelanden samt plugin-integrationer. Den erbjuder ett flerspråkigt och multimodalt användargränssnitt, multi-användarhantering med säker autentisering och är helt öppen källkod. Detta projekt undersöker dess driftsättning på AWS EC2 med hjälp av avancerade verktyg för en helt automatiserad implementering.

Arkitektur

Den distribuerade arkitekturen innehåller följande komponenter:

  1. En instans EC2 som kör Ubuntu Server.
  2. Ett bash-skript User-Data för att automatisera installation och konfiguration av de komponenter som krävs för LibreChat.
  3. Terraform för att definiera och provisionera den AWS-infrastruktur som behövs för driftsättningen av LibreChat.
  4. AWS Systems Manager (SSM) för att lagra och hämta de API-nycklar som behövs för LibreChat och för att följa driftsättningsförloppet.

Automatisering och Infrastructure as Code

Terraform

Terraform är ett verktyg som gör det möjligt att definiera och provisionera infrastruktur som kod (Infrastructure as Code). I detta projekt används Terraform för att skapa och konfigurera EC2-instansen samt associerade AWS-resurser som säkerhetsgrupper och IAM-roller.

User-Data

User-Data-skriptet i bash körs vid första uppstart av EC2-instansen. Det automatiserar installation och konfiguration av de komponenter som krävs för LibreChat, såsom Docker, Docker Compose, Git, Node.js och NPM. User-Data-skriptet konfigurerar också de API-nycklar som krävs för LibreChat, såsom OpenAI-, MistralAI-, Anthropic-, Google API-nycklar och Google CSE ID, genom att hämta dem från AWS Systems Manager (SSM).

En funktion update_status definieras i User-Data-skriptet för att uppdatera driftsättningsstatus via AWS SSM. Denna funktion möjliggör övervakning av driftsättningsstatus och snabb upptäckt av eventuella problem. User-Data-skriptet pushar även funktionen update_registration.sh och lägger den i cron för att aktivera eller inaktivera registreringar.

Exempel på funktionen 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
}

Exempel på funktionen 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

Funktionen update_registration.sh används för att uppdatera aktiveringsstatus för registreringar i SSM Parameter Store och i LibreChats konfigurationsfil. Tjänsten LibreChat startas därefter om för att ta hänsyn till ändringarna.

Övervakning av driftsättningsförloppet med SSM

AWS Systems Manager (SSM) är en tjänst som möjliggör central hantering och konfiguration av EC2-instanser. I detta projekt används SSM för att lagra och hämta de API-nycklar som krävs för LibreChat samt för att övervaka driftsättningsförloppet.

En funktion check_deployment_status definieras också i skriptet export.sh för att kontrollera driftsättningsstatus via AWS SSM. Denna funktion gör det möjligt att följa driftsättningen i realtid och snabbt identifiera eventuella problem.

Exempel på funktionen 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
}
}

Driftsättningsstatus lagras i en SSM-parameter, vilket gör det möjligt att när som helst och var som helst kontrollera status för driftsättningen.

Felhantering med set -e och trap 'error_handler' ERR

I User-Data-skriptet har robust felhantering implementerats med hjälp av set -e och trap 'error_handler' ERR. Detta tillvägagångssätt säkerställer att skriptet avbryts omedelbart vid fel och ger detaljerad information om problemet.

Här är en bit av User-Data-skriptet med inbyggd felhantering :

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

Funktionen error_handler anropas varje gång ett fel uppstår i skriptet. Den tar ett felmeddelande som parameter, visar det i konsolen, uppdaterar driftsättningsstatus via AWS SSM med funktionen update_status och avslutar skriptet med en felkod.

Tack vare set -e och trap 'error_handler' ERR avbryts driftsättningen så snart ett fel inträffar, vilket underlättar felsökning och problemlösning. Dessutom gör uppdateringen av driftsättningsstatus i AWS SSM det möjligt att följa förloppet och snabbt upptäcka problem.

Kostnadsminskning med Spot-instanser

Spot-instanser är EC2-instanser som gör det möjligt att använda outnyttjad kapacitet till lägre priser jämfört med on-demand-instanser. I detta projekt används Spot-instanser för att minska kostnaderna för drift av applikationen. User-Data-skriptet hanterar konfigurationen för Spot-instanser, vilket möjliggör betydande kostnadsbesparingar utan att kompromissa med applikationens prestanda.

Gemensam användning av export.sh i den automatiserade driftsättningen av LibreChat på AWS EC2

Som en del av den automatiserade driftsättningen av LibreChat på AWS EC2 har ett shell-skript vid namn export.sh skapats för att underlätta hanteringen av olika uppgifter kopplade till driftsättning och infrastrukturkonfiguration. Detta skript används både från den lokala arbetsstationen och i GitLab CI-pipelines, vilket möjliggör en gemensam och konsekvent användning av de funktioner det innehåller.

Skriptet export.sh grupperar flera användbara funktioner för driftsättning och hantering av AWS-infrastruktur. Bland dessa finns:

  • terraform_plan : genererar en Terraform-plan för att förhandsgranska ändringar i infrastrukturen.
  • terraform_apply : tillämpar Terraform-ändringarna på AWS-infrastrukturen.
  • terraform_destroy : tar bort de Terraform-resurser som skapats under driftsättningen.
  • check_deployment_status : kontrollerar status för den pågående driftsättningen genom att fråga AWS SSM.

Här är ett exempel på användning av dessa funktioner i en GitLab CI-pipeline :

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"

I detta exempel används funktionerna terraform_plan, terraform_apply och terraform_destroy i olika steg av GitLab CI-pipelinen. Genom att source:a skriptet export.sh blir dess funktioner tillgängliga i pipeline-miljön.

Den gemensamma användningen av export.sh mellan den lokala arbetsstationen och GitLab CI förenklar hanteringen av den automatiserade driftsättningen av LibreChat på AWS EC2. Funktionerna i skriptet förenklar uppgifter och säkerställer konsekvens i de operationer som utförs på infrastrukturen.

För mer information om projektet och för att se källkoden, besök arkivet på GitLab. Där hittar du detaljerad information om arkitekturen, konfigurationen och bästa praxis som använts i detta automatiserade driftsättningsprojekt.

Standardanslutning med SSM på instansen

AWS Systems Manager (SSM) tillåter standardanslutning till EC2-instansen utan att behöva använda SSH. Denna funktion förenklar åtkomst till instansen och förbättrar säkerheten genom att undvika exponering av SSH-porten mot Internet. Det är dock fortfarande möjligt att ansluta via SSH genom att öppna den lämpliga flödet med hjälp av den associerade variabeln.

Självsignerat SSL-certifikat och säkerhet

Som standard gör LibreChat port 80 tillgänglig utan att aktivera port 443. I detta projekt aktiveras port 443 som standard med ett självsignerat certifikat, och port 80 omdirigerar till port 443. Även om en HTTPS-varning visas i webbläsaren, ger användningen av HTTPS skydd mot lösenordsstöld över nätverket.

Slutsats

Detta projekt utforskar hur man driftsätter och konfigurerar LibreChat på en AWS EC2-instans med Terraform för infrastruktur, ett User-Data Bash-skript för installation av komponenter och AWS Systems Manager för central hantering av konfigurationer och övervakning av driftsättningsförloppet. Fokus ligger även på kostnadsminskning med Spot-instanser och säkerhet genom användning av ett självsignerat SSL-certifikat samt konfiguration av HTTP-säkerhetsheaders.

Genom att använda detta projekt kan du effektivt, säkert och ekonomiskt driftsätta och konfigurera LibreChat på en AWS EC2-instans. Projektet kan vidareutvecklas och anpassas för att driftsätta andra webbaserade applikationer på AWS med samma principer för automatisering, Infrastructure as Code och centraliserad konfigurationshantering.

Fortsatt utforskning med GitLab-projektet

För en djupare förståelse och tekniska detaljer om driftsättningen av LibreChat på AWS EC2, inklusive arkitektur och konfigurationer, rekommenderar jag starkt att du konsulterar projektets README på GitLab. Denna artikel introducerar projektet, dess nyckelkoncept och fördelarna med driftsättningen, men det är i projektlänken du hittar alla detaljer.

Detta dokument har översatts från fr-versionen till språket sv med hjälp av modellen gpt-5-mini. För mer information om översättningsprocessen, se https://gitlab.com/jls42/ai-powered-markdown-translator