Suchen

infrastructureblogia

Automatisierte Bereitstellung von LibreChat auf AWS EC2

Automatisierte Bereitstellung von LibreChat auf AWS EC2

Dieser Artikel stellt ein Projekt POC (Proof of Concept) für die automatisierte Bereitstellung von LibreChat auf AWS EC2 vor. Terraform wird verwendet, um die Infrastruktur nach dem Prinzip Infrastructure as Code zu orchestrieren, ein Bash-User-Data-Skript installiert die Komponenten auf der EC2-Instanz, und AWS Systems Manager bietet eine zentralisierte Verwaltung der API-Schlüssel sowie die Nachverfolgung des Deployments. Der Schwerpunkt liegt auf Automatisierung und Kostenoptimierung durch die Nutzung von Spot-Instanzen.

Einführung

LibreChat ist eine fortgeschrittene Chatbot-Anwendung, die mehrere KI-Modelle, einschließlich Mistral AI, integriert und Funktionen wie die Suche in Konversationen, das Erstellen benutzerdefinierter Presets, das Bearbeiten und Fortsetzen von Nachrichten sowie die Integration von Plugins bietet. Sie stellt eine mehrsprachige, multimediale Benutzeroberfläche, Multi-User-Verwaltung mit sicherer Authentifizierung bereit und ist vollständig Open Source. Dieses Projekt untersucht die Bereitstellung auf AWS EC2 und verwendet fortgeschrittene Werkzeuge für eine vollständig automatisierte Implementierung.

Architektur

Die bereitgestellte Architektur umfasst folgende Elemente:

  1. Eine Instanz EC2, die Ubuntu Server ausführt.
  2. Ein Bash-Skript User-Data (User-Data), um die Installation und Konfiguration der für LibreChat benötigten Komponenten zu automatisieren.
  3. Terraform zur Definition und Provisionierung der für die Bereitstellung von LibreChat benötigten AWS-Infrastruktur.
  4. AWS Systems Manager (SSM) zum Speichern und Abrufen der für LibreChat benötigten API-Schlüssel und zur Nachverfolgung des Deployments.

Automatisierung und Infrastructure as Code

Terraform

Terraform ist ein Werkzeug, mit dem Infrastruktur als Code definiert und bereitgestellt werden kann. In diesem Projekt wird Terraform verwendet, um die EC2-Instanz sowie die zugehörigen AWS-Ressourcen wie Sicherheitsgruppen und IAM-Rollen zu erstellen und zu konfigurieren.

User-Data

Das User-Data-Bash-Skript wird beim ersten Start der EC2-Instanz ausgeführt. Es automatisiert die Installation und Konfiguration der für LibreChat benötigten Komponenten, wie Docker, Docker Compose, Git, Node.js und NPM. Das User-Data-Skript konfiguriert außerdem die für LibreChat benötigten API-Schlüssel, wie OpenAI-, MistralAI-, Anthropic- und Google-API-Schlüssel sowie die Google CSE ID, indem es diese aus AWS Systems Manager (SSM) abruft.

Im User-Data-Skript ist eine Funktion update_status definiert, die den Deploy-Status via AWS SSM aktualisiert. Diese Funktion ermöglicht die Überwachung des Deployments und die schnelle Erkennung möglicher Probleme. Das User-Data-Skript pusht außerdem die Funktion update_registration.sh und legt sie in cron ab, um Registrierungen zu aktivieren oder zu deaktivieren.

Beispiel der Funktion 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
}

Beispiel der Funktion 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

Die Funktion update_registration.sh wird verwendet, um den Aktivierungsstatus der Registrierungen im SSM Parameter Store und in der LibreChat-Konfigurationsdatei zu aktualisieren. Der LibreChat-Dienst wird anschließend neu gestartet, damit die Änderungen wirksam werden.

Nachverfolgung des Deployments mit SSM

AWS Systems Manager (SSM) ist ein Service, der die zentrale Verwaltung und Konfiguration von EC2-Instanzen ermöglicht. In diesem Projekt wird SSM verwendet, um die für LibreChat benötigten API-Schlüssel zu speichern und abzurufen sowie um den Fortschritt des Deployments zu verfolgen.

Im Skript export.sh ist ebenfalls eine Funktion check_deployment_status definiert, die den Deploy-Status via AWS SSM überprüft. Diese Funktion erlaubt die Live-Nachverfolgung des Fortschritts und die schnelle Erkennung möglicher Probleme.

Beispiel der Funktion 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
}
}

Der Deploy-Status wird in einem SSM-Parameter gespeichert, sodass der Zustand des Deployments jederzeit und von überall eingesehen werden kann.

Fehlerbehandlung mit set -e und trap 'error_handler' ERR

Im User-Data-Skript wurde eine robuste Fehlerbehandlung unter Verwendung von set -e und trap 'error_handler' ERR implementiert. Dieser Ansatz stellt sicher, dass das Skript bei einem Fehler sofort abbricht und detaillierte Informationen zum aufgetretenen Problem liefert.

Hier ein Ausschnitt des User-Data-Skripts mit integrierter Fehlerbehandlung :

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

Die Funktion error_handler wird bei jedem Fehler im Skript aufgerufen. Sie nimmt eine Fehlermeldung als Parameter, gibt diese in der Konsole aus, aktualisiert den Deploy-Status via AWS SSM mithilfe der Funktion update_status und beendet das Skript mit einem Fehlercode.

Dank set -e und trap 'error_handler' ERR bricht das Deployment sofort ab, sobald ein Fehler auftritt, was das Debugging und die Problemlösung erleichtert. Zusätzlich ermöglicht die Aktualisierung des Deploy-Status in AWS SSM die Nachverfolgung des Fortschritts und die schnelle Erkennung möglicher Probleme.

Kostenreduzierung mit Spot-Instances

Spot-Instances sind EC2-Instanzen, die ungenutzte Kapazitäten zu reduzierten Preisen im Vergleich zu On-Demand-Instanzen nutzen. In diesem Projekt werden Spot-Instances eingesetzt, um die Hosting-Kosten der Anwendung zu senken. Das User-Data-Skript unterstützt die Konfiguration von Spot-Instances, sodass erhebliche Kosteneinsparungen möglich sind, ohne die Anwendungsleistung zu beeinträchtigen.

Gemeinsame Nutzung von export.sh beim automatisierten Deployment von LibreChat auf AWS EC2

Im Rahmen des automatisierten Deployments von LibreChat auf AWS EC2 wurde ein Shell-Skript mit dem Namen export.sh erstellt, das die Verwaltung der verschiedenen Deployment- und Infrastrukturkonfigurationsaufgaben erleichtert. Dieses Skript wird sowohl vom lokalen Arbeitsplatz als auch in GitLab CI-Pipelines verwendet, was eine gemeinsame und konsistente Nutzung der darin enthaltenen Funktionen ermöglicht.

Das Skript export.sh fasst mehrere nützliche Funktionen für Deployment und Verwaltung der AWS-Infrastruktur zusammen. Dazu gehören unter anderem:

  • terraform_plan : erzeugt einen Terraform-Plan, um die vorgesehenen Infrastrukturänderungen zu prüfen.
  • terraform_apply : wendet die Terraform-Änderungen auf die AWS-Infrastruktur an.
  • terraform_destroy : entfernt die während des Deployments erstellten Terraform-Ressourcen.
  • check_deployment_status : prüft den aktuellen Deploy-Status durch Abfrage von AWS SSM.

Hier ein Beispiel für die Nutzung dieser Funktionen in einer 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"

In diesem Beispiel werden die Funktionen terraform_plan, terraform_apply und terraform_destroy in den unterschiedlichen Pipeline-Stufen verwendet. Durch das Sourcen des Skripts export.sh werden die darin enthaltenen Funktionen im Ausführungsumfeld der Pipeline verfügbar.

Die gemeinsame Nutzung von export.sh zwischen dem lokalen Arbeitsplatz und GitLab CI vereinfacht das automatisierte Deployment von LibreChat auf AWS EC2. Die im Skript enthaltenen Funktionen vereinfachen Aufgaben und sorgen für Konsistenz bei Operationen an der Infrastruktur.

Für weitere Informationen zum Projekt und zum Quellcode besuchen Sie das GitLab-Repository. Dort finden Sie detaillierte Informationen zur Architektur, Konfiguration und zu den im Projekt angewandten Best Practices für dieses automatisierte Deployment.

Standardverbindung mit SSM auf der Instanz

AWS Systems Manager (SSM) ermöglicht den standardmäßigen Zugriff auf die EC2-Instanz, ohne SSH verwenden zu müssen. Diese Funktion vereinfacht den Zugriff auf die Instanz und erhöht die Sicherheit, da der SSH-Port nicht dem Internet ausgesetzt werden muss. Es ist jedoch weiterhin möglich, per SSH auf die Instanz zuzugreifen, indem der entsprechende Datenfluss über die zugehörige Variable geöffnet wird.

Selbstsigniertes SSL-Zertifikat und Sicherheit

Standardmäßig macht LibreChat Port 80 zugänglich, ohne Port 443 zu aktivieren. In diesem Projekt ist Port 443 standardmäßig mit einem selbstsignierten Zertifikat aktiviert, und Port 80 leitet auf Port 443 weiter. Obwohl im Browser eine HTTPS-Warnung angezeigt wird, bietet die Verwendung von HTTPS Schutz gegen das Abfangen von Passwörtern im Netzwerk.

Fazit

Dieses Projekt untersucht, wie LibreChat auf einer AWS EC2-Instanz bereitgestellt und konfiguriert werden kann, wobei Terraform für die Infrastruktur, ein Bash-User-Data-Skript für die Installation der Komponenten und AWS Systems Manager für die zentralisierte Verwaltung der Konfigurationen und die Nachverfolgung des Deployments eingesetzt werden. Der Fokus liegt außerdem auf Kostensenkung durch Spot-Instances und auf Sicherheit durch ein selbstsigniertes SSL-Zertifikat und die Konfiguration von HTTP-Sicherheitsheadern.

Mit diesem Projekt können Sie LibreChat effizient, sicher und kostengünstig auf einer AWS EC2-Instanz bereitstellen und konfigurieren. Das Projekt kann erweitert und angepasst werden, um weitere Webanwendungen auf AWS unter Verwendung derselben Prinzipien der Automatisierung, Infrastructure as Code und zentralisierten Konfigurationsverwaltung zu deployen.

Vertiefung mit dem GitLab-Projekt

Für ein tieferes Verständnis und technische Details zur Bereitstellung von LibreChat auf AWS EC2, einschließlich Architektur und Konfigurationen, empfehle ich dringend, das Projekt-README auf GitLab zu lesen. Dieser Artikel führt in das Projekt, die wichtigsten Konzepte und die Vorteile dieser Bereitstellung ein, aber im verlinkten Projekt finden Sie alle technischen Details.

Dieses Dokument wurde mithilfe des Modells gpt-5-mini aus der fr-Version in die Sprache en übersetzt. Für weitere Informationen zum Übersetzungsprozess konsultieren Sie https://gitlab.com/jls42/ai-powered-markdown-translator