تقدّم هذه المقالة مشروع إثبات المفهوم (POC) للنشر الآلي لـ LibreChat على AWS EC2، باستخدام Terraform لتنظيم البنية التحتية وفق مبدأ البنية التحتية ككود، وسكربت User-Data بنظام Bash لتثبيت المكونات على EC2، وAWS Systems Manager لإدارة مفاتيح الـ API ومتابعة تقدم النشر مركزيًا. التركيز هنا على الأتمتة وتحسين التكلفة عبر استخدام مثيلات Spot.
المقدمة
LibreChat هو تطبيق متقدّم للدردشة الآلية يدمج عدّة نماذج ذكاء اصطناعي، بما في ذلك Mistral AI، ويقدّم ميزات مثل البحث ضمن المحادثات، إنشاء إعدادات مسبقة مخصّصة، تحرير واستئناف الرسائل، بالإضافة إلى تكامل الإضافات. يوفر واجهة مستخدم متعددة اللغات والوسائط، وإدارة متعددة المستخدمين مع مصادقة آمنة، ومصدره مفتوح بالكامل. يستكشف هذا المشروع نشره على AWS EC2 باستخدام أدوات متقدمة لتنفيذ نشر آلي كامل.
البنية
البنية المنشورة تتضمن العناصر التالية:
- مثيل
EC2يعملUbuntu Server. - سكربت
User-Dataبنظام bash لأتمتة تثبيت وتكوين المكونات اللازمة لـ LibreChat. Terraformلتعريف وتجهيز موارد AWS اللازمة لنشر LibreChat.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
مثيلات Spot هي مثيلات EC2 تتيح استخدام سعات غير مستغلة بأسعار أقل مقارنةً بالمثيلات حسب الطلب. في هذا المشروع، تُستخدم مثيلات Spot لتقليل تكلفة استضافة التطبيق. يتولى سكربت User-Data تكوين مثيلات Spot، مما يسمح بالاستفادة من وفورات كبيرة في التكلفة دون المساس بأداء التطبيق.
الاستخدام المشترك لـ export.sh في النشر الآلي لـ LibreChat على AWS EC2
كجزء من النشر الآلي لـ LibreChat على AWS EC2، تم إنشاء سكربت شل باسم 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 على مثيل EC2 في AWS باستخدام Terraform للبنية التحتية، وسكربت User-Data بنظام bash لتثبيت المكونات، وAWS Systems Manager لإدارة التهيئات مركزياً ومتابعة تقدم النشر. كما يركز المشروع على تقليل التكلفة باستخدام مثيلات Spot وتعزيز الأمان باستخدام شهادة SSL موقعة ذاتيًا وتكوين رؤوس أمان HTTP.
باستخدام هذا المشروع، ستكون قادرًا على نشر وتكوين LibreChat على مثيل EC2 في AWS بطريقة فعّالة وآمنة واقتصادية. يمكن توسيع وتكييف هذا المشروع لنشر تطبيقات ويب أخرى على AWS باستخدام نفس مبادئ الأتمتة، والبنية التحتية ككود، والإدارة المركزية للتهيئات.
مواصلة الاستكشاف مع مشروع GitLab
للحصول على فهم معمّق والتفاصيل الفنية لنشر LibreChat على AWS EC2، بما في ذلك البنية والتهيئات، أنصحك بشدّة بالاطلاع على README المشروع على GitLab. تقدّم هذه المقالة مدخلاً للمشروع والمفاهيم الرئيسية وفوائد هذا النشر، لكن جميع التفاصيل موجودة في رابط المشروع.
تمت ترجمة هذا المستند من النسخة fr إلى اللغة ar باستخدام النموذج gpt-5-mini. لمزيد من المعلومات حول عملية الترجمة، راجع https://gitlab.com/jls42/ai-powered-markdown-translator