دليل تنصيب Hub على جهاز صيدلية جديد

نظام سودان IPS — Offline-First Pharmacy Hub

1 التحضير — قبل الذهاب للصيدلية

أ) توليد Token للصيدلية من السحابة

  1. سجّل الدخول بـ superadmin على https://sudanips.com
  2. افتح /sync/admin/ (لوحة صحة المزامنة)
  3. ابحث عن الصيدلية المطلوبة → اضغط "توليد Token"
  4. انسخ Token فوراً (يظهر مرة واحدة فقط) واحفظه في مكان آمن
تحذير: الـ Token سري — لا تُشاركه عبر واتساب عام أو إيميل غير مشفّر. لو ضاع أو سُرّب، توجّه إلى /sync/admin/ واضغط "إبطال" ثم ولّد جديداً.

ب) تجهيز حزمة التنصيب

الطريقةالمحتوىمتى
ZIP يدوي المشروع + Python + مجلد venv سريع للتجربة الأولى
PyInstaller Bundle dist/SudanIPSHub/ — تنفيذي مستقل للإنتاج (لا يحتاج Python على جهاز الصيدلية)

لبناء Bundle:

pyinstaller hub_windows/hub.spec --clean

أضف إلى الحزمة: nssm.exe من nssm.cc/download

2 التنصيب على جهاز الصيدلية

1) نسخ الملفات

2) إعداد ملف البيئة

انسخ hub_windows\.env.sample إلى C:\SudanIPSHub\.env وعدّل القيم:

SECRET_KEY=<مفتاح-عشوائي-من-djecrety.ir>
DEBUG=False
ALLOWED_HOSTS=localhost,127.0.0.1,0.0.0.0,<IP-الجهاز>
DB_SQLITE_PATH=pharmacy.db

SYNC_MODE=hub
SYNC_TOKEN=<Token من المرحلة 1>
SYNC_CLOUD_URL=https://sudanips.com
SYNC_HUB_PHCODE=<رقم الصيدلية>
SYNC_INTERVAL_SEC=30

3) التشغيل اليدوي الأول (يتطلب إنترنت)

افتح hub_windows\run_hub.bat بالنقر المزدوج. السكربت سيقوم تلقائياً بـ:

تحقق: افتح http://localhost:8000/sync/health/ — يجب أن يرجع "cloud": {"ok": true}

4) تنصيب الخدمات (إنتاج — Administrator)

انقر بالزر الأيمن على hub_windows\install_service.batRun as administrator

ينصّب:

الخدمةالوظيفة
SudanIPSHubالسيرفر على منفذ 8000
SudanIPSHubSyncالمزامنة المستمرة مع السحابة (كل 30 ثانية)
SudanIPSHubWatcherالتحديث التلقائي عبر update.flag
SudanIPS_Hourly_Backupنسخة SQLite احتياطية كل ساعة

جميعها تعمل تلقائياً مع إقلاع Windows.

5) فتح المنفذ في Windows Firewall

netsh advfirewall firewall add rule name="SudanIPS Hub" ^
  dir=in action=allow protocol=TCP localport=8000

6) معرفة IP الجهاز

في cmd: ipconfig — مثال النتيجة: 192.168.1.10

سجّل هذا الـ IP — ستحتاجه لباقي الأجهزة.

3 ربط أجهزة الصيدلية الأخرى (هواتف، كاونتر، مخزن)

لكل جهاز يعمل على نفس شبكة الـ WiFi الخاصة بالصيدلية:

  1. افتح المتصفح على: http://<IP-الـHub>:8000/ (مثل http://192.168.1.10:8000/)
  2. سجّل الدخول بحساب الموظف
  3. اذهب إلى /sync/status/
  4. في قسم "اتصال المتصفح بـ Hub محلي" → أدخل http://192.168.1.10:8000 → حفظ
من الآن المتصفح يستخدم Hub المحلي تلقائياً — حتى لو انقطع الإنترنت. الفواتير تُحفظ في SQLite وتُزامَن عند عودة الاتصال دون فقد بيانات.

4 التحقق النهائي (قبل مغادرة الصيدلية)

الفحصالأمر / الرابطالنتيجة المتوقعة
الخدمات تعمل sc query SudanIPSHub RUNNING
الاتصال بالسحابة /sync/health/ cloud.ok = true
البيانات محلياً /pharmacy/ → قائمة الأصناف ~6000 صنف
فاتورة تجريبية أنشئ فاتورة، انتظر 30 ثانية تختفي من pending
لوحة المراقبة على السحابة /sync/admin/ healthy
نسخة احتياطية بعد ساعة — تفقد backups/ ملف .db.gz
الطباعة جرّب طباعة فاتورة تظهر بشكل سليم

5 ملاحظات مهمة

6 استكشاف الأخطاء

المشكلةالحل
السيرفر لا يبدأ افحص logs/hub-err.log — عادة ملف .env مفقود أو قيمة خاطئة
المزامنة لا تعمل تحقق من SYNC_TOKEN و SYNC_CLOUD_URL. شغّل يدوياً: python manage.py sync_worker --verbose-level=2
لا يظهر الموقع من أجهزة أخرى افتح منفذ 8000 في Windows Firewall (الأمر في المرحلة 2)
بيانات مفقودة شغّل: python manage.py sync_bootstrap لإعادة جلب master data
رسالة "ليس لديك صلاحية" لسوبر أدمن is_superuser لم يُنقل من السحابة. عالجها بالأمر:
UPDATE accounts_employee SET level='superadmin', is_superuser=1, is_staff=1 WHERE user_name='...'
Token مرفوض (401) Token ملغي أو خاطئ — ولّد جديداً من /sync/admin/
خطأ ترميز في الـ Console ضبط متغير البيئة: set PYTHONIOENCODING=utf-8

سجلات الأخطاء