> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# برامج تسجيل الكاميرات NVR المفتوحة: مقارنة على كاميرا واحدة
- URL: https://arabroot.io/articles/مقارنة-frigate-و-zoneminder-و-shinobi/
- Published: 2026-10-28T14:14:06.000Z
- Updated: 2026-10-28T15:14:34.000Z
- Description: شغلنا Frigate وZoneMinder وShinobi على نفس الكاميرا وقسنا المعالج والذاكرة، ثم قارنا الرخص والأمان الافتراضي والكشف الذكي.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, مجالات متخصصة, هوم لاب, الاستضافة الذاتية

لنفرض أن شركتك الناشئة التي تبيع قطع غيار السيارات أنهت تركيب كاميراتها الثماني، وعزلتها في شبكة خاصة كما شرحنا في [دليل Frigate](https://arabroot.io/articles/frigate-%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/) ومقالات المرحلة، وقررت ألا تشتري جهاز NVR مغلقاً من شركة الكاميرات، وإنما أن تسجل على سيرفر تملكه ببرنامج مفتوح. وعندها يبدأ البحث، فيقرأ المطور في المنتديات ثلاثة أسماء تتكرر: Frigate الذي يتحدث عنه الجميع في عالم المنزل الذكي، وZoneMinder الذي يعمل منذ عشرين سنة، وShinobi الذي يعد بواجهة حديثة. وكل مقارنة يجدها إما قديمة، أو مكتوبة من شخص جرب برنامجاً واحداً فقط، أو جدول ميزات منسوخ من مواقع المشاريع لا يقول شيئاً عن السؤال الحقيقي: كم يستهلك كل برنامج من السيرفر، وكم يتعبك تشغيله، وماذا تكتشف بعد أسبوع من الاستخدام؟

لذلك فعلنا في هذا المقال ما لا تفعله أغلب المقارنات: شغلنا البرامج الثلاثة واحداً بعد الآخر على نفس الجهاز، وأعطيناها نفس الكاميرا بنفس البثين، وقسنا المعالج والذاكرة لكل منها خمس دقائق في وضعين: تسجيل فقط، وتسجيل مع تحليل الصورة، ثم سجلنا ما واجهناه في التثبيت والإعداد، وما وجدناه في الإعدادات الافتراضية من أمور تخص الأمان والخصوصية، وقرأنا رخصة كل برنامج كما هي.

وسوف نناقش في هذا المقال ما يلي:

- ما الذي يفعله برنامج التسجيل، وما الأسئلة التي تقارن بها أي برنامجين.
- البرامج الثلاثة: كيف يمر الفيديو في كل منها، وبأي لغة كتب، وما رخصته.
- تجربة: نفس الكاميرا على البرامج الثلاثة، مع خطوات الإعداد الحقيقية والأخطاء التي ظهرت.
- الأرقام: المعالج والذاكرة في وضع التسجيل فقط ومع التحليل، وكيف تقرؤها.
- التخزين والاحتفاظ، والكشف الذكي، والأمان الافتراضي والخصوصية، والترقية والتوسع، والرخص بالتفصيل.
- جدول قرار يقول لك أي برنامج يناسب حالتك.

## ماذا يفعل برنامج التسجيل؟

برنامج التسجيل، أو برنامج إدارة الفيديو VMS كما سميناه في المقالات السابقة، يقوم بعمل مسجل NVR على سيرفر عادي، وعمله يتلخص في ست مهام، وكل مقارنة جادة تسأل عن كل واحدة منها:

1. **الالتقاط Capture:** يتصل بكل كاميرا عبر RTSP ويستقبل البث دون انقطاع، ويعيد الاتصال وحده إذا انقطع، وقد شرحنا البروتوكول في [مقال أنواع الكاميرات](https://arabroot.io/articles/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%A8%D9%8A%D9%86%D9%87%D8%A7/#rtsp-onvif).
2. **التسجيل Recording:** يكتب الفيديو على القرص، والأفضل أن يكتبه كما وصل دون إعادة ضغط، لأن إعادة الضغط تستهلك المعالج وتنقص الجودة.
3. **التحليل Analysis:** يكشف الحركة، أو الأجسام كالأشخاص والسيارات، حتى لا تضطر إلى مشاهدة ساعات من الفيديو الفارغ.
4. **الاحتفاظ Retention:** يحذف القديم بقواعد تحددها، ويحفظ المهم مدة أطول.
5. **العرض والبحث:** بث مباشر في المتصفح والهاتف، وخط زمني، وبحث في الأحداث.
6. **التكامل:** إشعارات، وواجهة برمجية API، وربط بأنظمة أخرى مثل المنزل الذكي.

والمهام الثلاث الأولى هي التي تحدد العتاد الذي تحتاجه، فالالتقاط والتسجيل دون إعادة ضغط عمل خفيف جداً كما سنرى بالأرقام، أما التحليل فيحتاج فك ضغط الفيديو إلى صور، وهذا هو الحمل الحقيقي على المعالج، لذلك كل برنامج جيد يحلل البث الفرعي الصغير ويسجل البث الرئيسي كما هو.

وقد يتساءل البعض: لماذا لا أشتري جهاز NVR جاهزاً من شركة الكاميرات وأرتاح؟ والإجابة أن الجهاز الجاهز خيار معقول لكثيرين، فهو يعمل من أول يوم ومعه دعم الشركة، ولكنه يأتي بثلاثة قيود تعرفها من المقالات السابقة: أنه يعمل أفضل مع كاميرات نفس الشركة وبضغطها الخاص، وأن تحديثاته الأمنية بيد الشركة وحدها، وأن كثيراً منه يريد الاتصال بسحابتها حتى يعمل تطبيق الهاتف. والبرنامج المفتوح على سيرفرك يقلب هذه القيود: أي كاميرا تتكلم RTSP، والتحديث بيدك، ولا يخرج شيء من الشبكة إلا إذا أردت، والثمن أنك أنت الذي يثبت ويحدث ويراقب. ولهذا السبب بالذات تهم المقارنة التالية، لأنك لا تختار ميزات فقط، وإنما تختار البرنامج الذي ستكون مسؤولاً عن تشغيله.

## البرامج الثلاثة

الصورة التالية تبين كيف يمر الفيديو في كل برنامج، كما يصفه توثيقه، وكما رأيناه في العمليات والملفات داخل كل Container أثناء التجربة:

![ثلاثة أعمدة. Frigate برخصة MIT بلغة Python مع ffmpeg وgo2rtc: ffmpeg لكل كاميرا الرئيسي يسجل كما هو والفرعي يفك، ثم كشف الحركة على كل إطار من البث الفرعي، ثم كشف الأجسام على مناطق الحركة بكاشف تختاره، ثم المراجعة والتنبيهات وMQTT، والتسجيلات بمقاطع 10 ثوان وقاعدة SQLite. ZoneMinder برخصة GPL-2.0 بلغات PHP وPerl وC++ مع MariaDB: zmc لكل كاميرا يلتقط ويحلل والإطارات في الذاكرة المشتركة، ثم المناطق Zones، ثم الأحداث Events في MariaDB، ثم خادم أحداث اختياري للإشعارات وكشف الأجسام. Shinobi برخصة خاصة بلغة Node.js مع ffmpeg وMariaDB: ffmpeg لكل كاميرا ينسخ للتسجيل وللعرض HLS، ثم تسجيل مقاطع بالطول الذي تحدده، ثم كشف الحركة من الإعدادات، ثم إضافات لكشف الأجسام](https://arabroot.io/content/images/2026/10/nvr-comparison-01-architecture.webp)

الثلاثة يستخدمون ffmpeg للاتصال بالكاميرا، والفرق في ما يحدث بعد ذلك

### Frigate

[Frigate](https://github.com/blakeblackshear/frigate?ref=arabroot.io) مسجل كتب بلغة Python مع واجهة بلغة TypeScript، برخصة MIT، وفكرته الأساسية أن الكشف الذكي ليس إضافة وإنما قلب البرنامج: يكشف الحركة على البث الفرعي، ثم يشغل نموذج كشف الأجسام على مناطق الحركة فقط، ثم يبني المراجعة والتنبيهات على الأجسام التي تهمك، وقد شرحنا تثبيته وكل ذلك بالتفصيل في [دليل Frigate](https://arabroot.io/articles/frigate-%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/). وإعداده كله ملف YAML واحد، أو صفحات الإعدادات في الواجهة، وتكامله مع Home Assistant عبر MQTT من أقوى ما فيه. وأحدث إصدار وقت كتابة المقال هو [0.18.2](https://github.com/blakeblackshear/frigate/releases/tag/v0.18.2?ref=arabroot.io) الصادر في 15 أكتوبر 2026.

### ZoneMinder

[ZoneMinder](https://github.com/ZoneMinder/zoneminder?ref=arabroot.io) هو الأقدم بين الثلاثة، وصفحة الخصوصية في واجهته نفسها تقول إنه منذ 2002 نظام إدارة فيديو مجاني مفتوح المصدر لأنظمة Linux، يدعمه مجتمع من المتطوعين، ورخصته GPL-2.0، وأغلب كوده بلغات PHP وPerl وC++. وبحسب [صفحة المكونات في توثيقه](https://zoneminder.readthedocs.io/en/latest/userguide/components.html?ref=arabroot.io) يعمل لكل كاميرا برنامج اسمه `zmc` يلتقط الفيديو، وتدير البرامج كلها عملية اسمها `zmdc.pl`، وتعمل خلفها مرشحات Filters للحذف والتنظيف، وكل شيء محفوظ في قاعدة MariaDB. وقوته في كثرة خياراته: مناطق Zones دقيقة لكل كاميرا، ومرشحات للأحداث، وواجهة برمجية كاملة، ومناظر للمونتاج والمراجعة، أما الكشف الذكي فيأتي عبر خادم أحداث منفصل وخدمة نماذج ML اختيارية كما في [ملف Docker Compose الرسمي](https://github.com/ZoneMinder/zmdockerfiles?ref=arabroot.io). وأحدث إصدار مستقر هو [1.38.6](https://github.com/ZoneMinder/zoneminder/releases/tag/1.38.6?ref=arabroot.io) الصادر في 5 أكتوبر 2026.

### Shinobi

[Shinobi](https://gitlab.com/Shinobi-Systems/Shinobi?ref=arabroot.io) يصف نفسه في ملف `package.json` بأنه «CCTV and NVR in Node.js»، أي مسجل مكتوب بلغة JavaScript على Node.js، ويشغل ffmpeg لكل كاميرا، ويحفظ بياناته في MariaDB موجودة داخل نفس الصورة في طريقة Docker البسيطة. وواجهته حديثة وغنية، وفيه خصائص كثيرة للمؤسسات مثل حسابات متعددة ومجموعات وتخزين سحابي، وكشف الأجسام عبر إضافات Plugins. ولكن انتبه إلى نقطتين قبل أن تقرأ أي مقارنة تضعه مع البرنامجين الآخرين: أن رخصته ليست رخصة مفتوحة المصدر بالمعنى المعروف، وإنما اتفاقية استخدام خاصة سنفصلها في قسم الرخص، وأن صورة Docker الرسمية لا تحمل أرقام إصدارات، فالمستودع ينشر `latest` و`dev` فقط، لذلك ثبتنا الصورة ببصمتها Digest، وكانت داخلها النسخة 2.0.0 من آخر تحديث في 20 أغسطس 2026.

## التجربة: نفس الكاميرا على البرامج الثلاثة

الكاميرا هي نفس الكاميرا الوهمية التي استخدمناها في مقالات المرحلة: خادم البث [MediaMTX](https://github.com/bluenviron/mediamtx?ref=arabroot.io) ينشر تسجيل كاميرا مراقبة حقيقية لموقف سيارات في الملكية العامة، ببث رئيسي بدقة 1920×1080 و15 إطاراً بمعدل قرابة 4 ميجابت، وبث فرعي بدقة 640×360 و10 إطارات بمعدل 512 كيلوبت، دون إعادة ضغط. وكل برنامج يعمل وحده، والآخران متوقفان، على شبكة Docker واحدة مع الكاميرا، وكل المنافذ على `127.0.0.1` فقط. وملف الكاميرا `mediamtx.yml`:

```yaml
# The shared fake camera: a public-domain parking-lot CCTV clip, published as a main stream
# (1080p, 15 fps, H.264 about 4 Mbps) and a sub stream (360p, 10 fps, about 512 kbps), without re-encoding.
paths:
  main:
    runOnInit: ffmpeg -re -stream_loop -1 -i /samples/cam-main-h264.mp4 -c copy -f rtsp rtsp://localhost:8554/main
    runOnInitRestart: yes
  sub:
    runOnInit: ffmpeg -re -stream_loop -1 -i /samples/cam-sub-h264.mp4 -c copy -f rtsp rtsp://localhost:8554/sub
    runOnInitRestart: yes
```

```bash
docker network create scv-nvrnet
docker run -d --name scv-cam --network scv-nvrnet -v "$PWD/mediamtx.yml:/mediamtx.yml:ro" \
  -v "$PWD/media:/samples:ro" bluenviron/mediamtx:1.21.1-ffmpeg
```

وللقياس نستخدم سكربتاً صغيراً `stats.sh` يقرأ [docker stats](https://docs.docker.com/reference/cli/docker/container/stats/?ref=arabroot.io) كل 15 ثانية عشرين مرة، أي خمس دقائق، ثم يحسب المتوسط. ولاحظ أن نسبة المعالج في docker stats تحسب على نواة واحدة، فإذا قرأت 100% فهذه نواة كاملة، وجهاز التجربة فيه ثمانية خيوط، أي أن 800% هي الجهاز كله:

```bash
# Sample CPU and memory of the given containers every 15 s for N samples, then print the averages.
# usage: sh stats.sh <samples> <container> [<container>...]
n=$1; shift
for i in $(seq 1 $n); do
  docker stats --no-stream --format '{{.Name}} {{.CPUPerc}} {{.MemUsage}}' "$@"
  sleep 15
done | awk '{ gsub("%","",$2); m=$3; u=$3; sub(/[A-Za-z]+$/,"",m); if (u ~ /GiB$/) m*=1024; cpu[$1]+=$2; mem[$1]+=m; c[$1]++ }
  END { for (k in cpu) printf "%-16s avg CPU %6.1f%%  avg RAM %7.1f MiB  (%d samples)\n", k, cpu[k]/c[k], mem[k]/c[k], c[k] }'
```

### Frigate: ملف واحد ويعمل

Frigate أسهل الثلاثة في الإعداد، لأن الكاميرا كلها في ملف `config/config.yml`، والبث الرئيسي للتسجيل والفرعي للكشف بدورين Roles صريحين:

```yaml
mqtt:
  enabled: false

detectors:
  ov:
    type: openvino
    device: CPU

model:
  width: 300
  height: 300
  input_tensor: nhwc
  input_pixel_format: bgr
  path: /openvino-model/ssdlite_mobilenet_v2.xml
  labelmap_path: /openvino-model/coco_91cl_bkgr.txt

record:
  enabled: true
  continuous:
    days: 1

cameras:
  parking:
    ffmpeg:
      inputs:
        - path: rtsp://scv-cam:8554/main
          roles: [record]
        - path: rtsp://scv-cam:8554/sub
          roles: [detect]
    detect:
      width: 640
      height: 360
      fps: 5
    objects:
      track: [person, car]

version: 0.18-0
```

```bash
docker run -d --name scv-frigate --network scv-nvrnet --shm-size=256m -p 127.0.0.1:19175:8971 \
  -v "$PWD/frigate-config:/config" -v scv-frigate-media:/media/frigate \
  --tmpfs /tmp/cache:size=1000000000 ghcr.io/blakeblackshear/frigate:0.18.2
docker exec scv-frigate sh -c 'curl -s http://127.0.0.1:5000/api/version; echo
  curl -s http://127.0.0.1:5000/api/stats | jq "{cam: .cameras.parking | {camera_fps, process_fps, skipped_fps, detection_fps}}"'
```

```text
0.18.2-cfa08c5
{
  "cam": {
    "camera_fps": 4.3,
    "process_fps": 4,
    "skipped_fps": 0.22,
    "detection_fps": 0
  }
}
```

وبعد خمس دقائق من القياس كانت `process_fps` قرابة 5.1 و`skipped_fps` صفراً، أي أن Frigate حلل كل إطار من البث الفرعي دون أن يتخطى شيئاً، وهذا فرق كبير عن تجربة دليل Frigate التي حلل فيها البث الرئيسي بدقة 720p فتخطى أغلب الإطارات. ولاحظ أن `detection_fps` بقي صفراً، والسبب أن هذا المشهد هادئ والحركة فيه صغيرة جداً في صورة 640×360، فلم يجد كشف الحركة منطقة تستحق تشغيل النموذج، وهذا سلوك مقصود يوفر المعالج، ولكنه يعني أيضاً أن كشف الأجسام البعيدة يحتاج دقة كشف أعلى أو كاميرا أقرب، وهذا موضوع المقال القادم. والصورة التالية للبث الحي في واجهة Frigate أثناء التجربة:

![واجهة Frigate 0.18.2 بقائمة أيقونات على اليسار، وبطاقة البث الحي لكاميرا parking تعرض موقف السيارات من الأعلى بالسيارات والأشجار والسماء](https://arabroot.io/content/images/2026/10/nvr-comparison-03-frigate.webp)

Frigate: البث الحي للكاميرا الوهمية، من تثبيتنا في التجربة

### ZoneMinder: قاعدة بيانات وواجهة برمجية وخطأ غريب

ZoneMinder يحتاج قاعدة MariaDB منفصلة، كما في [توثيق التثبيت بـ Docker](https://zoneminder.readthedocs.io/en/latest/installationguide/docker.html?ref=arabroot.io)، ويحتاج ذاكرة مشتركة `/dev/shm` يضع فيها إطارات كل كاميرا، والقيمة الافتراضية في ملفهم 1 جيجابايت، ويحتاج `/run` قابلاً للتنفيذ لأن مدير الخدمات s6-overlay يعمل منه:

```bash
cat > zm.env <<'EOF'
TZ=UTC
ZM_DB_NAME=zm
ZM_DB_USER=zmuser
ZM_DB_PASS=zm-lab-7d2e9c
MARIADB_ROOT_PASSWORD=root-lab-4b8f1a
EOF
docker run -d --name scv-zm-db --network scv-nvrnet --env-file zm.env -e MARIADB_DATABASE=zm \
  -e MARIADB_USER=zmuser -e MARIADB_PASSWORD=zm-lab-7d2e9c mariadb:11.8.9 \
  --transaction-isolation=READ-COMMITTED --skip-log-bin --innodb-buffer-pool-size=256M
docker run -d --name scv-zm --network scv-nvrnet --env-file zm.env -e ZM_DB_HOST=scv-zm-db \
  -p 127.0.0.1:19176:80 --shm-size=1g --tmpfs /run:exec,mode=0755 --tmpfs /tmp \
  -v scv-zm-events:/var/cache/zoneminder ghcr.io/zoneminder/zoneminder:1.38.6
```

ثم أضفنا الكاميرا عبر الواجهة البرمجية REST API بدل الواجهة الرسومية، حتى تكون الخطوة قابلة للتكرار، بالسكربت `zm-add-monitor.sh`، وفيه نسجل البث الرئيسي دائماً دون إعادة ضغط، ونحلل البث الفرعي:

```bash
# Add the fake camera to ZoneMinder through its REST API (authentication is off on a fresh 1.38 install):
# record the main stream all the time (passthrough, no re-encoding), analyse the sub stream for motion.
curl -s -X POST http://127.0.0.1:19176/zm/api/monitors.json \
  -d 'Monitor[Name]=parking' -d 'Monitor[Type]=Ffmpeg' -d 'Monitor[Device]=/dev/video0' -d 'Monitor[Method]=rtpRtsp' \
  -d 'Monitor[Path]=rtsp://scv-cam:8554/main' -d 'Monitor[SecondPath]=rtsp://scv-cam:8554/sub' \
  -d 'Monitor[Width]=1920' -d 'Monitor[Height]=1080' -d 'Monitor[Colours]=4' \
  -d 'Monitor[Capturing]=Always' -d 'Monitor[Analysing]=Always' -d 'Monitor[AnalysisSource]=Secondary' \
  -d 'Monitor[Recording]=Always' -d 'Monitor[RecordingSource]=Primary' \
  -d 'Monitor[Decoding]=Always' -d 'Monitor[VideoWriter]=2' -d 'Monitor[SaveJPEGs]=0' -d 'Monitor[MaxFPS]=15'
echo
curl -s http://127.0.0.1:19176/zm/api/monitors.json | python -c "import sys,json;[print({k:m['Monitor'][k] for k in ('Id','Name','Capturing','Analysing','AnalysisSource','Recording','RecordingSource','VideoWriter')}) for m in json.load(sys.stdin)['monitors']]"
```

وفي المحاولة الأولى لم يكن السطر `Monitor[Device]` موجوداً، فرفض ZoneMinder الكاميرا بهذا الرد، مع أن نوعها Ffmpeg عبر الشبكة ولا علاقة لها بأي جهاز محلي:

```text
{"message":{"Device":["Invalid device path. Must be a valid \/dev\/ path (e.g. \/dev\/video0).","Invalid device path. Must be a valid \/dev\/ path (e.g. \/dev\/video0)."]}}
```

فأضفنا مساراً شكلياً `/dev/video0`، والحقل لا يستخدم لهذا النوع، فقبلها:

```text
{"message":"Saved"}
{'Id': 1, 'Name': 'parking', 'Capturing': 'Always', 'Analysing': 'Always', 'AnalysisSource': 'Secondary', 'Recording': 'Always', 'RecordingSource': 'Primary', 'VideoWriter': 2}
```

في الإعداد أعلاه لاحظ أن ZoneMinder 1.38 فصل ما كان يسمى «الوظيفة» Function في الإصدارات القديمة، مثل Modect وMocord، إلى ثلاثة حقول مستقلة: `Capturing` و`Analysing` و`Recording`، وأن `AnalysisSource=Secondary` هو الذي يجعله يحلل البث الفرعي، و`VideoWriter=2` يعني الكتابة المباشرة Passthrough دون إعادة ضغط. ثم في سجل الخدمة رأينا هذا بعد ثوان من الإضافة:

```text
10/28/26 13:19:55.053752 zmwatch[543].INF [main:133] [Restarting capture daemon for 1 parking, shared data not valid]
10/28/26 13:20:26.191159 zmdc[497].WAR [ZMServer:447] ['zmc -m 1' has not stopped at 26/10/28 13:20:26 after 30 seconds. Sending KILL to pid 741]
10/28/26 13:20:26.480366 zmdc[497].INF [ZMServer:761] ['zmc -m 1' crashed, signal 8]
10/28/26 13:20:27.584240 zmdc[497].INF [ZMServer:445] ['zmc -m 1' starting at 26/10/28 13:20:27, pid = 763]
```

أي أن عملية المراقبة `zmwatch` وجدت بيانات الكاميرا في الذاكرة المشتركة غير صالحة، فأعادت تشغيل `zmc`، وبعد 30 ثانية لم يتوقف فقتلته وبدأ من جديد، ثم عمل بعدها دون مشكلة. وهذه ميزة وعيب معاً: النظام يصلح نفسه، ولكن عليك أن تقرأ سجلاته لتعرف ما حدث، وقد شرحنا قراءة السجلات في [السجلات للمطورين ومديري السيرفرات](https://arabroot.io/articles/%D8%A7%D9%84%D8%B3%D8%AC%D9%84%D8%A7%D8%AA-logging-%D9%84%D9%84%D9%85%D8%B7%D9%88%D8%B1%D9%8A%D9%86-%D9%88%D9%85%D8%AF%D9%8A%D8%B1%D9%8A-%D8%A7%D9%84%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D8%A7%D8%AA/). والصورة التالية لصفحة Console بعد بداية التسجيل:

![صفحة Console في ZoneMinder 1.38.6 بشريط علوي فيه Load وCpu وDB وMemory وكلمة RUNNING، وجدول فيه كاميرا واحدة parking بصورة مصغرة، ووظيفتها Analysing Always وRecording Always، والمصدر scv-cam بدقة 1920x1080، و15 إطاراً للالتقاط و12.19 للتحليل و353.84 كيلوبايت في الثانية، و6 أحداث بحجم 241.89 ميجابايت](https://arabroot.io/content/images/2026/10/nvr-comparison-04-zoneminder.webp)

ZoneMinder: الكاميرا تلتقط وتحلل وتسجل، من تثبيتنا في التجربة

وعند أول فتح للواجهة لم تظهر صفحة Console، وإنما صفحة الخصوصية Privacy التي تطلب منك أن تقرر بشأن خدمة القياس Telemetry، وتذكر الصفحة نفسها أن هذه الخدمة تجمع معرفاً فريداً، وموقعاً على مستوى المدينة باستعلام من خدمة ipinfo.io، وعدد الكاميرات والأحداث، ومعلومات النظام، وبعض إعدادات كل كاميرا. والقرار لك، ولكن اقرأ الصفحة قبل أن تضغط، والتوثيق يذكر أن الواجهة تبقى تعيدك إليها حتى تجيب.

### Shinobi: مستخدم خارق وكلمة مرور معروفة

Shinobi في طريقة Docker البسيطة صورة واحدة فيها التطبيق وقاعدة البيانات، كما في [ملف Docker في مستودعه](https://gitlab.com/Shinobi-Systems/Shinobi/-/blob/dev/Docker/README.md?ref=arabroot.io):

```bash
docker run -d --name scv-shinobi --network scv-nvrnet -p 127.0.0.1:19177:8080 --memory=2g \
  -v scv-shinobi-db:/var/lib/mysql -v scv-shinobi-videos:/home/Shinobi/videos \
  registry.gitlab.com/shinobi-systems/shinobi:latest
```

والإعداد الأول فيه طبقتان: مستخدم خارق Superuser يدير الحسابات فقط، ثم حساب مدير Admin يضيف الكاميرات. وكلمة مرور المستخدم الخارق الافتراضية معروفة، فهذا محتوى ملف `super.json` داخل الصورة كما وجدناه:

```bash
docker exec scv-shinobi cat /config/super.json
```

```text
[
    {
        "mail":"admin@shinobi.video",
        "pass":"21232f297a57a5a743894a0e4a801fc3"
    }
]
```

والقيمة `21232f297a57a5a743894a0e4a801fc3` هي هاش MD5 لكلمة `admin`، أي أن المستخدم الخارق في كل تثبيت جديد هو `admin@shinobi.video` بكلمة المرور `admin`، ومحفوظة بخوارزمية MD5 دون ملح Salt، وهي خوارزمية لا تصلح لتخزين كلمات المرور كما شرحنا في مقالات الأمن. لذلك أول ما تفعله بعد التثبيت أن تغير هذه الكلمة، ولا تترك المنفذ مكشوفاً حتى تفعل. ثم أنشأنا حساب المدير وأضفنا الكاميرا عبر الواجهة البرمجية بالسكربت `shinobi-setup.sh`:

```bash
# Shinobi has no setup wizard in its API: log in as the superuser (default admin@shinobi.video / admin),
# create an admin account, log in as that account, then add the camera as a monitor.
H=http://127.0.0.1:19177
SUPER=$(curl -s -X POST "$H/super" --data-urlencode "mail=admin@shinobi.video" --data-urlencode "pass=admin" \
  --data-urlencode "function=super" | grep -o 'sessionKey":"[A-Za-z0-9]*' | head -1 | cut -d'"' -f3)
echo "superuser session: ${SUPER:0:6}..."
curl -s -X POST "$H/super/$SUPER/accounts/registerAdmin" \
  --data-urlencode 'data={"mail":"ops@example.com","pass":"Lab-Shinobi-91c4e2","password_again":"Lab-Shinobi-91c4e2"}'
echo
LOGIN=$(curl -s -X POST "$H/?json=true" --data-urlencode "mail=ops@example.com" --data-urlencode "pass=Lab-Shinobi-91c4e2")
AUTH=$(echo "$LOGIN" | grep -o '"auth_token": "[^"]*' | cut -d'"' -f4)
KE=$(echo "$LOGIN" | grep -o '"ke": "[^"]*' | head -1 | cut -d'"' -f4)
echo "group key: $KE, token: ${AUTH:0:6}..."
echo "$AUTH $KE" > /tmp/shinobi.auth
# the monitor: record the main stream as-is (copy), detector off, motion detection on the sub stream left off
MON='{"mid":"parking","name":"parking","type":"h264","protocol":"rtsp","host":"scv-cam","port":"8554","path":"/main","mode":"record","fps":"15","width":"1920","height":"1080","details":{"auto_host_enable":"1","auto_host":"rtsp://scv-cam:8554/main","rtsp_transport":"tcp","vcodec":"copy","acodec":"no","stream_type":"hls","stream_vcodec":"copy","cutoff":"5","detector":"0","input_map_choices":{"stream":[],"snap":[],"record":[],"detector":[],"detector_object":[],"detector_sub":[]}}}'
curl -s -G "$H/$AUTH/configureMonitor/$KE/parking" --data-urlencode "data=$MON"
echo
curl -s "$H/$AUTH/monitor/$KE/parking" | grep -oE '"(mid|mode|status|code)": "[^"]*"' | head -6
```

والمخرج في التشغيل الأول كان:

```text
superuser session: CFvqzn...
{
   "ok": true
}
group key: , token: ...
```

أي أن حساب المدير أنشئ، ولكن مفتاح المجموعة والتوكن خرجا فارغين، والسبب أن Shinobi يرد بنص JSON منسق فيه مسافة بعد النقطتين، ونمط `grep` الأول كان يتوقعها دون مسافة، فأصلحنا النمط إلى ما تراه في السكربت أعلاه وأعدنا التشغيل:

```text
   "ok": false,
   "msg": "Already exists"
}
group key: 5VjtCvhHgN, token: 4f4820...
{
   "ok": true,
   "msg": "Monitor Added by user. : F4U5YHrzOU"
}
"mid": "parking"
"mode": "record"
"status": "Starting"
"code": "1"
```

والرد «Already exists» طبيعي لأن الحساب أنشئ في التشغيل الأول. ولكن الكاميرا بقيت في حالة `Starting`، وفي سجل Shinobi تكرر هذا الخطأ:

```text
2026-10-28T13:57:39+00:00 TypeError: Cannot read properties of undefined (reading 'stream')
    at buildMainStream (/home/Shinobi/libs/ffmpeg/builders.js:411:74)
```

وقراءة السطر 411 في الملف داخل الصورة بينت أن الكود يقرأ `e.details.input_map_choices.stream` دون أن يتحقق من وجوده، والواجهة الرسومية ترسل هذا الحقل دائماً، أما الواجهة البرمجية فلا تضيفه، لذلك أضفنا `input_map_choices` بقوائم فارغة كما في السكربت، فتحولت الحالة إلى `Recording`، وبدأت الملفات تظهر في `/home/Shinobi/videos`. والدرس أن الواجهة البرمجية في Shinobi تفترض أنك ترسل كل ما ترسله الواجهة الرسومية، والتوثيق لا يذكر ذلك، فإذا أتمتت إضافة الكاميرات فابدأ بتصدير إعداد كاميرا من الواجهة واستخدمه قالباً. والصورة التالية للوحة Shinobi أثناء التسجيل، ولاحظ التنبيه في الزاوية:

![لوحة Shinobi الداكنة: في اليسار حساب ops@example.com ومونيتور واحد وساعة واستهلاك النظام وقائمة Home وLive Grid وMonitors وTimeline وVideos وEvents، وفي الوسط Recent Videos فيها تسجيل parking لموقف السيارات من 17:04:14 إلى 17:52:23، وفي الزاوية العليا تنبيه أحمر Max Storage Amount يطلب ضبط الحد الأعلى للتخزين ويذكر أن القيمة الافتراضية 10 GB](https://arabroot.io/content/images/2026/10/nvr-comparison-05-shinobi.webp)

Shinobi: التسجيل يعمل، والتنبيه يذكر أن حد التخزين الافتراضي للحساب 10 GB

والتنبيه مهم: حد التخزين الافتراضي لكل حساب 10 جيجابايت، وبمعدل هذه الكاميرا الذي حسبناه في [دليل Frigate](https://arabroot.io/articles/frigate-%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/#lab-recordings) وفي مقال التخزين، يمتلئ هذا الحد في أقل من ست ساعات لكاميرا واحدة، فاضبطه بحسب قرصك قبل أي شيء آخر، وإلا بدأ البرنامج يحذف القديم مبكراً جداً.

## الأرقام: المعالج والذاكرة

قسنا كل برنامج خمس دقائق في وضعين حيث أمكن: تسجيل فقط، أي التقاط البث الرئيسي وكتابته كما هو، ثم تسجيل مع تحليل، أي ZoneMinder يحلل الحركة في البث الفرعي، وFrigate يكشف الحركة والأجسام في البث الفرعي. أما Shinobi فقسناه في وضع التسجيل فقط، لأن كشف الحركة فيه لم يظهر في أمر ffmpeg عندما فعلناه بالحقول التي جربناها عبر الواجهة البرمجية، ولم نرد أن ننشر رقماً لا نثق أنه يقيس ما نقول. والنتائج كما يلي:

```text
### Shinobi, record only
scv-shinobi      avg CPU    2.9%  avg RAM   286.3 MiB  (20 samples)
### ZoneMinder, record only (Analysing=None, Decoding=None)
scv-zm           avg CPU    2.9%  avg RAM   260.4 MiB  (20 samples)
scv-zm-db        avg CPU    0.3%  avg RAM   171.4 MiB  (20 samples)
### Frigate, record only (detect: enabled: false)
scv-frigate      avg CPU   19.0%  avg RAM   867.7 MiB  (20 samples)
### ZoneMinder, record + motion analysis on the sub stream (Decoding=Always)
scv-zm           avg CPU   32.2%  avg RAM   993.4 MiB  (20 samples)
scv-zm-db        avg CPU    0.7%  avg RAM   169.7 MiB  (20 samples)
### Frigate, record + motion and objects on the sub stream (OpenVINO CPU)
scv-frigate      avg CPU   14.4%  avg RAM   902.5 MiB  (20 samples)
```

والصورة التالية تضع الأرقام نفسها في رسم، مع جمع ZoneMinder وقاعدة بياناته المنفصلة:

![رسمان بأعمدة أفقية. المعالج: Shinobi تسجيل فقط 2.9%، وZoneMinder تسجيل فقط 3.2%، وFrigate تسجيل فقط 19.0%، وZoneMinder مع تحليل الحركة 32.9%، وFrigate مع الحركة والأجسام 14.4%. والذاكرة: Shinobi 286 ميبي بايت، وZoneMinder تسجيل فقط 432، وFrigate تسجيل فقط 868، وZoneMinder مع التحليل 1163، وFrigate مع الحركة والأجسام 902](https://arabroot.io/content/images/2026/10/nvr-comparison-02-results.webp)

التسجيل وحده خفيف في كل البرامج، والفرق كله في طريقة التحليل

في الأرقام أعلاه لاحظ التالي:

- التسجيل وحده عمل خفيف جداً في ZoneMinder وShinobi، أقل من 3.5% من نواة واحدة لكل منهما، والسبب أن البرنامجين ينسخان الفيديو كما وصل إلى القرص دون فك ضغطه، وهذا يعني أن جهازاً صغيراً جداً يسجل عشرات الكاميرات إذا لم تطلب منه تحليلاً.
- Frigate في وضع التسجيل فقط أخذ 19% وقرابة 870 ميبي بايت، أي أن له حملاً أساسياً من عملياته الخاصة بلغة Python، مثل المراقبة والمعاينات وخادم البث المدمج go2rtc، يدفعه حتى لو لم يحلل شيئاً، ورأينا ذلك في `top` داخل ال Container حيث كانت ثلاث عمليات Python تأخذ كل منها قرابة 5.6% في لحظة القراءة. ولاحظ أن رقمه مع الكشف، 14.4%، كان أقل من رقمه دون كشف، وهذا فرق بين قياسين في وقتين مختلفين وليس لأن الكشف يوفر المعالج، فخذ من هذه الأرقام حجمها التقريبي، لا الفرق الصغير بينها.
- ZoneMinder مع التحليل قفز إلى قرابة 33% وأكثر من جيجابايت من الذاكرة، أي أكثر من ضعف Frigate الذي يفعل كشفاً أذكى. والسبب الأرجح الإعداد `Decoding=Always` الذي يجعل ZoneMinder يفك البث الرئيسي بدقة 1080p أيضاً، لا الفرعي وحده، والذاكرة تذهب إلى حلقة الإطارات المفكوكة في الذاكرة المشتركة. وفي إعدادات ZoneMinder خيارات أخرى للفك مثل `KeyFrames` و`Ondemand` تقلل هذا الحمل، فجربها على كاميراتك قبل أن تحكم.
- هذه أرقام كاميرا واحدة على جهاز واحد، ومشهد هادئ لم يطلق كشف الأجسام في Frigate، لذلك لا تضربها في عدد الكاميرات مباشرة، وإنما استخدمها لتعرف أي البرامج يدفع حملاً أساسياً، وأين يذهب الحمل عندما تفعل التحليل.

## التخزين والاحتفاظ: من يحذف ماذا، ومتى؟

في [دليل Frigate](https://arabroot.io/articles/frigate-%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/#retention) ومقال التخزين من هذه المرحلة رأينا أن طريقة الاحتفاظ هي التي تقرر كم يوماً يحفظ القرص، والبرامج الثلاثة تختلف في هذه النقطة اختلافاً كبيراً، لا في القدرة وإنما في الفلسفة:

- **Frigate يفكر بالأيام وبنوع الفيديو:** تحدد في [إعداد التسجيل](https://docs.frigate.video/configuration/record?ref=arabroot.io) أياماً للتسجيل المستمر، وأياماً لأجزاء الحركة، وأياماً للتنبيهات والاكتشافات، وهو يحذف كل جزء بأطول مدة تنطبق عليه، ويحذف أقدم التسجيلات تلقائياً عندما تبقى قرابة ساعة فقط من المساحة كما يذكر التوثيق. أي أن القرار كله في ملف واحد، ويتبع نوع الحدث.
- **ZoneMinder يفكر بالأحداث والمرشحات:** كل تسجيل عنده حدث Event، حتى التسجيل المستمر يقسم إلى أحداث متتالية، والحذف يتم بمرشحات Filters تعمل في الخلفية، وهي استعلامات على قاعدة البيانات تقول «اختر الأحداث التي تحقق كذا، ثم افعل بها كذا». وفي التثبيت الجديد مرشح افتراضي قرأناه من قاعدة البيانات نفسها:

```text
        Id: 1
      Name: PurgeWhenFull
Query_json: {"sort_field":"Id","terms":[{"val":0,"attr":"Archived","op":"="},{"cnj":"and","val":95,"attr":"DiskPercent","op":">="},{"cnj":"and","obr":"0","attr":"EndDateTime","op":"IS NOT","val":"NULL","cbr":"0"}],"limit":100,"sort_asc":1}
AutoDelete: 1
Background: 1
```

أي أن المرشح يختار الأحداث غير المؤرشفة، عندما يصل القرص إلى 95% أو أكثر، والأحداث المنتهية فقط، ويرتبها من الأقدم، ويحذف 100 منها في كل مرة، ويعمل في الخلفية دائماً. وهذا يعني أن ZoneMinder في إعداده الافتراضي يملأ القرص حتى 95% ثم يحذف الأقدم، ولا يعرف شيئاً عن «سبعة أيام» أو «ثلاثين يوماً» حتى تكتب مرشحاً لذلك بنفسك، مثل مرشح يحذف ما عمره أكثر من 30 يوماً، أو مرشح يؤرشف الأحداث التي فيها حركة حتى لا يحذفها الأول. وهذه قوة لمن يريد قواعد دقيقة، وفخ لمن يظن أن المدة تضبط وحدها.

- **Shinobi يفكر بالحساب والحجم:** لكل حساب حد أعلى للتخزين وأيام للاحتفاظ في إعدادات الحساب، ورأينا التنبيه الذي يذكر أن الحد الافتراضي 10 جيجابايت، ولكل كاميرا طول المقطع وأيام إضافية. وهذا مناسب لنموذج المؤسسة متعددة الحسابات الذي يخدمه Shinobi، حيث تحتاج أن تقسم القرص بين مجموعات، ولكنه يعني أن الحد الافتراضي صغير جداً لأي استخدام حقيقي.

والسؤال الذي تسأله لأي برنامج قبل أن تعتمده: إذا امتلأ القرص الليلة، ماذا يحذف أولاً، وهل يحتفظ بالمقطع الذي صدرته لتحقيق؟ وفي الثلاثة تستطيع أن تحمي المقطع المهم، بالتصدير Export في Frigate، وبالأرشفة Archive في ZoneMinder التي يستثنيها المرشح الافتراضي كما رأينا، وبالتنزيل أو الحماية من الحذف في Shinobi، ولكن عليك أن تفعل ذلك بنفسك.

## الكشف الذكي: مدمج أم إضافة؟

هنا أكبر فرق عملي بين البرامج الثلاثة، لأن التنبيهات هي ما يجعلك تستخدم النظام أصلاً بدل أن تنساه:

- **Frigate:** كشف الأجسام هو تصميمه الأساسي، ويعمل من أول تشغيل بنموذج موجود داخل الصورة، ويدعم كواشف كثيرة من المعالج وOpenVINO إلى Coral ووحدات GPU كما في [صفحة الكواشف](https://docs.frigate.video/configuration/object%5Fdetectors?ref=arabroot.io)، والتنبيهات مبنية على نوع الجسم ومكانه.
- **ZoneMinder:** يكشف الحركة بالمناطق Zones ونسب التغير، وهي أدق تحكم في الحركة بين الثلاثة، أما كشف الأجسام فعبر خادم الأحداث zmeventnotificationNg وخدمة نماذج منفصلة اسمها pyzm-serve تشغل نماذج YOLO، وكلها في ملف Compose الرسمي ضمن ملف تعريف اختياري. أي أن الكشف الذكي ممكن، ولكنه خدمتان إضافيتان تثبتهما وتصونهما.
- **Shinobi:** يكشف الحركة من إعدادات الكاميرا، وكشف الأجسام عبر إضافات يثبتها المستخدم، والتوثيق في [موقعه](https://docs.shinobi.video/?ref=arabroot.io) يشرح الإضافات المتاحة.

والخلاصة أن من يريد تنبيهاً على «شخص عند الباب» دون أعمال إضافية فطريقه الأقصر Frigate، ومن يريد تحكماً دقيقاً في الحركة ومرشحات معقدة للأحداث فقد يجد ZoneMinder أنسب، ويضيف الكشف الذكي بعد ذلك.

## الأمان الافتراضي: ماذا وجدنا بعد التثبيت؟

هذا القسم لا تجده في جداول الميزات، وهو من أهم ما في المقارنة، لأن أغلب الناس يتركون الإعداد الافتراضي كما هو:

| البرنامج        | تسجيل الدخول بعد التثبيت                                                                     | ما يجب أن تنتبه له                                                                                                                                                   |
| --------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Frigate         | مفعل، وينشئ مستخدماً اسمه admin بكلمة مرور عشوائية يطبعها في السجل                           | المنفذ الداخلي 5000 دون تسجيل دخول ويعامل كل طلب كمدير كما في [توثيق المصادقة](https://docs.frigate.video/configuration/authentication?ref=arabroot.io)، فلا تنشره   |
| ZoneMinder 1.38 | معطل افتراضياً بحسب توثيق Docker، وتفعله من Options ثم تدخل ب admin وكلمة مرور admin وتغيرها | ملف الإعداد الرسمي يذكر أن البث الحي عبر go2rtc لا يحتاج تسجيل دخول حتى مع تفعيل المصادقة، فمن يصل إلى منفذ الويب يستطيع المشاهدة، وصفحة القياس Telemetry تطلب قرارك |
| Shinobi         | المستخدم الخارق admin@shinobi.video بكلمة المرور admin                                       | كلمة المرور محفوظة بهاش MD5 دون ملح في super.json، وحد التخزين الافتراضي 10 GB لكل حساب                                                                              |

والقاعدة نفسها في الثلاثة: لا تنشر منفذ البرنامج على الإنترنت، وادخل إليه من الخارج عبر VPN، وغير كل كلمة مرور افتراضية قبل أن تضيف أول كاميرا، وقد شرحنا ذلك بالتجربة في مقال تأمين الكاميرات من هذه المرحلة. ولاحظ أن ZoneMinder يتجه إلى الأفضل، فالتوثيق يذكر أن الإصدارات من 1.39 فما بعد تبدأ والمصادقة مفعلة، وتطلب منك في أول صفحة أن تضع كلمة مرور المدير.

## الإشعارات والتكامل مع الأنظمة الأخرى

النظام الذي يسجل ولا يخبرك بشيء ينساه الجميع بعد أسبوع، والنظام الذي يرسل مئة تنبيه في اليوم يتجاهله الجميع بعد يومين، لذلك قارن طريقة كل برنامج في إخراج الأحداث إلى العالم. في Frigate يخرج كل شيء عبر MQTT، فكل جسم يتغير ينشر رسالة، وكل تنبيه في المراجعة ينشر رسالة، ويستهلكها Home Assistant أو Node-RED أو أي برنامج تكتبه، وهذا هو موضوع مقال ربط الكاميرات بالمنزل الذكي في هذه المرحلة. وفي ZoneMinder يأتي التكامل من جهتين: واجهة برمجية REST كاملة استخدمناها في التجربة لإضافة الكاميرا، وخادم الأحداث zmeventnotificationNg في صور `-es` الذي يذكر ملف Compose الرسمي أنه يرسل إشعارات Push وعبر WebSocket وMQTT. وفي Shinobi واجهة برمجية استخدمناها أيضاً، وخيارات للإشعارات في إعدادات كل كاميرا. والسؤال العملي: هل يستطيع البرنامج أن يرسل لك تنبيهاً واحداً واضحاً فيه صورة الشخص ورابط المقطع، دون أن يرسل تنبيهاً لكل ورقة شجرة؟ وهذا يعتمد على جودة الكشف قبل أن يعتمد على قناة الإشعار.

## مثال: حساب عتاد المستودع بالأرقام

لنعد إلى شركتنا بثماني كاميرات، ونحول أرقام التجربة إلى قرار عتاد، مع التذكير بأنها أرقام كاميرا واحدة في مشهد هادئ على معالج قديم نسبياً من الجيل السابع لـ Intel:

- **التخزين متساو تقريباً في الثلاثة:** لأنها كلها تكتب البث الرئيسي كما وصل، وبمعدل هذه الكاميرا الذي قسناه في مقال المصطلحات، قرابة 3.68 ميجابت، تكتب الكاميرا قرابة 40 جيجابايت في اليوم في أي برنامج، فالبرنامج لا يغير حجم القرص، وإنما يغير طريقة الاحتفاظ كما رأينا.
- **التسجيل وحده:** في ZoneMinder قرابة 3.2% من نواة لكل كاميرا مع قاعدة البيانات، أي أن ثماني كاميرات قد تحتاج قرابة ربع نواة، وهذا يعمل على أي جهاز صغير، والذاكرة قرابة 260 ميبي بايت لعملية الكاميرا الواحدة، فتحسب لكل كاميرا إضافية ما تقيسه أنت.
- **مع التحليل:** في Frigate حمل أساسي قرابة 15% من نواة وقرابة 900 ميبي بايت، ثم يزيد مع كل كاميرا بقدر فك بثها الفرعي وتشغيل النموذج على مناطق حركتها، وكاشف مسرع ينقل أغلب حمل النموذج عن المعالج.
- **القرار:** جهاز صغير بأربع أنوية حديثة و16 جيجابايت ذاكرة يكفي الشركة لتسجيل الكاميرات الثماني مع كشف الأجسام على البث الفرعي في Frigate، بشرط أن تقيس بعد التركيب أول أسبوع، وأن تضيف كاشفاً مسرعاً إذا رأيت أن Frigate يتخطى إطارات كثيرة في `skipped_fps`، كما شرحنا في دليل Frigate.

ولاحظ أن هذا الحساب يبدأ من القياس لا من جدول المواصفات، وهو نفس الأسلوب الذي استخدمناه في [عتاد الهوم لاب](https://arabroot.io/articles/%D8%B9%D8%AA%D8%A7%D8%AF-%D8%A7%D9%84%D9%87%D9%88%D9%85-%D9%84%D8%A7%D8%A8-mini-pc-%D8%A7%D9%85-nas-%D8%A7%D9%85-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1-%D9%85%D8%B3%D8%AA%D8%B9%D9%85%D9%84/) لاختيار الجهاز، فكل رقم فيه تستطيع أن تراجعه بعد التركيب وتصححه.

## التشغيل اليومي: الترقية والتوسع والدعم

البرنامج الذي تختاره اليوم سوف تعيش معه سنوات، لذلك اسأل عن ثلاثة أشياء بعد التثبيت، لا قبله فقط:

### الترقية Upgrade

في Frigate كل إصدار رئيسي قد يغير صيغة ملف الإعداد، وملاحظات الإصدار تذكر التغييرات غير المتوافقة Breaking Changes، والسطر `version: 0.18-0` في الملف يخبر البرنامج بصيغته، فإذا غاب حاول ترحيل الملف وأخذ نسخة منه، كما رأينا في دليله، لذلك ثبت رقم الإصدار في الصورة وخذ نسخة من الإعداد وقاعدة البيانات قبل كل ترقية. وفي ZoneMinder يذكر [توثيق Docker](https://zoneminder.readthedocs.io/en/latest/installationguide/docker.html?ref=arabroot.io) أن ال Container عند تشغيله بصورة أحدث ينفذ `zmupdate.pl` ليرقي مخطط قاعدة البيانات، فنسخة MariaDB الاحتياطية قبل الترقية ليست اختيارية، وقد شرحنا النسخ الاحتياطي لقواعد البيانات في [النسخ الاحتياطي بقاعدة 3-2-1](https://arabroot.io/articles/%D8%A7%D9%84%D9%86%D8%B3%D8%AE-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%8A%D8%A7%D8%B7%D9%8A-%D8%A8%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-3-2-1-%D9%88%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D8%AF%D8%A9/). أما Shinobi فلا ينشر أرقام إصدارات لصوره، وإنما `latest` و`dev`، فالطريقة الوحيدة لتثبيت ما تعمل عليه هي البصمة Digest كما فعلنا، والترقية تعني أن تسحب الصورة الجديدة وتسجل بصمتها وتجربها قبل أن تنقل الإنتاج إليها.

### التوسع لعدد كبير من الكاميرات

الأرقام في تجربتنا تقول إن التسجيل دون تحليل خفيف في ZoneMinder وShinobi، فسيرفر متوسط يسجل عشرات الكاميرات بسهولة إذا كان القرص يتحمل الكتابة كما حسبنا في مقال التخزين، والحد الحقيقي يأتي من التحليل. وفي Frigate الحل الطبيعي للتوسع أن تحلل البث الفرعي، وأن تضيف كاشفاً مسرعاً، ثم أن تشغل أكثر من نسخة على أكثر من سيرفر إذا كبر العدد جداً، كل نسخة لمجموعة كاميرات. وZoneMinder يدعم عدة سيرفرات تتشارك قاعدة بيانات واحدة، وShinobi فيه نموذج سيرفر رئيسي وعقد فرعية Child Nodes، ورأينا مساراً باسم `getChildNodes` في واجهته البرمجية للمستخدم الخارق. وقبل أن تفكر في التوسع الأفقي، قس كما قسنا: كم يأخذ التحليل لكل كاميرا على عتادك، وكم كاميرا تحتاج تحليلاً أصلاً، لأن كثيراً من الكاميرات يكفيها التسجيل.

### المجتمع والدعم

ثلاثتها مشاريع يقودها عدد صغير من المطورين الأساسيين مع مجتمع، وفرق كبير بين أن يكون لديك مشكلة في برنامج يستخدمه كثيرون فتجد حلها في سؤال قديم، وبين برنامج تكون أنت فيه أول من يواجه المشكلة. ويمكنك أن تقيس ذلك من مستودع كل مشروع: تاريخ آخر إصدار، وكم إصداراً تصحيحياً صدر في آخر سنة، وهل ترد قضايا Issues، وهل يوجد توثيق محدث للإصدار الذي تثبته. وفي تجربتنا كان توثيق Frigate وZoneMinder كافياً لإكمال الإعداد، أما Shinobi فاحتجنا قراءة كوده لنعرف لماذا لا تبدأ الكاميرا عبر الواجهة البرمجية، وهذا مقياس عملي لمن سيدير النظام دون أن يكون مطوراً.

## الرخص: ليست تفصيلاً

قد يبدو هذا القسم مملاً، ولكنه قد يكون الحاسم لشركة مثل شركتنا:

- **Frigate، رخصة MIT:** رخصة متساهلة تسمح بالاستخدام والتعديل والاستخدام التجاري دون قيود تقريباً، مع الإبقاء على نص الرخصة. ولاحظ أن للمشروع خدمة مدفوعة اختيارية اسمها Frigate+ لنماذج مدربة على صور المستخدمين، والبرنامج نفسه يعمل كاملاً دونها.
- **ZoneMinder، رخصة GPL-2.0:** رخصة مفتوحة بشرط المشاركة، أي أنك تستخدمه في شركتك كما تشاء، وإذا وزعت نسخة معدلة منه فعليك أن توزع كودها بنفس الرخصة.
- **Shinobi، اتفاقية خاصة:** [ملف الرخصة](https://gitlab.com/Shinobi-Systems/Shinobi/-/blob/dev/LICENSE.md?ref=arabroot.io) يسمي نفسه «SHINOBI OPEN SOURCE SOFTWARE LICENSE AGREEMENT»، ولكنه اتفاقية استخدام End User License Agreement تعطيك ترخيص استخدام لا ملكية، وتذكر أن المرخص له يجب أن يشتري الاشتراك المناسب في حالات الاستخدام الأخرى. وتعتبر الاتفاقية منذ 12 يوليو 2022 من حالات «الاستخدام التجاري» أن يكون لديك 15 كاميرا نشطة على الأقل ولست مدرسة ابتدائية أو ثانوية، ولا ينطبق ذلك على الاستخدام الشخصي، أو أن يستخدم على جهاز كان جزءاً من عملية بيع. وتذكر أن الاستخدام المجاني يشمل الاستخدام الشخصي وغير التجاري والبحث والتعليم، وأن المؤسسات التي تستخدمه مجاناً يجب أن تذكر استخدامه في مقرها أو صفحتها.

والترجمة العملية لشركتنا: المستودع نشاط تجاري، فإذا كبر إلى 15 كاميرا أو أكثر، أو إذا كان المورد يبيع أجهزة عليها Shinobi، فالاستخدام تجاري بحسب الاتفاقية ويحتاج اشتراكاً، أما Frigate وZoneMinder فلا يتغير وضعهما مع عدد الكاميرات. واقرأ النص الكامل بنفسك، لأن الاتفاقيات تتغير مع الإصدارات.

## البث الحي والعتاد المسرع

المشاهدة الحية هي ما يفعله الحارس طوال اليوم، والبرامج الثلاثة تختلف في طريقة إيصال الصورة إلى المتصفح، وهذا يؤثر في التأخير والحمل على السيرفر:

- **Frigate:** يدمج خادم البث go2rtc، ويعرض البث الحي في المتصفح بتقنيات منخفضة التأخير مثل WebRTC وMSE، ويستطيع أن يعيد بث الكاميرا لغيره، فلا تتصل كل شاشة بالكاميرا مباشرة.
- **ZoneMinder:** يعرض البث بطريقته القديمة عبر برنامج `zms` الذي يعمل فقط عندما يشاهد أحد، كما يذكر توثيق المكونات، وفي الإصدارات الحديثة يدمج go2rtc أيضاً للعرض المباشر، ورأينا في سجلات التشغيل أن go2rtc 1.9.14 بدأ داخل ال Container على المنافذ 8554 و8555، مع التنبيه الذي ذكرناه في قسم الأمان عن البث دون تسجيل دخول.
- **Shinobi:** في إعدادنا كتب ffmpeg البث الحي بصيغة HLS بمقاطع مدتها ثانيتان وقائمة من مقطعين، كما ظهر في أمر ffmpeg داخل ال Container: `-f hls -hls_time 2 -hls_list_size 2`. وطريقة HLS مستقرة وتعمل في كل المتصفحات، ولكنها تضيف تأخيراً بعدد ثوان المقاطع في المخزن، وقد شرحنا سبب ذلك في [كيف يعمل بث الفيديو](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A8%D8%AB-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88/)، وفي Shinobi أنواع بث أخرى تختارها من إعدادات الكاميرا.

أما العتاد المسرع، فالسؤال فيه شيئان منفصلان: فك ضغط الفيديو، وتشغيل نموذج الكشف. وFrigate يغطي الاثنين بإعدادات جاهزة لفك الضغط على Intel وAMD وNVIDIA وRaspberry Pi، وبكواشف كثيرة للنماذج، كما شرحنا في [قسم التسريع بالعتاد](https://arabroot.io/articles/frigate-%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/#hardware). وملف Compose الرسمي لـ ZoneMinder فيه تعليق يشرح تمرير `/dev/dri` إلى ال Container ثم ضبط اسم المسرع والجهاز في إعدادات كل كاميرا، ونماذج الكشف تعمل في خدمة pyzm-serve وفيها صورة خاصة ب CUDA. وShinobi ينشر صوراً خاصة لبطاقات NVIDIA، ورأينا في قائمة صور المستودع أسماء مثل `latest-nvidia` و`dev-nvidia`. ولاحظ أن جهاز تجربتنا لم يستخدم أي تسريع، فكل الأرقام السابقة على المعالج وحده، والتسريع يغير ترتيبها لصالح البرنامج الذي يستفيد منه أكثر.

## ما الذي لا تقوله هذه التجربة؟

المقارنة الصادقة تذكر حدودها، وهذه حدود تجربتنا حتى تعرف أين تحتاج أن تقيس بنفسك:

- **كاميرا واحدة:** البرامج تتصرف مع عشرين كاميرا بشكل مختلف عن كاميرا واحدة، فالحمل الأساسي لـ Frigate مثلاً يدفع مرة واحدة ويتوزع على الكاميرات، والحمل لكل كاميرا في ZoneMinder يتكرر مع كل كاميرا.
- **مشهد هادئ:** المشهد لم يطلق كشف الأجسام في Frigate، ومشهد مزدحم أو ليلي فيه ضجيج يرفع حمل التحليل في البرامج كلها، كما رأينا في مقال التخزين أن المشهد يغير معدل البت أضعافاً.
- **خمس دقائق لكل وضع:** كافية للمقارنة، ولكنها لا تقول شيئاً عن الاستقرار بعد شهر، ولا عن تسرب الذاكرة إن وجد، ولا عن سلوك الحذف عندما يمتلئ القرص فعلاً.
- **إعدادات كل برنامج:** استخدمنا إعدادات معقولة قريبة من الافتراضية، وكل برنامج فيه خيارات تغير أرقامه كثيراً، مثل خيارات الفك في ZoneMinder، والكاشف في Frigate.

لذلك الأرقام هنا تجيب عن سؤال واحد: أين يذهب الحمل في كل برنامج، ولماذا. أما الرقم الذي تبني عليه شراء سيرفر، فيأتي من تجربتك بكاميراتك الحقيقية كما في القسم التالي.

## كيف تجرب بنفسك قبل أن تقرر؟

لا تعتمد على أرقامنا وحدها، وإنما كرر التجربة على عتادك وكاميراتك في يوم واحد، فهي لا تحتاج أكثر من سيرفر تجريبي وكاميرا أو اثنتين:

1. **ابدأ بالكاميرا لا بالبرنامج:** تأكد بأداة ffprobe من عنوان البث الرئيسي والفرعي، ودقة كل منهما وعدد إطاراته، فكل البرامج الثلاثة ستعتمد عليهما.
2. **شغل برنامجاً واحداً في كل مرة:** حتى لا يتقاسم برنامجان المعالج فتختلط الأرقام، وأوقف الآخر تماماً لا أن تتركه يسجل.
3. **قس وضعين لكل برنامج:** التسجيل وحده، ثم التسجيل مع التحليل الذي تحتاجه فعلاً، لأن الفرق بينهما هو ما سيحدد العتاد.
4. **اترك كل قياس مدة كافية:** خمس دقائق على الأقل بعد أن يستقر البرنامج، لا الدقيقة الأولى التي يبني فيها قاعدة البيانات ويهيئ نفسه.
5. **جرب ما سيحدث في أسبوع:** افتح صفحة المراجعة بعد ساعة، وابحث عن حدث معين، وصدر مقطعاً، واملأ قرصاً صغيراً وانظر ماذا يحذف، وأعد تشغيل السيرفر وتأكد أن كل شيء عاد وحده.
6. **اسأل من سيستخدمه:** الحارس أو المدير الذي سيفتح الواجهة كل يوم هو الحكم الحقيقي على سهولة الاستخدام، لا المطور الذي ثبتها.

## أي برنامج تختار؟

| إذا كانت حالتك                                                          | الأنسب                | والسبب                                                                                      |
| ----------------------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------------- |
| بيت أو مكتب صغير تريد فيه تنبيهات ذكية ومنزلاً ذكياً                    | Frigate               | الكشف مدمج، والتكامل مع Home Assistant عبر MQTT، والإعداد ملف واحد                          |
| كاميرات كثيرة للتسجيل المستمر على جهاز ضعيف دون تحليل                   | ZoneMinder أو Shinobi | التسجيل وحده أقل من 3.5% من نواة لكل كاميرا في تجربتنا                                      |
| تحتاج تحكماً دقيقاً في مناطق الحركة ومرشحات الأحداث وواجهة برمجية ناضجة | ZoneMinder            | أقدمها وأكثرها خيارات، ورخصته GPL-2.0                                                       |
| شركة تريد واجهة حديثة ومستعدة لدفع اشتراك                               | Shinobi               | واجهة غنية بحسابات ومجموعات، والاستخدام التجاري بحسب اتفاقيته يحتاج اشتراكاً في حالات محددة |
| شركة لا تريد أي التزام رخصة مع النمو                                    | Frigate أو ZoneMinder | رخص مفتوحة لا تتغير بعدد الكاميرات                                                          |
| عتاد فيه مسرع ذكاء اصطناعي مثل Coral أو GPU                             | Frigate               | يستفيد منه مباشرة بكواشف جاهزة                                                              |

وفي شركتنا، ثماني كاميرات مع رغبة في تنبيهات على الأشخاص في المستودع ليلاً وربط بإضاءة المدخل، فالاختيار Frigate، مع تشغيل الكشف على البث الفرعي، وقد يصبح ZoneMinder هو الاختيار لو كان المطلوب تسجيلاً مستمراً لخمسين كاميرا على سيرفر قديم دون أي تحليل.

## أخطاء شائعة في الاختيار

- المقارنة بجداول الميزات وحدها، دون تشغيل البرامج على كاميراتك وعتادك.
- تحليل البث الرئيسي بالدقة الكاملة، ثم الحكم بأن البرنامج ثقيل، والحل تحليل البث الفرعي.
- ترك كلمات المرور الافتراضية، وخاصة المستخدم الخارق في Shinobi.
- نشر منفذ البرنامج على الإنترنت للوصول من الهاتف، بدل VPN.
- تجاهل الرخصة في الاستخدام التجاري، ثم اكتشافها عندما تكبر الشركة.
- ترك حد التخزين أو مدة الاحتفاظ على القيم الافتراضية، فيحذف البرنامج القديم أبكر بكثير مما تتوقع.

### حذف التجربة

```bash
docker rm -f scv-cam scv-frigate scv-zm scv-zm-db scv-shinobi
docker volume rm scv-frigate-media scv-zm-events scv-shinobi-db scv-shinobi-videos
docker network rm scv-nvrnet
```

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- البرامج الثلاثة تتصل بالكاميرا عبر ffmpeg، والتسجيل دون إعادة ضغط خفيف في ZoneMinder وShinobi، أقل من 3.5% من نواة واحدة لكاميرا 1080p في تجربتنا.
- Frigate يدفع حملاً أساسياً قرابة 15 إلى 19% وقرابة 900 ميبي بايت حتى دون تحليل، ولكن كشف الأجسام فيه مدمج ويعمل على البث الفرعي بكفاءة.
- ZoneMinder مع تحليل الحركة وفك البث دائماً أخذ قرابة 33% وأكثر من جيجابايت، فاضبط خيارات الفك قبل أن تحكم عليه.
- الأمان الافتراضي مختلف: Frigate يبدأ بكلمة مرور عشوائية، وZoneMinder 1.38 دون مصادقة، وShinobi بمستخدم خارق admin وكلمة مرور admin محفوظة بهاش MD5.
- الرخصة فرق جوهري: MIT وGPL-2.0 لا يتغيران مع النمو، واتفاقية Shinobi تعتبر 15 كاميرا نشطة فأكثر استخداماً تجارياً.
- اختر بالحاجة: تنبيهات ذكية ومنزل ذكي فFrigate، وتسجيل كثيف وتحكم دقيق فZoneMinder، وواجهة حديثة مع اشتراك فShinobi.

وفي المقال القادم من [مرحلة الكاميرات](https://arabroot.io/start/#stage-cameras) بإذن الله نتعمق في كشف الأشخاص والسيارات في Frigate: النماذج والمناطق والأقنعة والتنبيهات الكاذبة. وأقرب المقالات إلى هذا الموضوع على الموقع:

[![](https://arabroot.io/content/images/2026/10/frigate-cover-cover.webp)دليلFrigate: تسجيل كاميرات المراقبة على سيرفرك مع كشف الأجسامكيف تثبت Frigate على سيرفرك، وتسجل به كاميرات المراقبة محلياً، ويكشف لك الأشخاص والسيارات دون أن يخرج الفيديو من بيتك.](https://arabroot.io/articles/frigate-%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/)[![](https://arabroot.io/content/images/2026/10/camera-types-cover-cover.webp)دليلأنواع كاميرات المراقبة وكيف تختار بينهاما الفرق بين أنواع كاميرات المراقبة، وما الذي تحتاجه في الكاميرا حتى تسجلها على جهازك، وكم قرصاً تحتاج للتسجيلات.](https://arabroot.io/articles/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%A8%D9%8A%D9%86%D9%87%D8%A7/)[![](https://arabroot.io/content/images/2026/10/homelab-hardware-cover-cover.webp)دليلعتاد الهوم لاب: Mini PC أم NAS أم سيرفر مستعمل؟كيف تختار جهاز الهوم لاب بأرقام الشركة المصنعة وليس بالسعر وحده، وكم يكلفك من الكهرباء في السنة بالتعرفة السعودية.](https://arabroot.io/articles/%D8%B9%D8%AA%D8%A7%D8%AF-%D8%A7%D9%84%D9%87%D9%88%D9%85-%D9%84%D8%A7%D8%A8-mini-pc-%D8%A7%D9%85-nas-%D8%A7%D9%85-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1-%D9%85%D8%B3%D8%AA%D8%B9%D9%85%D9%84/)[![](https://arabroot.io/content/images/2026/10/network-segmentation-cover-cover.webp)دليلتقسيم الشبكة Network Segmentation بال VLAN وال VPCلماذا تصل كاميرا مخترقة إلى قاعدة بياناتك، وكيف تمنع ذلك بتقسيم الشبكة إلى مناطق لا يمر بينها إلا ما تسمح به.](https://arabroot.io/articles/%D8%AA%D9%82%D8%B3%D9%8A%D9%85-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-network-segmentation-vlan-%D9%88-vpc/)[![](https://arabroot.io/content/images/2026/10/wireguard-cover-cover.webp)دليلشبكة خاصة مع WireGuard وواجهة wg-easyكيف تنشئ شبكة VPN خاصة مع WireGuard وواجهة wg-easy، فلا يصل إلى لوحات الإدارة على سيرفرك إلا أجهزة فريقك.](https://arabroot.io/articles/%D8%B4%D8%A8%D9%83%D8%A9-%D8%AE%D8%A7%D8%B5%D8%A9-%D9%85%D8%B9-wireguard-%D9%88-wg-easy/)[![](https://arabroot.io/content/images/2026/10/logging-basics-cover-cover.webp)دليلالسجلات Logging للمطورين: ماذا تسجل وماذا لا تسجلكيف تكتب سجلات Logs تساعدك على فهم ما حدث في الإنتاج، وما الذي لا يدخل السجل أبداً، وكيف تجمعها في مكان واحد.](https://arabroot.io/articles/%D8%A7%D9%84%D8%B3%D8%AC%D9%84%D8%A7%D8%AA-logging-%D9%84%D9%84%D9%85%D8%B7%D9%88%D8%B1%D9%8A%D9%86-%D9%88%D9%85%D8%AF%D9%8A%D8%B1%D9%8A-%D8%A7%D9%84%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D8%A7%D8%AA/)

## سجل التحديثات

- أكتوبر 2026: كتابة المقال، وتشغيل Frigate 0.18.2 وZoneMinder 1.38.6 مع MariaDB 11.8.9 وShinobi 2.0.0 على نفس الكاميرا الوهمية بخادم MediaMTX 1.21.1 على Docker Engine 29.8.0.