يقدم هذا المقال مشروع POC (دليل إثبات المفهوم) للنشر الآلي لـ LibreChat على AWS EC2، باستخدام Terraform لتنسيق البنية التحتية وفقًا لمبدأ البنية التحتية كرمز، وبرنامج User-Data Bash لتثبيت المكونات على EC2، وAWS Systems Manager لإدارة مركزية لمفاتيح API وتتبع النشر. يتم التركيز على الأتمتة وتحسين التكاليف من خلال استخدام حالات Spot.

مقدمة

LibreChat هو تطبيق متقدم للدردشة يتكامل مع عدة نماذج من الذكاء الاصطناعي، بما في ذلك Mistral AI، ويقدم ميزات مثل البحث في المحادثات، إنشاء إعدادات مسبقة مخصصة، تحرير واستمرار الرسائل، بالإضافة إلى تكامل الملحقات. يقدم واجهة مستخدم متعددة اللغات ومتعددة الوسائط، إدارة متعددة المستخدمين بتوثيق آمن، وهو مفتوح المصدر بالكامل. يستكشف هذا المشروع نشره على AWS EC2 باستخدام أدوات متقدمة لتنفيذ أتمتة بالكامل.

البنية

تشمل البنية المنتشرة العناصر التالية:

  1. حالة EC2 تعمل بنظام Ubuntu Server.
  2. برنامج User-Data بلغة bash لأتمتة تثبيت وتكوين المكونات اللازمة لـ LibreChat.
  3. Terraform لتعريف وتوفير البنية التحتية لـ AWS اللازمة لنشر LibreChat.
  4. AWS Systems Manager (SSM) لتخزين واسترجاع مفاتيح الـ API اللازمة لـ LibreChat ومتابعة تقدم النشر.

الأتمتة والبنية التحتية كرمز

Terraform

Terraform هو أداة تتيح تعريف وتوفير البنية التحتية كرمز (Infrastructure as Code). في هذا المشروع، يتم استخدام Terraform لإنشاء وتكوين حالة EC2، بالإضافة إلى موارد AWS المرتبطة، مثل مجموعات الأمان والأدوار IAM.

User-Data

يتم تنفيذ برنامج User-Data بلغة bash عند بدء تشغيل حالة EC2 لأول مرة. يقوم بأتمتة تثبيت وتكوين المكونات اللازمة لـ LibreChat، مثل Docker، Docker Compose، Git، Node.js و NPM. يتيح برنامج User-Data أيضًا تكوين مفاتيح الـ API اللازمة لـ LibreChat، مثل مفاتيح OpenAI، MistralAI، Anthropic، Google API و Google CSE ID، باسترجاعها من AWS Systems Manager (SSM).

يتم تعريف وظيفة update_status في برنامج User-Data لتحديث حالة النشر عبر AWS SSM. تتيح هذه الوظيفة مراقبة حالة النشر واكتشاف المشكلات بسرعة. يدفع برنامج User-Data أيضًا وظيفة update_registration.sh ويضعها في cron لتفعيل أو تعطيل التسجيلات.

مثال على وظيفة 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. يتم إعادة تشغيل خدمة LibreChat بعد ذلك لأخذ التعديلات في الاعتبار.

متابعة تقدم النشر باستخدام SSM

AWS Systems Manager (SSM) هو خدمة تتيح إدارة وتكوين حالات EC2 بشكل مركزي. في هذا المشروع، يتم استخدام SSM لتخزين واسترجاع مفاتيح الـ API اللازمة لـ LibreChat، وكذلك متابعة تقدم النشر.

يتم أيضًا تعريف وظيفة 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 يسمح بمتابعة تقدم النشر وتحديد المشاكل المحتملة بسرعة.

تخفيض التكاليف باستخدام Spot Instances

Spot Instances هي وحدات EC2 تسمح باستخدام القدرات غير المستخدمة بأسعار منخفضة مقارنةً مع الوحدات عند الطلب. في هذا المشروع، يتم استخدام Spot Instances لتخفيض تكاليف استضافة التطبيق. يدعم سكربت User-Data تكوين Spot Instances، مما يتيح الاستفادة من تخفيضات الكلفة الكبيرة دون التضحية بأداء التطبيق.

الاستخدام المشترك لـ export.sh في النشر الآلي لـ LibreChat على AWS EC2

في إطار عملية النشر الآلي لـ LibreChat على AWS EC2، تم إنشاء سكربت shell يسمى export.sh لتسهيل إدارة المهام المختلفة المتعلقة بالنشر وتكوين البنية التحتية. يتم استخدام هذا السكربت من كل من محطة العمل المحلية وفي خطوط GitLab CI، مما يتيح استخدامًا مشتركًا ومتسقًا للوظائف التي يحتوي عليها.

يجمع سكربت export.sh بين العديد من الوظائف المفيدة للنشر وإدارة البنية التحتية لـ AWS. من بين هذه الوظائف نجد:

  • terraform_plan : يخلق خطة Terraform لمعاينة التعديلات التي ستطرأ على البنية التحتية.
  • terraform_apply : يطبق تعديلات Terraform على بنية AWS التحتية.
  • 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 ، تصبح الوظائف التي يحتويها متاحة في بيئة التنفيذ الخاصة بخط الأنابيب.

يسمح الاستخدام المشترك لـ export.sh بين محطة العمل المحلية و GitLab CI بتسهيل إدارة عملية النشر الآلي لـ LibreChat على AWS EC2. تقوم الوظائف الموجودة في هذا السكربت بتبسيط المهام وضمان اتساق العمليات التي تجرى على البنية التحتية.

لمعرفة المزيد عن المشروع ومراجعة الشيفرة المصدرية، قم بزيارة مستودع GitLab. ستجدون هناك معلومات مفصلة عن بنية المشروع وتكوينه والممارسات الجيدة المُطبقة في هذا المشروع للنشر الآلي.

الاتصال الافتراضي باستخدام SSM على المثيل

يسمح AWS Systems Manager (SSM) بالاتصال افتراضيًا بالمثيل EC2 دون الحاجة لاستخدام SSH. تُبسط هذه الميزة الوصول إلى المثيل وتعزز الأمن من خلال تجنب تعريض منفذ SSH للإنترنت. ومع ذلك، لا يزال من الممكن الوصول إلى المثيل عبر SSH عن طريق فتح التدفق المناسب باستخدام المتغير المرتبط.

شهادة SSL موقعة ذاتياً والأمان

بشكل افتراضي، يجعل Librechat المنفذ 80 متاحًا دون تفعيل المنفذ 443. في هذا المشروع، يتم تفعيل المنفذ 443 بشكل افتراضي مع شهادة موقعة ذاتيًا، ويتم إعادة توجيه المنفذ 80 إلى المنفذ 443. على الرغم من ظهور تحذير HTTPS في المتصفح، إلا أن استخدام بروتوكول HTTPS يوفر أمانًا ضد سرقة كلمة المرور على الشبكة.

الخاتمة

يستكشف هذا المشروع كيفية نشر وتكوين LibreChat على مثيل AWS EC2 باستخدام Terraform للبنية التحتية، وبرنامج User-Data Bash لتثبيت المكونات، وAWS Systems Manager لإدارة التكوينات مركزيًا وتتبع تقدم النشر. كما يتم التركيز على خفض التكاليف باستخدام Spot Instances والأمان باستخدام شهادة SSL موقعة ذاتيًا وتكوين رؤوس الأمان HTTP.

باستخدام هذا المشروع، ستكون قادرًا على نشر وتكوين LibreChat على مثيل AWS EC2 بشكل فعال وآمن واقتصادي. يمكن توسيع هذا المشروع وتكييفه لنشر تطبيقات ويب أخرى على AWS باستخدام نفس مبادئ الأتمتة، والبنية كرمز، والإدارة المركزية للتكوينات.

متابعة الاستكشاف مع مشروع GitLab

لفهم أعمق وللتفاصيل التقنية لنشر LibreChat على AWS EC2، بما في ذلك البنية والتكوينات، أشجعكم بشدة على مراجعة README للمشروع على GitLab. يقدم هذا المقال المشروع ومفاهيمه الرئيسية وفوائد هذا النشر، ولكن في رابط المشروع ستجدون جميع التفاصيل.

هذا المستند مترجم من النسخة fr إلى اللغة ar باستخدام النموذج gpt-4o. لمزيد من المعلومات حول عملية الترجمة، يرجى زيارة https://gitlab.com/jls42/ai-powered-markdown-translator