यह लेख AWS EC2 पर LibreChat के स्वचालित परिनियोजन के लिए एक प्रोजेक्ट POC (प्रूफ ऑफ कॉन्सेप्ट) प्रस्तुत करता है, जो कि टेरेफॉर्म का उपयोग करके इंफ्रास्ट्रक्चर को Infrastructure as Code के सिद्धांत के अनुसार आयोजीत करता है, EC2 पर घटकों को स्थापित करने के लिए एक User-Data Bash स्क्रिप्ट, और AWS Systems Manager का उपयोग केंद्रीयीकृत API कुंजियों प्रबंधन और परिनियोजन की निगरानी के लिए करता है। यह स्वचालन और लागत अनुकूलन पर जोर देता है स्पॉट इंस्टेंस के उपयोग के माध्यम से।

परिचय

LibreChat एक उन्नत चैटबोट एप्लिकेशन है जो कई AI मॉडल्स को एकीकृत करता है, जिसमें मिस्ट्रल एआई भी शामिल है, और बातचीत में खोज, कस्टम प्रीसेट्स बनाने, संदेशों को संपादित करने और आगे बढ़ाने, और प्लगइन्स को एकीकृत करने जैसी सुविधाएं प्रदान करता है। यह बहु-भाषी और बहु-मॉडल यूजर इंटरफेस, सुरक्षित प्रामाणीकरण के साथ बहु-उपयोगकर्ता प्रबंधन, और पूरी तरह से ओपन-सोर्स है। इस प्रोजेक्ट का उद्देश्य AWS EC2 पर इसके परिनियोजन का पता लगाना है, उन्नत उपकरणों का उपयोग करके बिल्कुल स्वचालित कार्यान्वयन के लिए।

आर्किटेक्चर

इसका आर्किटेक्चर निम्नलिखित तत्वों का समावेश करता है:

  1. एक ईसी2 इंस्टेंस जो उबंटू सर्वर चला रहा है।
  2. एक यूजर-डेटा bash स्क्रिप्ट जो LibreChat के लिए आवश्यक घटकों की स्थापना और कॉन्फिगरेशन को स्वचालित करता है।
  3. टेरेफॉर्म जो LibreChat के परिनियोजन के लिए आवश्यक AWS इंफ्रास्ट्रक्चर को परिभाषित और प्रोविजन करता है।
  4. AWS सिस्टम्स मैनेजर (SSM) जो LibreChat के लिए आवश्यक API कुंजियों को स्टोर और पुनः प्राप्त करता है और परिनियोजन की प्रगति को ट्रैक करता है।

स्वचालन और इंफ्रास्ट्रक्चर एज़ कोड

टेरेफॉर्म

टेरेफॉर्म एक उपकरण है जो इंफ्रास्ट्रक्चर को कोड के रूप में परिभाषित और प्रोविजन करता है (Infrastructure as Code)। इस प्रोजेक्ट में, टेरेफॉर्म का उपयोग EC2 इंस्टेंस और संबंधित AWS संसाधनों, जैसे कि सुरक्षा समूह और IAM भूमिकाओं के निर्माण और कॉन्फिगर करने के लिए किया जाता है।

यूजर-डेटा

पहली बार EC2 इंस्टेंस के शुरू होने पर यूजर-डेटा स्क्रिप्ट को चलाया जाता है। यह स्क्रिप्ट LibreChat के लिए आवश्यक घटकों, जैसे कि डॉकर, डॉकर कंपोज़, गिट, Node.js और NPM को इंस्टॉल और कॉन्फिगर करता है। यूजर-डेटा स्क्रिप्ट API कुंजियों का भी कॉन्फिगर करता है, जैसे कि OpenAI कुंजियाँ, MistralAI कुंजियाँ, एंथ्रोपिक कुंजियाँ, Google API और Google CSE ID को AWS सिस्टम्स मैनेजर (SSM) से पुनः प्राप्त करके।

यूजर-डेटा स्क्रिप्ट में एक update_status फ़ंक्शन परिभाषित किया गया है जो AWS SSM के माध्यम से परिनियोजन की स्थिति को अपडेट करता है। यह फ़ंक्शन परिनियोजन की स्थिति की निगरानी करने और किसी भी संभावित समस्याओं का शीघ्र पता लगाने की अनुमति देता है। यूजर-डेटा स्क्रिप्ट update_registration.sh फ़ंक्शन को भी पुश करता है और इसे रजिस्ट्रेशन को सक्षम या अक्षम करने के लिए क्रॉन में सेट करता है।

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
}

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

update_registration.sh फ़ंक्शन का उपयोग SSM Parameter Store और LibreChat के कॉन्फिगरेशन फ़ाइल में रजिस्ट्रेशन के सक्रियण की स्थिति को अपडेट करने के लिए किया जाता है। उसके बाद सेवा को परिवर्तनों को मान्य करने के लिए पुनः प्रारंभ किया जाता है।

SSM के साथ परिनियोजन की प्रगति की निगरानी

AWS सिस्टम्स मैनेजर (SSM) एक सेवा है जो केंद्रीयीकृत रूप से EC2 इंस्टेंसों को प्रबंधित और कॉन्फिगर करने की अनुमति देता है। इस प्रोजेक्ट में, SSM का उपयोग LibreChat के लिए आवश्यक API कुंजियों को स्टोर और पुनः प्राप्त करने के लिए किया जाता है, साथ ही परिनियोजन की प्रगति को ट्रैक करने के लिए भी।

एक check_deployment_status फ़ंक्शन भी export.sh स्क्रिप्ट में परिभाषित किया गया है जो AWS SSM के माध्यम से परिनियोजन की स्थिति की जाँच करता है। यह फ़ंक्शन डिप्लॉयमेंट की प्रगति को लाइव ट्रैक करने और संभावित समस्याओं का शीघ्रता से पता लगाने की अनुमति देता है।

फ़ंक्शन 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
}
}

डिप्लॉयमेंट स्टेटस एक SSM पैरामीटर में संग्रहीत होता है, जिससे डिप्लॉयमेंट की स्थिति को किसी भी समय और किसी भी स्थान से देखा जा सकता है।

set -e और trap 'error_handler' ERR के साथ त्रुटि प्रबंधन

User-Data स्क्रिप्ट में, set -e और trap 'error_handler' ERR का उपयोग करके मजबूत त्रुटि प्रबंधन लागू किया गया है। यह दृष्टिकोण यह सुनिश्चित करता है कि यदि कोई त्रुटि होती है, तो स्क्रिप्ट तुरंत बंद हो जाती है और मिली समस्या के बारे में विस्तृत जानकारी प्रदान करती है।

यहाँ त्रुटि प्रबंधन के साथ एक User-Data स्क्रिप्ट का अंश दिया गया है:

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

फ़ंक्शन error_handler हर बार उस त्रुटि को कॉल किया जाता है जब स्क्रिप्ट में कोई त्रुटि होती है। यह एक त्रुटि संदेश को पैरामीटर के रूप में लेता है, इसे कंसोल में दिखाता है, AWS SSM का उपयोग करके फ़ंक्शन update_status के माध्यम से डिप्लॉयमेंट की स्थिति को अपडेट करता है, और एक त्रुटि कोड के साथ स्क्रिप्ट से बाहर निकलता है।

set -e और trap 'error_handler' ERR के धन्यवाद, डिप्लॉयमेंट त्रुटि होने पर तुरंत रुक जाता है, जिससे डीबगिंग और समस्या समाधान आसान हो जाता है। इसके अतिरिक्त, AWS SSM में डिप्लॉयमेंट स्थिति को अद्यतन करना डिप्लॉयमेंट की प्रगति को ट्रैक करने और संभावित समस्याओं का शीघ्र पता लगाने की अनुमति देता है।

स्पॉट इंस्टांस के साथ लागत में कमी

स्पॉट इंस्टांस ऐसे EC2 इंस्टांस हैं जो अनावश्यक क्षमताओं का उपयोग कम कीमतों पर करने की अनुमति देते हैं जैसा की ऑन-डिमांड इंस्टांस की तुलना में होती हैं। इस परियोजना में, स्पॉट इंस्टांस का उपयोग एप्लिकेशन होस्टिंग की लागत को कम करने के लिए किया गया है। User-Data स्क्रिप्ट स्पॉट इंस्टांस की कॉन्फ़िगरेशन को सपोर्ट करती है, जिससे बिना प्रदर्शन से समझौता किए लागत में महत्वपूर्ण बचत होती है।

AWS EC2 पर LibreChat के स्वचालित डिप्लॉयमेंट में export.sh का सामान्य उपयोग

AWS EC2 पर LibreChat के स्वचालित डिप्लॉयमेंट के हिस्से के रूप में, एक शेल स्क्रिप्ट नामक export.sh को डिप्लॉयमेंट और अवसंरचना की कॉन्फ़िगरेशन से संबंधित विभिन्न कार्यों का प्रबंधन करने के लिए बनाया गया है। इस स्क्रिप्ट का उपयोग स्थानीय वर्कस्टेशन से और GitLab CI पाइपलाइनों में दोनों स्थानों से किया जाता है, इस प्रकार यह एक सामान्य और सुसंगत उपयोग सुनिश्चित करता है।

स्क्रिप्ट export.sh में कई उपयोगी फ़ंक्शन शामिल हैं जो डिप्लॉयमेंट और AWS अवसंरचना के प्रबंधन में मदद करते हैं। इनमें शामिल हैं:

  • terraform_plan : अवसंरचना में किए जाने वाले परिवर्तनों का पूर्वावलोकन करने के लिए एक Terraform योजना बनाता है।
  • terraform_apply : AWS अवसंरचना पर Terraform परिवर्तनों को लागू करता है।
  • terraform_destroy : डिप्लॉयमेंट के दौरान बनाई गई Terraform संसाधनों को हटाता है।
  • check_deployment_status : AWS SSM को क्वेरी करके चल रहे डिप्लॉयमेंट की स्थिति की जांच करता है।

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"

इस उदाहरण में, terraform_plan, terraform_apply, और terraform_destroy फ़ंक्शनों का उपयोग GitLab CI पाइपलाइन के विभिन्न चरणों में किया जाता है। स्क्रिप्ट export.sh को सोर्स करने से, इसमें समाहित फ़ंक्शन्स पाइपलाइन के रनटाइम वातावरण में उपयोग में आने लगते हैं।

स्थानीय कार्यस्थल और GitLab CI के बीच export.sh के सामान्य उपयोग से AWS EC2 पर LibreChat के स्वचालित डिप्लॉयमेंट के प्रबंधन में आसानी होती है। इस स्क्रिप्ट में शामिल फ़ंक्शन्स कार्यों को सरल बनाते हैं और अवसंरचना पर किए जाने वाले ऑपरेशनों में सुसंगति सुनिश्चित करते हैं।

इस परियोजना के बारे में अधिक जानने और सोर्स कोड को देखने के लिए, GitLab रिपॉज़िटरी पर जाएँ। आपको इस स्वचालित परिनियोजन परियोजना में लागू की गई वास्तुकला, कॉन्फ़िगरेशन और सर्वोत्तम अभ्यासों पर विस्तृत जानकारी मिलेगी।

डिफ़ॉल्ट SSM के साथ इंस्टेंस से कनेक्शन

AWS Systems Manager (SSM) बिना SSH का उपयोग किए EC2 इंस्टेंस से डिफ़ॉल्ट रूप से कनेक्ट होने की अनुमति देता है। यह सुविधा इंस्टेंस तक पहुँच को सरल बनाती है और SSH पोर्ट को इंटरनेट पर उजागर करने से बचाकर सुरक्षा को मजबूत करती है। हालांकि, उपयुक्त वेरिएबल का उपयोग करके SSH के माध्यम से भी इंस्टेंस तक पहुंचा जा सकता है।

स्व-हस्ताक्षरित SSL प्रमाणपत्र और सुरक्षा

डिफ़ॉल्ट रूप से, LibreChat पोर्ट 80 को सक्रिय किए बिना एक्सेसिबल बनाता है। इस परियोजना में, पोर्ट 443 डिफ़ॉल्ट रूप से एक स्व-हस्ताक्षरित प्रमाणपत्र के साथ सक्रिय किया गया है, और पोर्ट 80 पोर्ट 443 को पुनर्निर्देशित करता है। हालांकि ब्राउज़र में HTTPS चेतावनी दिखाई देती है, HTTPS प्रोटोकॉल का उपयोग नेटवर्क पर पासवर्ड चोरी के खिलाफ सुरक्षा प्रदान करता है।

निष्कर्ष

यह परियोजना, Terraform का उपयोग करके EC2 AWS इंस्टेंस पर LibreChat को तैनात और कॉन्फ़िगर करने के तरीके का पता लगाती है, कंपोनेंट्स की स्थापना के लिए बैश में एक उपयोगकर्ता-डेटा स्क्रिप्ट का उपयोग करके, और केंद्रीयीकृत कॉन्फ़िगरेशन प्रबंधन और परिनियोजन की प्रगति के लिए AWS Systems Manager का उपयोग करती है। लागतों में कटौती पर भी ध्यान दिया गया है Spot Instances का उपयोग करके और सुरक्षा पर स्व-हस्ताक्षरित SSL प्रमाणपत्र और HTTP सुरक्षा हेडर कॉन्फ़िगर करके।

इस परियोजना का उपयोग करके, आप EC2 AWS इंस्टेंस पर सुरक्षित और किफायती तरीके से LibreChat को तैनात और कॉन्फ़िगर करने में सक्षम होंगे। इस परियोजना को विस्तारित और अनुकूलित किया जा सकता है ताकि अन्य वेब अनुप्रयोगों को भी स्वचालन, इन्फ्रास्ट्रक्चर एज कोड, और केंद्रीयीकृत कॉन्फ़िगरेशन प्रबंधन के समान सिद्धांतों का उपयोग करके AWS पर तैनात किया जा सके।

GitLab परियोजना के साथ अन्वेषण जारी रखें

LibreChat के AWS EC2 पर परिनियोजन की गहरी समझ और तकनीकी विवरणों के लिए, जिसमें वास्तुकला और कॉन्फ़िगरेशन शामिल हैं, GitLab परियोजना पर README को देखने के लिए मैं आपको मजबूती के साथ प्रोत्साहित करता हूँ। यह लेख परियोजना, इसके प्रमुख अवधारणाओं और इस परिनियोजन के लाभों का परिचय देता है, लेकिन परियोजना के लिंक में आपको सभी विवरण मिलेंगे।

इस दस्तावेज़ को fr संस्करण से hi भाषा में gpt-4o मॉडल का उपयोग करके अनुवादित किया गया है। अनुवाद प्रक्रिया के बारे में अधिक जानकारी के लिए, https://gitlab.com/jls42/ai-powered-markdown-translator देखें।