Ten artykuł przedstawia projekt POC (Proof of Concept) dla zautomatyzowanego wdrażania LibreChat na AWS EC2, używając Terraform do orkiestracji infrastruktury zgodnie z zasadą Infrastructure as Code, skryptu User-Data Bash do instalacji komponentów na EC2 i AWS Systems Manager do centralnego zarządzania kluczami API i monitorowania wdrożenia. Skupiono się na automatyzacji i optymalizacji kosztów poprzez wykorzystanie instancji Spot.
Wprowadzenie
LibreChat to zaawansowana aplikacja chatbot, która integruje kilka modeli AI, w tym Mistral AI, i oferuje funkcje takie jak wyszukiwanie w rozmowach, tworzenie niestandardowych presetów, edycję i kontynuację wiadomości, a także integrację wtyczek. Oferuje interfejs użytkownika w wielu językach i trybach, zarządzanie wieloma użytkownikami z bezpiecznym uwierzytelnianiem i jest całkowicie open-source. Projekt ten eksploruje jego wdrażanie na AWS EC2, wykorzystując zaawansowane narzędzia do w pełni zautomatyzowanej implementacji.
Architektura
Zaimplementowana architektura obejmuje następujące elementy:
- Instancję
EC2
uruchamiającąUbuntu Server
. - Skrypt
User-Data
w bash do automatyzacji instalacji i konfiguracji wymaganych komponentów dla LibreChat. Terraform
do definiowania i provisioningu potrzebnej infrastruktury AWS do wdrożenia LibreChat.AWS Systems Manager (SSM)
do przechowywania i pobierania kluczy API potrzebnych dla LibreChat oraz monitorowania postępu wdrożenia.
Automatyzacja i Infrastructure as Code
Terraform
Terraform to narzędzie, które umożliwia definiowanie i provisioning infrastruktury jako kodu (Infrastructure as Code). W tym projekcie Terraform jest używany do tworzenia i konfiguracji instancji EC2, a także powiązanych zasobów AWS, takich jak grupy zabezpieczeń i role IAM.
User-Data
Skrypt User-Data w bash jest wykonywany przy pierwszym uruchomieniu instancji EC2. Automatyzuje instalację i konfigurację wymaganych komponentów dla LibreChat, takich jak Docker, Docker Compose, Git, Node.js i NPM. Skrypt User-Data umożliwia również konfigurację kluczy API potrzebnych dla LibreChat, takich jak klucze OpenAI, MistralAI, Anthropic, Google API i Google CSE ID, poprzez pobieranie ich z AWS Systems Manager (SSM).
W skrypcie User-Data zdefiniowana jest funkcja update_status
do aktualizowania statusu wdrożenia za pomocą AWS SSM. Funkcja ta umożliwia monitorowanie stanu wdrożenia i szybkie wykrywanie ewentualnych problemów. Skrypt User-Data przesyła również funkcję update_registration.sh
i ustawia ją w cron do aktywacji lub dezaktywacji rejestracji.
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
służy do aktualizacji statusu aktywacji rejestracji w SSM Parameter Store oraz pliku konfiguracyjnego LibreChat. Serwis LibreChat jest następnie restartowany, aby wdrożyć zmiany.
Monitorowanie postępu wdrożenia za pomocą SSM
AWS Systems Manager (SSM) to usługa pozwalająca na centralne zarządzanie i konfigurację instancji EC2. W tym projekcie SSM jest używany do przechowywania i pobierania kluczy API potrzebnych dla LibreChat oraz do monitorowania postępu wdrożenia.
Funkcja check_deployment_status
jest również zdefiniowana w skrypcie export.sh
do sprawdzania statusu wdrożenia za pomocą AWS SSM. Ta funkcja umożliwia śledzenie na żywo postępu wdrażania i szybkie wykrywanie potencjalnych problemów.
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 wdrażania jest przechowywany w parametrze SSM, co pozwala na sprawdzenie statusu wdrażania w dowolnym momencie i z dowolnego miejsca.
Zarządzanie błędami za pomocą set -e
i trap 'error_handler' ERR
W skrypcie User-Data zastosowano solidne zarządzanie błędami przy użyciu set -e
i trap 'error_handler' ERR
. To podejście gwarantuje, że skrypt zatrzymuje się natychmiast w przypadku błędu i dostarcza szczegółowe informacje o napotkanym problemie.
Oto fragment skryptu User-Data z wbudowanym zarządzaniem błędami:
#!/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 o błędzie jako parametr, wyświetla go w konsoli, aktualizuje status wdrażania za pomocą AWS SSM przy użyciu funkcji update_status
, a następnie wychodzi ze skryptu z kodem błędu.
Dzięki set -e
i trap 'error_handler' ERR
wdrażanie zatrzymuje się natychmiast po wystąpieniu błędu, co ułatwia debugowanie i rozwiązywanie problemów. Ponadto aktualizacja statusu wdrażania w AWS SSM umożliwia śledzenie postępu wdrażania i szybkie wykrywanie potencjalnych problemów.
Redukcja kosztów za pomocą Spot Instances
Spot Instances to instancje EC2, które pozwalają na wykorzystanie niewykorzystanych zasobów po obniżonych cenach w porównaniu do instancji na żądanie. W tym projekcie Spot Instances są używane, aby zmniejszyć koszty hostingu aplikacji. Skrypt User-Data obsługuje konfigurację Spot Instances, co pozwala na znaczne zmniejszenie kosztów bez kompromisów w wydajności aplikacji.
Wspólne wykorzystanie export.sh
w automatycznym wdrażaniu LibreChat na AWS EC2
W ramach automatycznego wdrażania LibreChat na AWS EC2, stworzono skrypt shell o nazwie export.sh
, aby ułatwić zarządzanie różnymi zadaniami związanymi z wdrażaniem i konfiguracją infrastruktury. Ten skrypt jest używany zarówno z lokalnego stanowiska roboczego, jak i w pipeline’ach GitLab CI, co umożliwia wspólne i spójne wykorzystanie zawartych w nim funkcji.
Skrypt export.sh
zawiera wiele przydatnych funkcji do wdrażania i zarządzania infrastrukturą AWS. Wśród nich znajdują się:
terraform_plan
: generuje plan Terraform, aby przewidzieć zmiany w infrastrukturze.terraform_apply
: stosuje zmiany Terraform do infrastruktury AWS.terraform_destroy
: usuwa zasoby stworzone przez Terraform podczas wdrażania.check_deployment_status
: sprawdza aktualny status wdrażania, 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 GitLab CI. Dzięki dołączeniu skryptu export.sh
, zawarte w nim funkcje stają się dostępne w środowisku wykonawczym pipeline.
Wspólne wykorzystanie export.sh
między stanowiskiem roboczym a GitLab CI ułatwia zarządzanie automatycznym wdrażaniem LibreChat na AWS EC2. Funkcje zawarte w tym skrypcie upraszczają zadania i zapewniają spójność operacji 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 wdrożonych w tym projekcie automatyzowanego wdrażania.
Domyślne połączenie przez SSM na instancji
AWS Systems Manager (SSM) pozwala na domyślne połączenie z instancją EC2 bez konieczności użycia SSH. Ta funkcjonalność upraszcza dostęp do instancji i wzmacnia bezpieczeństwo, unikając narażenia portu SSH na Internet. Niemniej jednak, nadal możliwe jest uzyskanie dostępu do instancji przez SSH, otwierając odpowiedni przepływ przy użyciu przypisanej zmiennej.
Samopodpisany certyfikat SSL i bezpieczeństwo
Domyślnie, Librechat udostępnia port 80 bez aktywowania portu 443. W tym projekcie port 443 jest domyślnie aktywowany z samopodpisanym certyfikatem, a port 80 przekierowuje na port 443. Mimo że w przeglądarce pojawia się ostrzeżenie HTTPS, użycie protokołu HTTPS zapewnia bezpieczeństwo przed kradzieżą hasła w sieci.
Podsumowanie
Ten projekt bada, jak wdrożyć i skonfigurować LibreChat na instancji EC2 AWS, używając Terraform do infrastruktury, skryptu User-Data w bash do instalacji komponentów oraz AWS Systems Manager do centralnego zarządzania konfiguracjami i monitorowania postępu wdrożenia. Skupiono się również na redukcji kosztów poprzez wykorzystanie Spot Instances oraz na bezpieczeństwie, używając samopodpisanego certyfikatu SSL i konfigurując nagłówki bezpieczeństwa HTTP.
Korzystając z tego projektu, będziesz w stanie wdrożyć i skonfigurować LibreChat na instancji EC2 AWS w sposób efektywny, bezpieczny i ekonomiczny. Projekt ten może być rozszerzony i dostosowany do wdrażania innych aplikacji webowych na AWS, używając tych samych zasad automatyzacji, Infrastructure as Code oraz centralnego zarządzania konfiguracjami.
Dalsza eksploracja z projektem GitLab
Aby uzyskać dogłębną wiedzę 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, kluczowe koncepcje i zalety tego wdrożenia, ale to właśnie 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-4o. Aby uzyskać więcej informacji na temat procesu tłumaczenia, odwiedź https://gitlab.com/jls42/ai-powered-markdown-translator