# المهمة 5 — لوحة مراقبة mithal.space ## الملفات - `collector.py` — يجمع المقاييس كل دقيقة (latency, uptime, SSL, DNS, search) ويخزنها في: - `metrics.csv` (سجل تاريخي كامل، صف لكل فحص) - `latest.json` (أحدث قراءة، يقرأها الـ dashboard) - `history.json` (آخر 1440 قراءة = 24 ساعة، يقرأها الـ dashboard للرسم البياني والجدول) - `dashboard.html` — يعرض uptime%، رسم بياني لزمن الاستجابة، حالة SSL، وسجل آخر 10 فحوصات - `requirements.txt` — اعتماديات بايثون (`requests`) ## 1) التشغيل محلياً ```bash cd task5-mithal-dashboard pip install -r requirements.txt # فحص واحد للتجربة python collector.py --once # تشغيل مستمر (يفحص كل دقيقة) python collector.py & # تقديم الملفات (dashboard.html + json files) عبر خادم بسيط python -m http.server 8000 ``` افتح المتصفح على: `http://localhost:8000/dashboard.html` > ملاحظة: الـ dashboard يقرأ `history.json` و`latest.json` عبر `fetch()`، لذلك > يجب تشغيله من خادم HTTP (مثل `http.server`) وليس بفتح الملف مباشرة (`file://`) > لتفادي قيود CORS في المتصفح. ## 2) النشر على Ghaymah نفس نمط النشر في المهمة 1: نضع `collector.py` و`dashboard.html` خلف سيرفر بسيط (مثال: Flask/`http.server`) داخل حاوية واحدة، وننشرها كتطبيق Ghaymah: ```dockerfile FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY collector.py dashboard.html ./ EXPOSE 8000 # يشغّل التجميع في الخلفية + خادم استضافة الملفات في الواجهة CMD sh -c "python collector.py & python -m http.server 8000" ``` ```bash docker build -t mithal-monitor:v1 . docker push registry.ghaymah.systems//mithal-monitor:v1 ghaymah deploy --app mithal-monitor \ --image registry.ghaymah.systems//mithal-monitor:v1 \ --port 8000 ``` بعد النشر، الرابط الناتج (مثال: `https://mithal-monitor.ghaymah.systems/dashboard.html`) يعرض اللوحة الحية، وتُحدَّث القراءات تلقائياً كل دقيقة عبر `collector.py` الذي يعمل باستمرار داخل نفس الحاوية. ## 3) ملاحظة حول رابط البحث (Search Response) عدّل المتغير `SEARCH_URL` داخل `collector.py` ليطابق مسار البحث الفعلي في موقع mithal.space (حالياً موضوع كمثال `mithal.space/search?q=test`)، حسب البنية الفعلية للموقع.