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 :
- Instancja
EC2uruchamiającaUbuntu Server. - Skrypt
User-Dataw bashu do automatyzacji instalacji i konfiguracji komponentów niezbędnych dla LibreChat. Terraformdo zdefiniowania i provisionowania infrastruktury AWS potrzebnej do wdrożenia LibreChat.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