حقيبة المختبر، للتنزيل — https://github.com/hrhouma2/aiopsatlas-observabilite-labo-fr — عبر
git clone https://github.com/hrhouma2/aiopsatlas-observabilite-labo-fr.git lab3. هذا الدرس يثبّت Docker (الخطوات من 1 إلى 3)، ويستعيد هذه الحقيبة (الخطوة 4)، ويتجول فيها (الخطوة 5)، ثم يشغّل قائمة التحقق الخاصة بها (الخطوة 6). أما بدء التشغيل نفسه ففي الدرس 04.
لا تضيء لوحة قيادة السيارة بالأخضر بالكامل إلا إذا كان في المحرك وقود كافٍ وكانت الطريق أمامه خالية. .\labo.ps1 prerequis (أو ./labo.sh prerequis) يلعب هذا الدور قبل بدء تشغيل حزمة قابلية المراقبة : Docker هو المحرك، والذاكرة المخصصة هي الوقود، ومنافذ المختبر التسعة هي الطريق التي يجب أن تكون خالية. لا تشغّل demarrer (الدرس 04) إلا عندما تنتهي قائمة التحقق هذه بسطرها الأخضر : Tout est prêt. (كل شيء جاهز).
المختبر موصوف في ملف docker-compose.yml ويُدار بسكريبت بنسختين : labo.ps1 (PowerShell 5.1 أو 7، Windows) وlabo.sh (bash : Linux وmacOS وWSL 2 وGit Bash). لا تثبّت شيئاً غير Docker على جهازك : Prometheus وGrafana وLoki وAlertmanager وAlloy وnode-exporter وcAdvisor وAPI ومولّد الحمل وwebhook تعمل جميعها في حاويات. أربع من هذه الصور تُبنى على جهازك عند أول تشغيل (api وcharge وwebhook انطلاقاً من python:3.13-slim، وloki لإضافة ملف ثنائي للتحقق من الصحة إليه) ؛ أما الست الأخرى فتُنزَّل كما هي.
| النظام | ما تثبّته | ضبط الذاكرة | الخصوصية |
|---|---|---|---|
| Windows 10/11 | Docker Desktop، محرك WSL 2 | الملف %UserProfile%\.wslconfig | Set-ExecutionPolicy إذا رفض PowerShell السكريبت |
| macOS | Docker Desktop (Intel أو Apple Silicon) | Settings → Resources → Memory | لا شيء آخر ؛ curl موجود مسبقاً |
| Linux | Docker Engine + الإضافة docker-compose-plugin + curl | ذاكرة الجهاز، مباشرة | المجموعة docker ؛ لا حاجة لأي ضبط للنواة |
ما يتحقق منه prerequis، بالترتيب : وجود الأمر docker ؛ استجابة خدمة Docker الخلفية ؛ توفر docker compose (v2) ؛ وجود curl (نسخة bash فقط : يستخدم labo.ps1 أوامر PowerShell المدمجة) ؛ الذاكرة المرئية لـ Docker لا تقل عن 2 غيغابايت (4 غيغابايت موصى بها : بين 2 و4، يعرض السكريبت تحذيراً لكنه يسمح بالمتابعة) ؛ معالجان على الأقل ؛ وكل منفذ من منافذ المختبر التسعة حر، أو مستخدم مسبقاً من المختبر نفسه.
| المنفذ | الخدمة | المنفذ | الخدمة | المنفذ | الخدمة |
|---|---|---|---|---|---|
| 9090 | Prometheus | 3100 | Loki | 8080 | cAdvisor |
| 9093 | Alertmanager | 12345 | Alloy | 8000 | API الكتالوج |
| 3000 | Grafana (GRAFANA_PORT) | 9100 | node-exporter | 8090 | webhook |
المنفذ 3000 حالة خاصة. إنه منفذ Grafana، وهو المنفذ الأكثر طلباً على جهاز مطوّر : تطبيق Node، أو لوحة معلومات أخرى، أو Grafana آخر يشغله غالباً مسبقاً. تتوقع الحقيبة هذه الحالة بمتغير البيئة GRAFANA_PORT. في docker-compose.yml، يُكتب نشر منفذ Grafana هكذا :
ports:
- "${GRAFANA_PORT:-3000}:3000"ما يجب قراءته : ${GRAFANA_PORT:-3000} يساوي المتغير إذا كان معرَّفاً، و3000 خلاف ذلك. الجزء الأيمن (:3000) هو المنفذ داخل الحاوية ولا يتغير أبداً ؛ الجزء الأيسر هو المنفذ على جهازك. يقرأ السكريبتان labo.ps1 وlabo.sh المتغير نفسه : prerequis يتحقق من المنفذ الصحيح، وdemarrer يعرض العنوان الصحيح، وetat يستعلم Grafana في المكان الصحيح. التوثيق : Docker Compose — Interpolation.
Windows : تثبيت Docker Desktop مع WSL 2. نزّل Docker Desktop، واترك خيار « Use WSL 2 instead of Hyper-V » محدداً، وأعد التشغيل إذا طُلب منك ذلك، ثم شغّل Docker Desktop وانتظر حتى تستقر أيقونة الحوت. تحت WSL 2، يأخذ Docker افتراضياً نصف ذاكرتك ؛ على جهاز بـ 8 غيغابايت، هذا بالكاد يكفي. لضمان 4 غيغابايت له، أنشئ الملف C:\Users\<أنت>\.wslconfig :
notepad $env:UserProfile\.wslconfigالصق هذه الأسطر، واحفظ، ثم أعد تشغيل الجهاز الافتراضي WSL :
[wsl2]
memory=4GB
processors=4wsl --shutdownثم أعد تشغيل Docker Desktop.
macOS : تثبيت Docker Desktop والتحقق من الذاكرة. ثبّت ملف .dmg المناسب لمعالجك، وشغّل Docker Desktop، ثم افتح Settings → Resources → Advanced وتحقق من أن مؤشر Memory عند 4 غيغابايت أو أكثر. انقر « Apply & restart » إذا غيّرته.
Linux : Docker Engine وإضافة Compose وcurl والمجموعة docker. ثبّت Docker Engine وإضافة Compose وفقاً لتوثيق توزيعتك (الحزم docker-ce وdocker-ce-cli وcontainerd.io وdocker-compose-plugin)، بالإضافة إلى curl إن كان ناقصاً. ثم، لتجنب كتابة sudo مع كل أمر :
sudo usermod -aG docker $USER
newgrp docker # ou déconnecte-toi puis reconnecte-toi
docker run --rm hello-worldاستعادة حقيبة المختبر.
git clone https://github.com/hrhouma2/aiopsatlas-observabilite-labo-fr.git lab3
cd lab3تُشغَّل جميع أوامر الدورة من هذا المجلد lab3. إذا لم يكن لديك git، يعطي الزر « Code → Download ZIP » في صفحة GitHub المحتوى نفسه : فك ضغطه وأعد تسمية المجلد إلى lab3.
التجول في شجرة الملفات. اعرض قائمة الملفات (ls أو Get-ChildItem -Recurse -File). على جهاز الدورة، تحتوي الحقيبة على 32 ملفاً :
docker-compose.yml les 10 services, leurs ports, leurs volumes, leurs healthchecks
labo.ps1 le script de pilotage, Windows
labo.sh le même, bash
README.md le mode d'emploi du kit
LICENSE .gitattributes .gitignore
api/app.py l'API catalogue (FastAPI + prometheus_client)
api/donnees/cours.json les 64 cours
api/Dockerfile api/requirements.txt
charge/charge.py le générateur de trafic
charge/Dockerfile charge/requirements.txt
webhook/webhook.py le récepteur d'alertes
webhook/Dockerfile webhook/requirements.txt
prometheus/prometheus.yml les 8 cibles, scrape toutes les 15 s
prometheus/regles/alertes.yml les 10 règles d'alerte
prometheus/regles/enregistrement.yml les règles d'enregistrement (api:taux_erreurs_5m…)
alertmanager/alertmanager.yml le routage vers le webhook
loki/loki.yml loki/Dockerfile
alloy/config.alloy la collecte des logs Docker → Loki
grafana/provisioning/datasources/sources.yml Prometheus, Loki, Alertmanager
grafana/provisioning/dashboards/tableaux-de-bord.yml
grafana/provisioning/dashboards/api-catalogue.json
grafana/provisioning/dashboards/hote-conteneurs.json
grafana/provisioning/dashboards/journaux-api.json
modules/01-le-labo/requetes.txt les requêtes PromQL de ce module
modules/01-le-labo/requetes-logql.txt les requêtes LogQL de ce module
outils/generer-cours.py le script qui a fabriqué cours.jsonما يجب رؤيته : مجلد لكل خدمة، ومجلد modules/ حيث ترتّب كل وحدة من الدورة ملفات عملها. ليس عليك تعديل أي شيء قبل الوحدة 3.
تشغيل قائمة التحقق.
.\labo.ps1 prerequis./labo.sh prerequisعلى جهاز الدورة (Windows 11، Docker Desktop، PowerShell 5.1)، قبل أول تشغيل :
== Prérequis ==
✔ docker : Docker version 29.3.1, build c2be9cc
✔ le démon Docker répond
✔ docker compose : 5.1.1
✔ mémoire disponible pour Docker : 31 Go
✔ processeurs : 20
✔ port 9090 libre
✔ port 9093 libre
✔ port 3000 libre
✔ port 3100 libre
✔ port 12345 libre
✔ port 9100 libre
✔ port 8080 libre
✔ port 8000 libre
✔ port 8090 libre
Tout est prêt. Lancez : .\labo.ps1 demarrerما يجب رؤيته : أربع عشرة علامة صح، والسطر الأخير أخضر. تعتمد الإصدارات والذاكرة على جهازك. تعرض نسخة bash سطراً إضافياً، ✔ curl : présent، وتنتهي بـ Lancez : ./labo.sh demarrer. بمجرد بدء تشغيل المختبر، تعيد إعادة تشغيل prerequis عرض port 9090 : utilisé par le labo lui-même (المنفذ 9090 : مستخدم من المختبر نفسه) بدلاً من libre : هذا طبيعي، وهو ما ستراه في الدرس 04.
إذا كان المنفذ 3000 مشغولاً مسبقاً : اختيار منفذ Grafana. عرّف GRAFANA_PORT قبل prerequis، وأبقِه معرَّفاً لـ demarrer وetat :
$env:GRAFANA_PORT = 3001
.\labo.ps1 prerequisGRAFANA_PORT=3001 ./labo.sh prerequisتعرض قائمة التحقق حينها ✔ port 3001 libre بدلاً من سطر المنفذ 3000، وسيستجيب Grafana على http://localhost:3001. تبقى جميع عناوين الدورة التي تذكر المنفذ 3000 صالحة : استبدل 3000 بـ 3001. لا يعيش المتغير إلا في الطرفية الحالية ؛ إذا فتحت طرفية أخرى، أعد تعريفه.
الرسائل أدناه استُحضرت فعلياً على جهاز الدورة.
Windows فقط — يرفض PowerShell السكريبت.
.\labo.ps1 : Impossible de charger le fichier C:\Users\<toi>\lab3\labo.ps1, car l'exécution de
scripts est désactivée sur ce système. Pour plus d'informations, consultez about_Execution_Policies à l'adresse
https://go.microsoft.com/fwlink/?LinkID=135170.
+ CategoryInfo : Erreur de sécurité : (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccessسياسة التنفيذ الافتراضية في Windows تحظر السكريبتات غير الموقعة. اسمح بها لحسابك فقط :
Set-ExecutionPolicy -Scope CurrentUser RemoteSignedأجب بـ O (نعم) وأعد تشغيل .\labo.ps1 prerequis. هذا أيضاً ما يعرضه labo.ps1 عندما تشغّله دون وسيط.
Docker غير مثبّت، أو فُتحت الطرفية قبل التثبيت.
docker : Le terme «docker» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou
programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès existe, vérifiez que le chemin d'accès
est correct et réessayez.(docker: command not found تحت bash.) أغلق الطرفية وأعد فتحها : لم يُعَد تحميل PATH. إذا استمرت الرسالة، فـ Docker غير مثبّت.
الخدمة الخلفية لا تستجيب. يعرض prerequis علامة خطأ على le démon Docker répond. تحت Windows وmacOS، Docker Desktop غير مشغّل، أو لا يزال قيد البدء : انتظر حتى تستقر الأيقونة. Linux الأصلي فقط — permission denied while trying to connect to the Docker daemon socket : مستخدمك ليس في المجموعة docker، أو لم تعد تسجيل الدخول بعد usermod ؛ يجب أن يعرض id -nG المجموعة docker.
المنفذ 3000 مشغول مسبقاً ببرنامج آخر. عندما لا يكون المختبر قد بدأ بعد ويستمع برنامج آخر على منفذ Grafana، يعرض prerequis علامة الخطأ والعلاج في السطر نفسه :
✘ port 3000 déjà occupé par un autre programme — choisissez un autre port pour Grafana : $env:GRAFANA_PORT = 3001 puis relancez
Corrigez les points marqués ✘ puis relancez .\labo.ps1 prerequisافعل ما يقوله السطر (الخطوة 7). لمنفذ آخر مشغول (9090، 8000…)، تكون الرسالة déjà occupé par un autre programme — arrêtez-le ou changez le port dans docker-compose.yml (مشغول مسبقاً ببرنامج آخر — أوقفه أو غيّر المنفذ في docker-compose.yml) : اعثر على البرنامج (Get-NetTCPConnection -LocalPort 9090 تحت Windows، وsudo ss -ltnp | grep 9090 تحت Linux) وأوقفه، أو غيّر الجزء الأيسر من المنفذ في docker-compose.yml ("9091:9090").
Windows فقط — ذاكرة غير كافية. ✘ mémoire pour Docker : 1 Go — il en faut au moins 2 (fichier %UserProfile%\.wslconfig : [wsl2] memory=4GB, puis wsl --shutdown). نفّذ الخطوة 1. بين 2 و4 غيغابايت، يعرض السكريبت تحذيراً بدلاً من علامة خطأ ويسمح بالمتابعة.
Git Bash تحت Windows — السكريبتان يعملان. على جهاز الدورة، يعطي ./labo.sh prerequis المشغَّل من Git Bash القائمة نفسها التي يعطيها labo.ps1، مع السطر ✔ curl : présent إضافة والألوان معروضة. يمكنك إذن اتباع ملاحق bash في الدورة تحت Windows إذا كنت تفضل هذه الطرفية ؛ يُمرَّر المتغير حينها كما تحت Linux : GRAFANA_PORT=3001 ./labo.sh prerequis.
لا يتطلب هذا المختبر سوى شيء واحد على جهازك : Docker (Desktop أو Engine، مع إضافة Compose، وcurl لنسخة bash) ؛ الخدمات العشر تعمل جميعها في حاويات، أربع منها تُبنى على جهازك عند أول تشغيل. احسب 2 غيغابايت من الذاكرة كحد أدنى لـ Docker، و4 غيغابايت موصى بها ؛ تحت Windows، يُضبط ذلك في %UserProfile%\.wslconfig متبوعاً بـ wsl --shutdown. يجب أن تكون تسعة منافذ حرة : 9090 و9093 و3000 و3100 و12345 و9100 و8080 و8000 و8090. تُستعاد الحقيبة بـ git clone https://github.com/hrhouma2/aiopsatlas-observabilite-labo-fr.git lab3، ثم cd lab3 : 32 ملفاً، ومجلد لكل خدمة، ومجلد modules/ للدورة. .\labo.ps1 prerequis أو ./labo.sh prerequis هي قائمة التحقق الخاصة بك : أربع عشرة علامة صح (خمس عشرة في bash) وTout est prêt. قبل البدء. إذا كان المنفذ 3000 مشغولاً، ينقل GRAFANA_PORT=3001 Grafana دون المساس بالباقي ؛ يجب أن يبقى المتغير معرَّفاً لـ prerequis وdemarrer وetat. إذا رفض PowerShell السكريبت : Set-ExecutionPolicy -Scope CurrentUser RemoteSigned.
.wslconfig) : جميع مفاتيح الملف، ومنها memory وprocessors وswap.${VARIABLE:-défaut} المستخدمة لـ GRAFANA_PORT، والملف .env الذي يتيح تثبيت المتغير مرة واحدة وإلى الأبد في جذر lab3.RemoteSigned، ولماذا هو الضبط الموصى به لجهاز عمل.demarrer ثم etat، والجولة في الواجهات التسع.