نظام سودان IPS — Offline-First Pharmacy Hub
https://sudanips.com/sync/admin/ (لوحة صحة المزامنة)/sync/admin/ واضغط "إبطال" ثم ولّد جديداً.
| الطريقة | المحتوى | متى |
|---|---|---|
| ZIP يدوي | المشروع + Python + مجلد venv |
سريع للتجربة الأولى |
| PyInstaller Bundle | dist/SudanIPSHub/ — تنفيذي مستقل |
للإنتاج (لا يحتاج Python على جهاز الصيدلية) |
لبناء Bundle:
pyinstaller hub_windows/hub.spec --clean
أضف إلى الحزمة: nssm.exe من
nssm.cc/download
C:\SudanIPSHub\انسخ 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
افتح hub_windows\run_hub.bat بالنقر المزدوج. السكربت سيقوم تلقائياً بـ:
migrate — إنشاء قاعدة SQLite فارغةsync_bootstrap — جلب master data (أصناف، شركات، موظفين، حسابات) ~ 6000 سجلwaitress على المنفذ 8000http://localhost:8000/sync/health/ —
يجب أن يرجع "cloud": {"ok": true}
انقر بالزر الأيمن على hub_windows\install_service.bat → Run as administrator
ينصّب:
| الخدمة | الوظيفة |
|---|---|
SudanIPSHub | السيرفر على منفذ 8000 |
SudanIPSHubSync | المزامنة المستمرة مع السحابة (كل 30 ثانية) |
SudanIPSHubWatcher | التحديث التلقائي عبر update.flag |
SudanIPS_Hourly_Backup | نسخة SQLite احتياطية كل ساعة |
جميعها تعمل تلقائياً مع إقلاع Windows.
netsh advfirewall firewall add rule name="SudanIPS Hub" ^ dir=in action=allow protocol=TCP localport=8000
في cmd: ipconfig — مثال النتيجة: 192.168.1.10
سجّل هذا الـ IP — ستحتاجه لباقي الأجهزة.
لكل جهاز يعمل على نفس شبكة الـ WiFi الخاصة بالصيدلية:
http://<IP-الـHub>:8000/ (مثل http://192.168.1.10:8000/)/sync/status/http://192.168.1.10:8000 → حفظ| الفحص | الأمر / الرابط | النتيجة المتوقعة |
|---|---|---|
| الخدمات تعمل | sc query SudanIPSHub |
RUNNING |
| الاتصال بالسحابة | /sync/health/ |
cloud.ok = true |
| البيانات محلياً | /pharmacy/ → قائمة الأصناف |
~6000 صنف |
| فاتورة تجريبية | أنشئ فاتورة، انتظر 30 ثانية | تختفي من pending |
| لوحة المراقبة | على السحابة /sync/admin/ |
healthy |
| نسخة احتياطية | بعد ساعة — تفقد backups/ |
ملف .db.gz |
| الطباعة | جرّب طباعة فاتورة | تظهر بشكل سليم |
sync_bootstrap — نفس بيانات الدخول المستخدمة على sudanips.com./sync/admin/ → Hub يفقد الاتصال فوراً.sync_bootstrap. الحل: جهّز قاعدة مُعبأة مسبقاً من المكتب وانقلها، أو انتظر لحظة إنترنت.sync_bootstrap (حسب الإنترنت).is_superuser مضبوط محلياً (أحياناً يحتاج تعديل يدوي لأن bootstrap لا ينسخه).update.flag — لا داعي لزيارة كل صيدلية يدوياً.| المشكلة | الحل |
|---|---|
| السيرفر لا يبدأ | افحص 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 |
logs/hub.log و logs/hub-err.log — السيرفرlogs/sync.log و logs/sync-err.log — المزامنةlogs/watcher.log — محدّث التطبيق