عن المشروع

UniPlateTracker هي لوحة تحكم خاصة ذاتية الاستضافة لتتبع لوحات الترخيص التي تم التقاطها بواسطة كاميرات UniFi Protect. تتلقى أحداث الاكتشاف التي يتم دفعها بواسطة NVR الخاص بـ UniFi عبر Webhooks، وتسجلها في قاعدة بيانات PostgreSQL، وتعرضها من خلال واجهة ويب للعرض والبحث وتحليل نشاط المركبات. تظل الصور المصغرة وملفات الفيديو على خادم المستخدم، مع وجود عملية بحث اختيارية في DVLA في المملكة المتحدة كالمصدر الوحيد الموصوف للبيانات الخارجية. ما الذي تفعله - معالجة الأحداث في الوقت الفعلي: تصل اكتشافات لوحات الترخيص من Webhooks الخاصة بـ UniFi Protect ويتم معالجتها أثناء حدوثها. - التقاط الفيديو عند الطلب: يقوم عامل Node.js مستقل بتسجيل مقطع قصير لكل اكتشاف من دفق RTSP الخاص بالكاميرا، مع التعامل مع التخزين المؤقت قبل الحدث وبعده بواسطة عملية منفصلة لإدارة التخزين المؤقت. - التكامل الاختياري مع DVLA (المملكة المتحدة): يجلب تفاصيل المركبة مثل العلامة التجارية واللون والضريبة وحالة MOT. يتيح وضع دولي تعطيل الميزات الخاصة بالمملكة المتحدة حتى يمكن تشغيل التطبيق في مناطق أخرى، على الرغم من أن اللوحات غير الخاصة بالمملكة المتحدة ستظهر على أنها "غير معروفة" ما لم يتم تكوين ENABLE_INTERNATIONAL_API. - لوحة تحكم الإدارة: منطقة إدارة محمية تحتوي على مخططات وإحصائيات الاستخدام، بالإضافة إلى حسابات إدارة هرمية حيث يمكن للمسؤول الأول منح أو سحب الوصول للمسؤولين الآخرين؛ يتم كتابة تلك الإجراءات في سجل تدقيق للمراجعة. - جدول الاكتشافات: كثيف وقابل للفرز، ومُدرج للقراءة السريعة. يتم إجراء الفرز والتصفية في قاعدة البيانات، لذا فإن الترتيب ينطبق على مجموعة النتائج بأكملها وليس فقط الصفحة الحالية، ويتم إعادة تدفق الجدول إلى قائمة بطاقات على الشاشات الضيقة. - إبراز الحالة: تظل المركبات ذات الضريبة الصالحة وMOT صامتة بصريًا، بينما يتم إبراز المركبات منتهية الصلاحية أو غير المسددة للضريبة أو SORN؛ يتم عرض "لا يوجد سجل DVLA" على أنه شريحة متميزة ذات خطوط متقطعة ومجوفة حتى لا تُقرأ المعلومات المفقودة على أنها نتيجة نظيفة. - إمكانية الوصول: عناصر تحكم مُدرجة، وفرز وتصفح قابلين للتشغيل بواسطة لوحة المفاتيح، وaria-sort على الجدول، ودعم prefers-reduced-motion. يذكر المشروع أنه تم تدقيقه دون أي انتهاكات. يتبع الوضع الفاتح والداكن تفضيلات النظام. المكدس التقني Next.js 16 (App Router) مع TypeScript، وReact 19، وTailwind CSS v4، وshadcn/ui؛ Routes API الخاصة بـ Next.js إلى جانب عامل Node.js مستقل/مدير تخزين مؤقت؛ PostgreSQL للتخزين؛ FFmpeg لمعالجة الفيديو؛ التكاملات مع Webhooks الخاصة بـ UniFi Protect وDVLA API. نظرًا لأن Tailwind v4 يأخذ موضوعه من CSS، فلا يوجد tailwind.config.ts — تقع رموز التصميم وأنماط اللوحات والحالة في كتلة @theme الخاصة بـ src/app/globals.css. النشر الخط الأساسي الموثق هو Debian 12 مع كاميرا UVC-AI-Pro (إصدار الجهاز 5.1.57) وUniFi Protect 9.4.19، مع ملاحظة أن التكوينات الأخرى من المتوقع أن تعمل. يتم وصف طريقتين: - التثبيت اليدوي: قم بتثبيت Node.js 20+، وPostgreSQL، وFFmpeg؛ انسخ ملف البيئة المثال إلى .env.local واملأ القيم مثل POSTGRES_URL وSESSION_SECRET؛ أنشئ دليل التخزين المؤقت والتقاط النهائي إذا كان التقاط الفيديو ممكّنًا؛ قم بتثبيت التبعيات لكل من التطبيق والعامل؛ قم بتشغيل npm run db:init لإنشاء الجداول وتسجيل أول بريد إلكتروني للمسؤول؛ قم ببناء التطبيق وتشغيله، واحتفظ به اختياريًا بشكل دائم باستخدام PM2. - Docker: قم بتنزيل ملف compose وقالب البيئة، وأعد تسميته إلى .env.local، وقم بتوفير POSTGRES_URL، وSESSION_SECRET، وNEXTAUTH_URL (باستخدام IP الشبكة الخاص بالخادم وليس localhost)، وقم بتشغيل حاوية لمرة واحدة لتحليل قاعدة البيانات وإنشاء أول مسؤول، ثم اسحبها وابدأها باستخدام Docker Compose. يتم توثيق الواجهة الويب على المنفذ 3000 ونقطة نهاية webhook على المنفذ 4000. في UniFi Protect، يتم إنشاء إنذار تحت Settings > System > Other Settings > Alarm Manager، ومُدرج على ID > LPR للمركبات غير المعروفة والمعروفة، ومُدرج على كاميرات LPR، ومُدرج على URL /webhook الخاص بالتطبيق مع تمكين الصور المصغرة. ملاحظات استكشاف الأخطاء من README يمكن أن تظهر الاكتشافات على أنها "لا يوجد مقطع" لأن الاكتشاف والتقاط هما مساران منفصلان: يكتب webhook الصف بينما يقوم العامل بالتسجيل من RTSP، لذا يمكن أن يفشل التقاط بينما تستمر الاكتشافات في الوصول. تشمل الفحوصات المقترحة أحدث تاريخ للملف في VIDEO_FINAL_CAPTURE_PATH، وما إذا كان FFmpeg لا يزال مثبتًا وعلى المسار المتوقع، وما إذا كانت بيانات اعتماد الكاميرا أو عنوان URL الخاص بـ RTSP لا تزال صالحة، وما إذا كانت كلتا العمليتين الخلفيتين على قيد الحياة، وما إذا كان المستخدم الذي يقوم بتشغيل التطبيق يمكنه قراءة دليل التقاط. تعني البلاطة ذات الخطوط المتقطعة "لا يوجد مقطع" أن مقطعًا كان متوقعًا لكنه مفقود، بينما تعني أيقونة الكاميرا العادية أن الاكتشاف لم يشير إليه أبدًا. تعيد طلبات الفيديو والصور المصغرة 404 ما لم تحتوي أسماء الملفات على حروف وأرقام ونقاط وشرطات وسطرين سفليين فقط مع امتدادات .mp4 أو .jpg، ويتم رفض أي مسار يتغير عند التحليل، لذا فإن محاولة تجاوز الدليل تفشل بدلاً من الهروب من دليل التقاط. تعني تفاصيل المركبة التي تظهر على أنها "غير معروفة" أن DVLA لا يحمل سجلًا لذلك التسجيل أو أن عملية البحث قد فشلت.