Szukaj

infrastructureblogia

Automatyczne wdrożenie LibreChat na EC2 AWS

Automatyczne wdrożenie LibreChat na EC2 AWS

Ten artykuł przedstawia projekt POC (Proof of Concept) dotyczący zautomatyzowanego wdrożenia LibreChat na AWS EC2, wykorzystujący Terraform do orkiestracji infrastruktury zgodnie z zasadą Infrastructure as Code, skrypt User-Data w Bash do instalacji komponentów na EC2 oraz AWS Systems Manager do scentralizowanego zarządzania kluczami API i śledzenia postępu wdrożenia. Nacisk położony jest na automatyzację i optymalizację kosztów poprzez użycie instancji Spot.

Wprowadzenie

LibreChat to zaawansowana aplikacja chatbota, która integruje wiele modeli AI, w tym Mistral AI, i oferuje funkcje takie jak wyszukiwanie w rozmowach, tworzenie niestandardowych presetów, edycja i kontynuacja wiadomości oraz integracja wtyczek. Zapewnia wielojęzyczny i multimodalny interfejs użytkownika, obsługę wielu użytkowników z bezpiecznym uwierzytelnianiem i jest w pełni open-source. Projekt bada jej wdrożenie na AWS EC2, wykorzystując zaawansowane narzędzia do w pełni zautomatyzowanej implementacji.

Architektura

W wdrożonej architekturze znajdują się następujące elementy :

  1. Instancja EC2 uruchamiająca Ubuntu Server.
  2. Skrypt User-Data w bashu do automatyzacji instalacji i konfiguracji komponentów niezbędnych dla LibreChat.
  3. Terraform do zdefiniowania i provisionowania infrastruktury AWS potrzebnej do wdrożenia LibreChat.
  4. AWS Systems Manager (SSM) do przechowywania i pobierania kluczy API wymaganych przez LibreChat oraz śledzenia postępu wdrożenia.

Automatyzacja i Infrastructure as Code

Terraform

Terraform to narzędzie pozwalające definiować i provisionować infrastrukturę jako kod (Infrastructure as Code). W tym projekcie Terraform jest używany do tworzenia i konfigurowania instancji EC2 oraz powiązanych zasobów AWS, takich jak grupy zabezpieczeń i role IAM.

User-Data

Skrypt User-Data w bashu jest wykonywany podczas pierwszego uruchomienia instancji EC2. Automatyzuje instalację i konfigurację komponentów wymaganych przez LibreChat, takich jak Docker, Docker Compose, Git, Node.js i NPM. Skrypt User-Data umożliwia również konfigurację kluczy API potrzebnych przez LibreChat, takich jak klucze OpenAI, MistralAI, Anthropic, Google API i Google CSE ID, pobierając je z AWS Systems Manager (SSM).

W skrypcie User-Data zdefiniowana jest funkcja update_status służąca do aktualizowania statusu wdrożenia za pomocą AWS SSM. Funkcja ta pozwala monitorować stan wdrożenia i szybko wykrywać ewentualne problemy. Skrypt User-Data również umieszcza funkcję update_registration.sh i dodaje ją do crona, aby włączać lub wyłączać rejestracje.

Przykład funkcji 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
}

Przykład funkcji 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

Funkcja update_registration.sh jest używana do aktualizacji statusu włączenia rejestracji w SSM Parameter Store oraz w pliku konfiguracyjnym LibreChat. Usługa LibreChat jest następnie restartowana, aby uwzględnić wprowadzone zmiany.

Śledzenie postępu wdrożenia za pomocą SSM

AWS Systems Manager (SSM) to usługa umożliwiająca centralne zarządzanie i konfigurowanie instancji EC2. W tym projekcie SSM jest wykorzystywany do przechowywania i pobierania kluczy API potrzebnych przez LibreChat oraz do śledzenia postępu wdrożenia.

W skrypcie export.sh zdefiniowana jest również funkcja check_deployment_status, która sprawdza status wdrożenia za pomocą AWS SSM. Funkcja ta pozwala śledzić w czasie rzeczywistym stan wdrożenia i szybko wykrywać ewentualne problemy.

Przykład funkcji 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
}
}

Status wdrożenia jest przechowywany w parametrze SSM, co umożliwia sprawdzenie stanu wdrożenia w dowolnym momencie i z dowolnego miejsca.

Obsługa błędów za pomocą set -e i trap 'error_handler' ERR

W skrypcie User-Data wdrożono solidną obsługę błędów, używając set -e i trap 'error_handler' ERR. Podejście to zapewnia natychmiastowe zatrzymanie skryptu w przypadku błędu i dostarcza szczegółowych informacji o napotkanym problemie.

Poniżej znajduje się fragment skryptu User-Data z zintegrowaną obsługą błędów :

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

Funkcja error_handler jest wywoływana za każdym razem, gdy w skrypcie wystąpi błąd. Przyjmuje komunikat błędu jako parametr, wypisuje go w konsoli, aktualizuje status wdrożenia za pomocą AWS SSM przy użyciu funkcji update_status, i kończy skrypt z kodem błędu.

Dzięki set -e i trap 'error_handler' ERR, wdrożenie zostaje zatrzymane natychmiast po wystąpieniu błędu, co ułatwia debugowanie i rozwiązywanie problemów. Dodatkowo aktualizacja statusu wdrożenia w AWS SSM pozwala śledzić postęp wdrożenia i szybko wykrywać potencjalne problemy.

Obniżanie kosztów za pomocą Spot Instances

Spot Instances to instancje EC2, które pozwalają korzystać z niewykorzystanych zasobów po niższych cenach w porównaniu do instancji na żądanie. W tym projekcie używane są Spot Instances w celu zmniejszenia kosztów hostingu aplikacji. Skrypt User-Data obsługuje konfigurację Spot Instances, co pozwala osiągnąć znaczne oszczędności bez kompromisu w zakresie wydajności aplikacji.

Wspólne użycie export.sh w zautomatyzowanym wdrożeniu LibreChat na AWS EC2

W kontekście zautomatyzowanego wdrożenia LibreChat na AWS EC2 stworzono skrypt shell o nazwie export.sh, ułatwiający zarządzanie różnymi zadaniami związanymi z wdrożeniem i konfiguracją infrastruktury. Skrypt ten jest używany zarówno z lokalnej stacji roboczej, jak i w pipeline’ach GitLab CI, co zapewnia wspólne i spójne wykorzystanie zawartych w nim funkcji.

Skrypt export.sh agreguje kilka przydatnych funkcji do wdrożenia i zarządzania infrastrukturą AWS. Wśród nich znajdują się:

  • terraform_plan : generuje plan Terraform, aby podejrzeć zmiany, które zostaną wprowadzone w infrastrukturze.
  • terraform_apply : aplikuje zmiany Terraform na infrastrukturze AWS.
  • terraform_destroy : usuwa zasoby utworzone przez Terraform podczas wdrożenia.
  • check_deployment_status : sprawdza stan trwającego wdrożenia, zapytując AWS SSM.

Oto przykład użycia tych funkcji w pipeline GitLab CI :

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"

W tym przykładzie funkcje terraform_plan, terraform_apply i terraform_destroy są używane w różnych etapach pipeline’a GitLab CI. Po załadowaniu (sourcowaniu) skryptu export.sh, zawarte w nim funkcje stają się dostępne w środowisku wykonawczym pipeline’a.

Wspólne użycie export.sh między lokalnym stanowiskiem pracy a GitLab CI ułatwia zarządzanie zautomatyzowanym wdrożeniem LibreChat na AWS EC2. Funkcje zawarte w tym skrypcie upraszczają zadania i zapewniają spójność w operacjach wykonywanych na infrastrukturze.

Aby dowiedzieć się więcej o projekcie i zobaczyć kod źródłowy, odwiedź repozytorium GitLab. Znajdziesz tam szczegółowe informacje na temat architektury, konfiguracji i dobrych praktyk zastosowanych w tym projekcie zautomatyzowanego wdrożenia.

Domyślne połączenie z instancją przez SSM

AWS Systems Manager (SSM) umożliwia domyślne połączenie z instancją EC2 bez konieczności używania SSH. Ta funkcja upraszcza dostęp do instancji i zwiększa bezpieczeństwo poprzez unikanie wystawiania portu SSH do Internetu. Nadal jednak możliwy jest dostęp do instancji przez SSH po otwarciu odpowiedniego ruchu za pomocą powiązanej zmiennej.

Samopodpisany certyfikat SSL i bezpieczeństwo

Domyślnie LibreChat udostępnia port 80 bez włączonego portu 443. W tym projekcie port 443 jest domyślnie włączony z wykorzystaniem samopodpisanego certyfikatu, a port 80 przekierowuje na port 443. Chociaż przeglądarka wyświetli ostrzeżenie dotyczące HTTPS, użycie protokołu HTTPS zapewnia ochronę przed kradzieżą haseł w sieci.

Wnioski

Ten projekt bada sposób wdrożenia i konfiguracji LibreChat na instancji EC2 AWS, wykorzystując Terraform do zarządzania infrastrukturą, skrypt User-Data w bashu do instalacji komponentów oraz AWS Systems Manager do scentralizowanego zarządzania konfiguracjami i śledzenia postępu wdrożenia. Nacisk położono również na obniżenie kosztów dzięki Spot Instances oraz na bezpieczeństwo poprzez użycie samopodpisanego certyfikatu SSL i konfigurację nagłówków bezpieczeństwa HTTP.

Korzystając z tego projektu, będziesz w stanie efektywnie, bezpiecznie i ekonomicznie wdrożyć i skonfigurować LibreChat na instancji EC2 AWS. Projekt ten można rozszerzyć i dostosować do wdrożenia innych aplikacji webowych na AWS, stosując te same zasady automatyzacji, Infrastructure as Code i scentralizowanego zarządzania konfiguracjami.

Kontynuacja eksploracji projektu na GitLab

Aby uzyskać dogłębne zrozumienie i szczegóły techniczne dotyczące wdrożenia LibreChat na AWS EC2, w tym architekturę i konfiguracje, gorąco zachęcam do zapoznania się z README projektu na GitLab. Ten artykuł wprowadza projekt, jego kluczowe koncepcje i korzyści z takiego wdrożenia, ale to w linku do projektu znajdziesz wszystkie szczegóły.

Ten dokument został przetłumaczony z wersji fr na język pl przy użyciu modelu gpt-5-mini. Aby uzyskać więcej informacji na temat procesu tłumaczenia, zobacz https://gitlab.com/jls42/ai-powered-markdown-translator