Dieser Artikel stellt ein POC-Projekt (Proof of Concept) für die automatische Bereitstellung von LibreChat auf AWS EC2 vor, das Terraform zur Orchestrierung der Infrastruktur nach dem Prinzip Infrastructure as Code, ein User-Data-Bash-Skript zur Installation der Komponenten auf EC2 und AWS Systems Manager zur zentralen Verwaltung von API-Schlüsseln und zur Überwachung der Bereitstellung verwendet. Der Schwerpunkt liegt auf der Automatisierung und Kostenoptimierung durch die Nutzung von Spot-Instanzen.

Einführung

LibreChat ist eine fortschrittliche Chatbot-Anwendung, die mehrere KI-Modelle, einschließlich Mistral AI, integriert und Funktionen wie die Suche in Konversationen, die Erstellung benutzerdefinierter Voreinstellungen, die Bearbeitung und Fortsetzung von Nachrichten sowie die Integration von Plugins bietet. Sie bietet eine mehrsprachige und multimodale Benutzeroberfläche, Multi-User-Verwaltung mit sicherer Authentifizierung und ist vollständig Open-Source. Dieses Projekt untersucht seine Bereitstellung auf AWS EC2 unter Verwendung fortschrittlicher Werkzeuge für eine vollständig automatisierte Implementierung.

Architektur

Die bereitgestellte Architektur umfasst die folgenden Elemente:

  1. Eine EC2-Instanz mit Ubuntu Server.
  2. Ein User-Data-Skript in Bash zur Automatisierung der Installation und Konfiguration der für LibreChat erforderlichen Komponenten.
  3. Terraform zur Definition und Bereitstellung der für die Bereitstellung von LibreChat erforderlichen AWS-Infrastruktur.
  4. AWS Systems Manager (SSM) zur Speicherung und Abrufung der für LibreChat erforderlichen API-Schlüssel und zur Verfolgung des Fortschritts der Bereitstellung.

Automatisierung und Infrastructure as Code

Terraform

Terraform ist ein Werkzeug, das es ermöglicht, Infrastruktur als Code (Infrastructure as Code) zu definieren und bereitzustellen. 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 erforderlichen Komponenten wie Docker, Docker Compose, Git, Node.js und NPM. Das User-Data-Skript ermöglicht auch die Konfiguration der für LibreChat erforderlichen API-Schlüssel wie OpenAI, MistralAI, Anthropic, Google API und Google CSE ID, die aus AWS Systems Manager (SSM) abgerufen werden.

Eine Funktion update_status wird im User-Data-Skript definiert, um den Status der Bereitstellung über AWS SSM zu aktualisieren. Diese Funktion ermöglicht die Überwachung des Bereitstellungszustands und die schnelle Erkennung eventueller Probleme. Das User-Data-Skript übermittelt außerdem die Funktion update_registration.sh und setzt sie in Cron, um die Registrierungen zu aktivieren oder zu deaktivieren.

Beispiel für die 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 für die 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 Konfigurationsdatei von LibreChat zu aktualisieren. Der LibreChat-Dienst wird anschließend neu gestartet, um die Änderungen zu übernehmen.

Fortschrittsverfolgung der Bereitstellung mit SSM

AWS Systems Manager (SSM) ist ein Dienst, der es ermöglicht, EC2-Instanzen zentral zu verwalten und zu konfigurieren. In diesem Projekt wird SSM zur Speicherung und Abrufung der für LibreChat erforderlichen API-Schlüssel sowie zur Verfolgung des Fortschritts der Bereitstellung verwendet.

Eine Funktion check_deployment_status wird ebenfalls im Skript export.sh definiert, um den Status der Bereitstellung über AWS SSM zu überprüfen. Diese Funktion ermöglicht es, den Fortschritt der Bereitstellung in Echtzeit zu verfolgen und eventuelle Probleme schnell zu erkennen.

Beispiel für die 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 Bereitstellungsstatus wird in einem SSM-Parameter gespeichert, sodass der Status der Bereitstellung jederzeit und von jedem Ort aus eingesehen werden kann.

Fehlerbehandlung mit set -e und trap 'error_handler' ERR

Im User-Data-Skript wurde eine robuste Fehlerbehandlung implementiert, indem set -e und trap 'error_handler' ERR verwendet wird. Diese Methode stellt sicher, dass das Skript bei einem Fehler sofort stoppt und detaillierte Informationen über das aufgetretene Problem liefert.

Hier ist 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 jedes Mal aufgerufen, wenn im Skript ein Fehler auftritt. Sie nimmt eine Fehlermeldung als Parameter, gibt diese auf der Konsole aus, aktualisiert den Bereitstellungsstatus über AWS SSM mithilfe der Funktion update_status, und beendet das Skript mit einem Fehlercode.

Dank set -e und trap 'error_handler' ERR stoppt die Bereitstellung sofort bei einem Fehler, was das Debuggen und die Problembehebung erleichtert. Außerdem ermöglicht die Aktualisierung des Bereitstellungsstatus in AWS SSM, den Fortschritt der Bereitstellung zu verfolgen und eventuelle Probleme schnell zu erkennen.

Kostensenkung mit Spot Instances

Spot Instances sind EC2-Instanzen, die ungenutzte Kapazitäten zu niedrigeren Preisen als On-Demand-Instanzen nutzen. In diesem Projekt werden Spot Instances verwendet, um die Hosting-Kosten der Anwendung zu senken. Das User-Data-Skript unterstützt die Konfiguration von Spot Instances, wodurch erhebliche Kostensenkungen erreicht werden können, ohne die Leistung der Anwendung zu beeinträchtigen.

Gemeinsame Nutzung von export.sh im automatisierten Bereitstellungsprozess von LibreChat auf AWS EC2

Im Rahmen der automatisierten Bereitstellung von LibreChat auf AWS EC2 wurde ein Shell-Skript namens export.sh erstellt, um die Verwaltung der verschiedenen Aufgaben im Zusammenhang mit der Bereitstellung und Konfiguration der Infrastruktur zu erleichtern. Dieses Skript wird sowohl vom lokalen Arbeitsplatz als auch in den GitLab CI-Pipelines verwendet, wodurch eine einheitliche und konsistente Nutzung der darin enthaltenen Funktionen ermöglicht wird.

Das Skript export.sh umfasst mehrere nützliche Funktionen für die Bereitstellung und Verwaltung der AWS-Infrastruktur. Dazu gehören:

  • terraform_plan : erstellt einen Terraform-Plan, um die Änderungen an der Infrastruktur vorzuschauen.
  • terraform_apply : wendet die Terraform-Änderungen auf die AWS-Infrastruktur an.
  • terraform_destroy : löscht die während der Bereitstellung erstellten Terraform-Ressourcen.
  • check_deployment_status : überprüft den aktuellen Bereitstellungsstatus, indem es AWS SSM abfragt.

Hier ist ein Beispiel für die Verwendung 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 verschiedenen Stufen der GitLab CI-Pipeline verwendet. Durch das Sourcen des Skripts export.sh werden die darin enthaltenen Funktionen in der Ausführungsumgebung der Pipeline zugänglich.

Die gemeinsame Nutzung von export.sh zwischen dem lokalen Arbeitsplatz und GitLab CI erleichtert die Verwaltung der automatisierten Bereitstellung von LibreChat auf AWS EC2. Die in diesem Skript enthaltenen Funktionen vereinfachen die Aufgaben und gewährleisten Konsistenz in den durchgeführten Operationen auf der Infrastruktur.

Um mehr über das Projekt zu erfahren und den Quellcode einzusehen, besuchen Sie das GitLab-Repository. Sie finden dort detaillierte Informationen zur Architektur, Konfiguration und den Best Practices, die in diesem automatisierten Bereitstellungsprojekt umgesetzt wurden.

Standardverbindung mit SSM auf der Instanz

AWS Systems Manager (SSM) ermöglicht es, standardmäßig eine Verbindung zur EC2-Instanz herzustellen, ohne SSH verwenden zu müssen. Diese Funktion vereinfacht den Zugriff auf die Instanz und erhöht die Sicherheit, indem der SSH-Port nicht dem Internet ausgesetzt wird. Es ist jedoch weiterhin möglich, über SSH auf die Instanz zuzugreifen, indem der entsprechende Datenfluss mit der zugehörigen 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 wird Port 443 standardmäßig mit einem selbstsignierten Zertifikat aktiviert und Port 80 auf Port 443 umgeleitet. Obwohl eine HTTPS-Warnung im Browser erscheint, bietet die Nutzung des HTTPS-Protokolls Sicherheit gegen Passwortdiebstahl im Netzwerk.

Fazit

Dieses Projekt untersucht die Bereitstellung und Konfiguration von LibreChat auf einer AWS EC2-Instanz unter Verwendung von Terraform für die Infrastruktur, einem User-Data-Skript in Bash zur Installation der Komponenten und AWS Systems Manager zur zentralisierten Konfigurationsverwaltung und Nachverfolgung des Bereitstellungsfortschritts. Der Schwerpunkt liegt auch auf der Kostensenkung mit Spot-Instances und der Sicherheit mit einem selbstsignierten SSL-Zertifikat sowie der Konfiguration von HTTP-Sicherheitsheadern.

Mit diesem Projekt sind Sie in der Lage, LibreChat auf einer AWS EC2-Instanz effizient, sicher und kostengünstig bereitzustellen und zu konfigurieren. Dieses Projekt kann erweitert und angepasst werden, um andere Webanwendungen auf AWS unter Verwendung derselben Prinzipien der Automatisierung, Infrastructure as Code und zentralisierten Konfigurationsverwaltung bereitzustellen.

Weitere Erkundung mit dem GitLab-Projekt

Für ein tieferes Verständnis und technische Details der Bereitstellung von LibreChat auf AWS EC2, einschließlich der Architektur und Konfigurationen, empfehle ich dringend, das README des Projekts auf GitLab zu konsultieren. Dieser Artikel führt in das Projekt, seine Schlüsselkonzepte und die Vorteile dieser Bereitstellung ein, aber im Projektdokument finden Sie alle Details.

Dieses Dokument wurde von der Version fr in die Sprache de mithilfe des Modells gpt-4o übersetzt. Für weitere Informationen zum Übersetzungsprozess besuchen Sie https://gitlab.com/jls42/ai-powered-markdown-translator.