📖 نظرة عامة
Hub هو نسخة محلية من نظام sudanIPS تعمل على جهاز الصيدلية. يتيح:
- ✅ عمل أوفلاين كامل — الإنترنت قطع لأيام؟ لا مشكلة
- ✅ سرعة فائقة — كل البيانات على نفس الجهاز
- ✅ مزامنة تلقائية — كل 30 ثانية مع السحابة
- ✅ أجهزة الصيدلية الأخرى تتصل عبر LAN
🔄 آلية العمل المُختصرة
السوبر أدمن (السحابة) الصيدلية جهاز الصيدلية
| | |
1. ينشئ صيدلية → | |
2. يولّد token | |
3. ينشئ اشتراك | |
4. ينشئ حساب مدير → 5. مدير الصيدلية يدخل |
6. يضغط "تنزيل الحزمة" |
7. يستلم ZIP مُخصص → 8. يفك الضغط
9. يشغّل install.bat
10. Hub يعمل ✓
🧰 الاستعدادات
على السحابة (سوبر أدمن)
| المتطلب | التفاصيل |
|---|---|
| حساب superadmin | على https://sudanips.com |
| بيانات الصيدلية الجديدة | الاسم، المدير، الهاتف، المدينة، العنوان |
| قيمة الاشتراك المتفق عليها | الباقة + المدة + المبلغ + رقم الإيصال |
على جهاز الصيدلية (PC)
| المتطلب | التفاصيل |
|---|---|
| Windows 10 / 11 (64-bit) | OS قديم لن يعمل |
| Python 3.8+ | مع تفعيل "Add to PATH" أثناء التنصيب |
| صلاحية Administrator | للحساب الذي سيُنصِّب |
| 10 GB مساحة فارغة | على D: (مفضل) أو C: |
| nssm.exe | أداة Windows Services (سيُنزَّل في الخطوات) |
| اتصال إنترنت | وقت التنصيب الأول فقط لجلب البيانات المرجعية |
1 الإعداد على https://sudanips.com
هذه الخطوات تُنفّذها أنت كسوبر أدمن قبل أن يتمكّن مدير الصيدلية من تنزيل الحزمة.
1.1 إنشاء بيانات الصيدلية
- سجّل دخول كـ superadmin على
https://sudanips.com/admin-panel/ - من الشايدبار اختر "الصيدليات"
- اضغط "➕ إضافة صيدلية"
- عبّئ البيانات: الاسم، المدير، الهاتف، المدينة، العنوان
- اضغط حفظ → سترى الصيدلية في القائمة بـ ID رقمي (مثل #5)
1.2 توليد Token خاص بالصيدلية
- من الشايدبار اختر "صحة المزامنة" (أو افتح
/sync/admin/) - ابحث عن الصيدلية الجديدة في الجدول
- في عمود "Token" اضغط "توليد Token"
- سيظهر Modal فيه Token طويل (64 حرف)
- انسخ Token فوراً — لن يظهر مرة أخرى!
- أغلق الـ Modal
- لا تشاركه عبر واتساب عام، Facebook، إيميل غير مشفّر
- إن سُرّب: ادخل /sync/admin/ → اضغط "إبطال" → ولّد جديد
- الصيدلية تحصل عليه تلقائياً عند التنزيل (لا تحتاج إرساله يدوياً!)
1.3 إنشاء اشتراك للصيدلية
- من الشايدبار اختر "الاشتراكات والتجديدات" (
/admin-panel/subscriptions/) - ابحث عن الصيدلية الجديدة
- اضغط "تجديد"
- في النافذة المنبثقة:
- الباقة: أساسي / قياسي / مميّز
- المدة: 12 شهر (افتراضي)
- المبلغ: المتفق عليه (مثلاً 500,000 ج.س)
- مرجع الدفع: رقم الإيصال أو رمز التحويل
- ملاحظات: اختياري
- اضغط "تأكيد التجديد"
1.4 إنشاء حساب مدير الصيدلية
- من الشايدبار اختر "المستخدمون"
- اضغط "➕ إضافة مستخدم"
- عبّئ:
- اسم المستخدم: مختصر (مثل
fairdeal_admin) - الاسم الكامل: للعرض
- المستوى:
admin(مدير صيدلية) - الصيدلية: اختر الصيدلية من القائمة
- كلمة المرور: قوية + سهلة عليه يحفظها
- اسم المستخدم: مختصر (مثل
- اضغط حفظ
- اسم المستخدم
- كلمة المرور (مؤقتة — يُنصح بتغييرها)
- رابط دخول:
https://sudanips.com/login/
2 تنزيل الحزمة من dashboard
هذه الخطوات يُنفّذها مدير الصيدلية من حساب أنشأته له.
2.1 تسجيل الدخول
- افتح المتصفح على
https://sudanips.com/login/ - أدخل اسم المستخدم + كلمة المرور التي أرسلها السوبر أدمن
- اضغط دخول → سيتوجه لداش بورد الصيدلية
2.2 تنزيل حزمة التنصيب
في أعلى داش بورد الصيدلية ستظهر بطاقة ذهبية كبيرة:
🎉 جهازك جاهز لتنصيب Hub المحلي!
مدير النظام ولّد Token خاص لصيدليتك. نزّل حزمة التنصيب المُخصصة (Token + كود الصيدلية مُعبّأَين تلقائياً) — كل ما عليك تشغيلها على جهاز الصيدلية.
- اضغط زر "تنزيل حزمة التنصيب"
- سيُنزَّل ZIP باسم
sudanips-hub-{اسم_الصيدلية}-{رقم}.zip(~1 MB) - احفظه في مجلد مؤقت على جهازه
.env مُعبَّأ تلقائياً (Token + رقم الصيدلية)
• README.txt بالتعليمات
• لا يحتوي مفاتيح حساسة
2.3 ملاحظة: متى يختفي الزر؟
بعد أن يعمل Hub بنجاح ويرسل أول heartbeat (خلال 30-60 ثانية من تشغيله):
- 🟢 يختفي زر التنزيل من الداش بورد
- 🟢 يظهر بدلاً منه: "✓ Hub المحلي شغّال (آخر مزامنة قبل X دقيقة)"
- 🔴 لو Hub توقف لأكثر من 10 دقائق → الزر يعود ليعيد المحاولة
3 التنصيب على PC
هذه أهم مرحلة. يُنفّذها الفنّي/مدير الصيدلية على الجهاز المخصّص لـ Hub.
3.1 المتطلبات قبل البدء
أ) Python 3.8 أو أحدث
- افتح
https://www.python.org/downloads/ - نزّل Python 3.8+ (Windows 64-bit)
- شغّل المُنصِّب
- ⚠ مهم جداً: ضع علامة على ✓ Add Python to PATH في أول شاشة
- اضغط Install Now
- للتحقق: افتح Command Prompt واكتب:
python --version→ يظهر الإصدار
3.2 فك ضغط حزمة الصيدلية
- اختر مكان دائم — مفضّل
D:\SudanIPSHub\لأن:- D: ينجو من إعادة تثبيت Windows
- بعيد عن OneDrive (التداخل مع المزامنة)
- إذا D: غير متاح، استخدم
C:\SudanIPSHub\ - افتح ZIP المُنزَّل (sudanips-hub-...zip)
- فك الضغط في المسار المختار
3.3 تنزيل nssm.exe
NSSM أداة Windows تحوّل أي برنامج لخدمة. مطلوبة لتشغيل Hub تلقائياً:
- افتح
https://nssm.cc/download - نزّل "nssm 2.24" (الأحدث)
- فك ضغط ZIP الذي نُزِّل
- من المجلد
win64/انسخ nssm.exe - الصقه في:
D:\SudanIPSHub\hub_windows\(بجانبinstall.bat)
3.4 تشغيل install.bat
- افتح المجلد
D:\SudanIPSHub\hub_windows\ - انقر بالزر الأيمن على install.bat
- اختر "Run as administrator"
- سيظهر مربع UAC → اضغط نعم
- سيُفتح Console يطبع 20 خطوة:
====== Step 1 ====== التحقق من Administrator ====== Step 2 ====== اكتشاف ملفات المشروع ====== Step 3 ====== التحقق من Python ====== Step 4 ====== التحقق من NSSM ====== Step 5 ====== تحديد مسار التنصيب ... ====== Step 20 ====== عرض ملخص
- اتبع الأسئلة:
- Install path: اضغط Enter للمسار الافتراضي
- Pharmacy code: مُعبَّأ تلقائياً من .env
- Sync token: مُعبَّأ تلقائياً من .env
- انتظر 5-10 دقائق (الأطول: pip install + sync_bootstrap)
- عند الانتهاء سيظهر:
============================================= INSTALLATION COMPLETED SUCCESSFULLY ============================================= Install path: D:\SudanIPSHub Pharmacy code: 5 Local URL: http://localhost:8000 Network URL: http://192.168.1.10:8000 Services running: * SudanIPSHub * SudanIPSHubSync * SudanIPSHubWatcher * SudanIPS_Hourly_Backup
- اقرأ رسالة الخطأ — الـ Console واضح
- أكثر الأسباب: Python غير مُضاف لـ PATH، أو nssm.exe ليس في المكان
- راجع قسم استكشاف الأخطاء أدناه
4 التحقق من النجاح
على جهاز الصيدلية
- افتح المتصفح على
http://localhost:8000/— يظهر الموقع - افتح
http://localhost:8000/sync/health/— يجب أن ترى:{"ok": true, "checks": {"db_local": {"ok": true}, "cloud": {"ok": true, ...}, "pending_total": 0}} - سجّل دخول بحساب مدير الصيدلية
- افتح صفحة المخزون — يجب أن ترى الأصناف (مستوردة من السحابة)
على السحابة (سوبر أدمن)
- افتح
https://sudanips.com/sync/admin/ - ابحث عن الصيدلية في الجدول
- الحالة يجب تكون 🟢 healthy
- عمود "آخر heartbeat": أقل من 5 دقائق
على dashboard الصيدلية
عُد لـ dashboard الصيدلية على السحابة. زر التنزيل اختفى وظهر بدلاً منه:
✓ Hub المحلي شغّال (آخر مزامنة قبل X دقيقة)
5 ربط أجهزة الصيدلية الأخرى
إذا كان للصيدلية أجهزة أخرى (كاونتر إضافي، تابلت، جوال) — كلهم على نفس WiFi — يمكنهم استخدام Hub:
- على جهاز Hub: افتح Command Prompt واكتب
ipconfig - ابحث عن "IPv4 Address" — مثلاً
192.168.1.10 - على الجهاز الآخر: افتح المتصفح على
http://192.168.1.10:8000/ - سجّل دخول بحساب موظف
- اذهب لصفحة
/sync/status/ - في قسم "اتصال المتصفح بـ Hub محلي": أدخل
http://192.168.1.10:8000 - اضغط حفظ
الآن المتصفح يعتمد على Hub المحلي. حتى لو الإنترنت قطع، سيستمر العمل.
netsh advfirewall firewall add rule name="SudanIPS Hub" dir=in action=allow protocol=TCP localport=8000(الـ installer يفعل هذا تلقائياً، لكن قد تحتاج تأكيداً يدوياً.)
🛠️ استكشاف الأخطاء
| المشكلة | الحل |
|---|---|
| install.bat لا يفتح كـ Admin | اضغط Win+R → اكتب cmd → Ctrl+Shift+Enter → cd إلى المجلد → نفّذ install.bat |
| "Python not installed" | تحقق من تنصيب Python مع تفعيل "Add to PATH" — أو أعد التنصيب |
| "nssm.exe not found" | تحقق أن nssm.exe في D:\SudanIPSHub\hub_windows\nssm.exe |
| الخدمات لا تشتغل | افتح Services.msc → ابحث عن SudanIPSHub → ابدأها يدوياً راجع D:\SudanIPSHub\logs\hub-err.log |
| cloud.ok = false في /sync/health/ | الإنترنت مقطوع، أو Token خاطئ — تحقق من .env |
| "رمز مزامنة موقوف" (401) | السوبر أدمن أبطل Token — يجب توليد جديد + إعادة تنزيل الحزمة |
| جهاز آخر لا يفتح Hub | افتح منفذ 8000 في Windows Firewall (الأمر في الفصل 5) |
| "اشتراك منتهي — وضع القراءة فقط" | افتح dashboard السوبر أدمن → الاشتراكات → "تجديد" |
| الترخيص لم يصل Hub بعد التجديد | انتظر 30-60 ثانية. أو أعد تشغيل خدمة SudanIPSHubSync |
سجلات للمراجعة
D:\SudanIPSHub\logs\hub.log— السيرفرD:\SudanIPSHub\logs\hub-err.log— أخطاء السيرفرD:\SudanIPSHub\logs\sync.log— المزامنةD:\SudanIPSHub\logs\sync-err.log— أخطاء المزامنةD:\SudanIPSHub\logs\watcher.log— التحديث التلقائيD:\SudanIPSHub\logs\update_watcher.log— تفاصيل التحديث
🔧 الصيانة الدورية
عند تجديد اشتراك صيدلية
- افتح
/admin-panel/subscriptions/ - ابحث عن الصيدلية
- اضغط "تجديد"
- عبّئ المبلغ + المرجع
- اضغط حفظ → JWT جديد يصل Hub خلال 30 ثانية
عند سرقة/تسريب Token
- افتح
/sync/admin/ - اضغط "إبطال" على Token الصيدلية المتأثرة
- اضغط "توليد Token" — يُولَّد جديد فوراً
- أبلِغ مدير الصيدلية: ادخل dashboard وأعد تنزيل الحزمة
- الفنّي يفك ضغط الـ ZIP الجديد على نفس مكان Hub القديم → استبدال
.env - أعد تشغيل الخدمات:
net stop SudanIPSHubSync & net start SudanIPSHubSync
عند ترقية النظام (تحديث الإصدار)
Hub يفحص update.flag كل 10 دقائق. عندما تضع ZIP جديد في releases/
على السحابة وتُنشئ update.flag، الـ SudanIPSHubWatcher
سيقوم تلقائياً بـ:
- إيقاف الخدمات
- أخذ snapshot من DB (للأمان)
- تنزيل وفك الضغط
- تشغيل migrate + collectstatic
- إعادة تشغيل الخدمات
- فحص health — لو فشل، استرجاع snapshot تلقائياً
الجدولة اليومية
- تنبيهات الاشتراكات:
subscription_alerts(cron 9 صباحاً يومياً) - تنبيهات Hub الميتة:
sync_alerts(cron يومياً) - نسخ احتياطية: كل ساعة على Hub (Task Scheduler)
عند مغادرة المُختبَر
قبل أن تُسلِّم الصيدلية للموظفين:
| الفحص | المتوقع |
|---|---|
| الخدمات الـ 3 شغّالة | SudanIPSHub, SudanIPSHubSync, SudanIPSHubWatcher = Running |
| الجدولة الذهبية | SudanIPS_Hourly_Backup = Ready |
| الاتصال بالسحابة | /sync/health/ → cloud.ok = true |
| البيانات محلياً | قائمة الأصناف ~6000 صنف |
| فاتورة تجريبية | تُحفَظ + تُزامَن خلال 30 ث |
| لوحة المراقبة | /sync/admin/ → الصيدلية healthy 🟢 |
| JWT الترخيص | license.jwt موجود + sub_end صحيح |
| أجهزة LAN | الكاونتر/التابلت يفتح http://<IP>:8000 |
التنصيب اكتمل
احفظ هذا الدليل (طباعة → PDF) في ملفات الصيدلية. لأي مساعدة: +201555257895 | info@sudanips.com