Acest articol prezintă un proiect POC (Proof of Concept) pentru implementarea automată a LibreChat pe AWS EC2, utilizând Terraform pentru a orchestra infrastructura conform principiului Infrastructure as Code, un script User-Data Bash pentru a instala componentele pe EC2 și AWS Systems Manager pentru gestionarea centralizată a cheilor API și urmărirea implementării. Accentul este pus pe automatizare și optimizarea costurilor prin utilizarea instanțelor Spot.
Introducere
LibreChat este o aplicație avansată de chatbot care integrează mai multe modele AI, inclusiv Mistral AI, și oferă funcționalități precum căutarea în conversații, crearea de presetări personalizate, editarea și continuarea mesajelor, precum și integrarea de pluginuri. Oferă o interfață multilingvă și multimodală, gestionare multi-utilizator cu autentificare securizată și este complet open-source. Acest proiect explorează implementarea sa pe AWS EC2, folosind instrumente avansate pentru o punere în funcțiune complet automatizată.
Arhitectură
Arhitectura implementată include următoarele elemente:
- O instanță
EC2care ruleazăUbuntu Server. - Un script
User-Dataîn bash pentru automatizarea instalării și configurării componentelor necesare pentru LibreChat. Terraformpentru a defini și provisiona infrastructura AWS necesară implementării LibreChat.AWS Systems Manager (SSM)pentru a stoca și prelua cheile API necesare pentru LibreChat și pentru a urmări progresul implementării.
Automatizare și Infrastructură ca Cod
Terraform
Terraform este un instrument care permite definirea și provisionarea infrastructurii ca și cod (Infrastructure as Code). În acest proiect, Terraform este folosit pentru a crea și configura instanța EC2, precum și resursele AWS asociate, cum ar fi grupurile de securitate și rolurile IAM.
User-Data
Scriptul User-Data în bash este executat la primul pornire a instanței EC2. Acesta automatizează instalarea și configurarea componentelor necesare pentru LibreChat, cum ar fi Docker, Docker Compose, Git, Node.js și NPM. Scriptul User-Data permite, de asemenea, configurarea cheilor API necesare pentru LibreChat, precum cheile OpenAI, MistralAI, Anthropic, Google API și Google CSE ID, recuperându-le din AWS Systems Manager (SSM).
O funcție update_status este definită în scriptul User-Data pentru a actualiza statusul implementării prin AWS SSM. Această funcție permite monitorizarea stării implementării și detectarea rapidă a eventualelor probleme. Scriptul User-Data împinge, de asemenea, funcția update_registration.sh și o adaugă în cron pentru a activa sau dezactiva înregistrările.
Exemplu al funcției 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
}
Exemplu al funcției 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
Funcția update_registration.sh este folosită pentru a actualiza statusul activării înregistrărilor în SSM Parameter Store și în fișierul de configurație al LibreChat. Serviciul LibreChat este apoi repornit pentru a lua în calcul modificările.
Urmărirea stadiului implementării cu SSM
AWS Systems Manager (SSM) este un serviciu care permite gestionarea și configurarea instanțelor EC2 în mod centralizat. În acest proiect, SSM este utilizat pentru a stoca și prelua cheile API necesare pentru LibreChat, precum și pentru a urmări progresul implementării.
O funcție check_deployment_status este de asemenea definită în scriptul export.sh pentru a verifica statusul implementării prin AWS SSM. Această funcție permite urmărirea în timp real a stării implementării și detectarea rapidă a eventualelor probleme.
Exemplu al funcției 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
}
}
Statusul implementării este stocat într-un parametru SSM, ceea ce permite consultarea stării implementării în orice moment și din orice locație.
Gestionarea erorilor cu set -e și trap 'error_handler' ERR
În scriptul User-Data, a fost implementată o gestionare robustă a erorilor folosind set -e și trap 'error_handler' ERR. Această abordare garantează că scriptul se oprește imediat în caz de eroare și oferă informații detaliate despre problema întâmpinată.
Iată un fragment din scriptul User-Data cu gestionarea erorilor integrată:
#!/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
}
Funcția error_handler este apelată de fiecare dată când apare o eroare în script. Ea primește un mesaj de eroare ca parametru, îl afișează în consolă, actualizează statusul implementării prin AWS SSM folosind funcția update_status, și încheie scriptul cu un cod de eroare.
Datorită set -e și trap 'error_handler' ERR, implementarea se oprește de îndată ce apare o eroare, ceea ce facilitează depanarea și rezolvarea problemelor. În plus, actualizarea statusului implementării în AWS SSM permite monitorizarea progresului și detectarea rapidă a eventualelor probleme.
Reducerea costurilor cu instanțe Spot
Instanțele Spot sunt instanțe EC2 care permit utilizarea capacităților nefolosite la prețuri reduse comparativ cu instanțele on-demand. În acest proiect, sunt folosite instanțe Spot pentru a reduce costurile de găzduire a aplicației. Scriptul User-Data gestionează configurarea instanțelor Spot, ceea ce permite beneficii semnificative de cost fără a compromite performanța aplicației.
Utilizare comună a export.sh în implementarea automată a LibreChat pe AWS EC2
În cadrul implementării automate a LibreChat pe AWS EC2, a fost creat un script shell numit export.sh pentru a facilita gestionarea diferitelor sarcini legate de implementare și configurare a infrastructurii. Acest script este folosit atât de pe stația de lucru locală, cât și în pipeline-urile GitLab CI, permițând astfel utilizarea comună și coerentă a funcțiilor pe care le conține.
Scriptul export.sh reunește mai multe funcții utile pentru implementare și gestionarea infrastructurii AWS. Printre acestea se numără:
terraform_plan: generează un plan Terraform pentru a previzualiza modificările ce urmează a fi făcute în infrastructură.terraform_apply: aplică modificările Terraform asupra infrastructurii AWS.terraform_destroy: șterge resursele Terraform create în timpul implementării.check_deployment_status: verifică starea implementării în curs interogând AWS SSM.
Iată un exemplu de utilizare a acestor funcții într-un 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"
În acest exemplu, funcțiile terraform_plan, terraform_apply și terraform_destroy sunt folosite în diferite etape ale pipeline-ului GitLab CI. Prin sursarea scriptului export.sh, funcțiile pe care le conține devin accesibile în mediul de execuție al pipeline-ului.
Utilizarea comună a export.sh între stația de lucru locală și GitLab CI permite simplificarea gestionării implementării automate a LibreChat pe AWS EC2. Funcțiile din acest script simplifică sarcinile și asigură o coerență în operațiunile efectuate asupra infrastructurii.
Pentru mai multe informații despre proiect și pentru a consulta codul sursă, accesați depozitul GitLab. Veți găsi acolo informații detaliate despre arhitectură, configurație și bune practici aplicate în acest proiect de implementare automată.
Conectare implicită cu SSM la instanță
AWS Systems Manager (SSM) permite conectarea implicită la instanța EC2 fără a folosi SSH. Această funcționalitate simplifică accesul la instanță și sporește securitatea prin evitarea expunerii portului SSH la Internet. Totuși, este întotdeauna posibil să se acceseze instanța prin SSH prin deschiderea fluxului corespunzător folosind variabila asociată.
Certificat SSL auto-semnat și securitate
Implicit, LibreChat permite accesul pe portul 80 fără activarea portului 443. În acest proiect, portul 443 este activat implicit cu un certificat auto-semnat, iar portul 80 redirecționează către portul 443. Deși în browser va apărea un avertisment HTTPS, utilizarea protocolului HTTPS oferă protecție împotriva furtului parolelor pe rețea.
Concluzie
Acest proiect explorează modul de a implementa și configura LibreChat pe o instanță EC2 AWS folosind Terraform pentru infrastructură, un script User-Data în bash pentru instalarea componentelor și AWS Systems Manager pentru gestionarea centralizată a configurațiilor și urmărirea progresului implementării. Accentul este pus și pe reducerea costurilor cu instanțele Spot și pe securitate prin utilizarea unui certificat SSL auto-semnat și configurarea antetelor de securitate HTTP.
Folosind acest proiect, veți putea implementa și configura LibreChat pe o instanță EC2 AWS într-un mod eficient, sigur și economic. Proiectul poate fi extins și adaptat pentru a implementa și alte aplicații web pe AWS, utilizând aceleași principii de automatizare, Infrastructură ca Cod și gestionare centralizată a configurațiilor.
Continuarea explorării cu proiectul GitLab
Pentru o înțelegere aprofundată și detalii tehnice despre implementarea LibreChat pe AWS EC2, inclusiv arhitectura și configurațiile, vă încurajez să consultați README-ul proiectului pe GitLab. Acest articol introduce proiectul, conceptele cheie și avantajele acestei implementări, dar veți găsi toate detaliile în linkul către proiect.
Acest document a fost tradus din versiunea fr în limba ro folosind modelul gpt-5-mini. Pentru mai multe informații despre procesul de traducere, consultați https://gitlab.com/jls42/ai-powered-markdown-translator