التعليم والبحث العلمي الأدلة التقنية

مستودع الجامعة Institutional Repository مع DSpace

كيف تشغل DSpace لأرشفة رسائل الطلاب وأبحاث الجامعة، من الإيداع ومراجعته حتى الحصاد عبر OAI-PMH، وما يحتاج تعريباً قبل الإطلاق.

مستودع الجامعة Institutional Repository مع DSpace

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

  • أجزاء DSpace 10 وما يحتاجه كل جزء، ومختبر كامل على Docker من الـ Docker Images الرسمية.
  • ترتيب المحتوى في مجتمعات Communities ومجموعات Collections، وإعداد مراجعة الإيداع Workflow.
  • دورة رسالة ماجستير كاملة: إيداع الطالب، ورفض المراجع بسبب مكتوب، ثم القبول والنشر.
  • العربية بصراحة: الواجهة مترجمة، ونموذج الإيداع والرخصة ليسا كذلك، والبحث العربي ما الذي يفهمه وما الذي لا يفهمه.
  • بروتوكول OAI-PMH والمهام المجدولة والرابط الدائم Handle والنسخ الاحتياطي.

أجزاء DSpace

منذ الإصدار 7 أصبح DSpace جزأين منفصلين: خادم خلفي Backend بلغة Java يملك البيانات ويقدم REST API وOAI-PMH، وواجهة Frontend مبنية على Angular تعمل على Node.js ولا تحفظ شيئاً، والصورة التالية تبين ذلك:

مخطط أجزاء DSpace: على اليمين في المتصفح الباحث والقارئ للبحث والتنزيل، وطالب الدراسات العليا لإيداع الرسالة، وموظف المستودع للمراجعة، وكلهم يصلون إلى الواجهة Frontend وهي dspace-angular على Node.js بالمنفذ 4000، والواجهة تتصل عبر REST بالخادم الخلفي Backend بلغة Java 21 وSpring Boot وفيه المساران /server/api و/server/oai، وعلى اليسار أين تحفظ البيانات: قاعدة البيانات PostgreSQL للبيانات الوصفية، ومحرك البحث Solr 9 للبحث والإحصاءات، ومجلد الملفات assetstore لملفات PDF، وملف الإعدادات local.cfg، وفي الأسفل محركات الحصاد مثل BASE وOpenAIRE تقرأ OAI-PMH من الخادم الخلفي
الواجهة لا تحفظ شيئاً، وكل قراءة وكتابة تمر عبر REST إلى الخادم الخلفي

ودليل تثبيت DSpace 10 يحدد ما يحتاجه كل جزء:

الجزءالمتطلب
الخادم الخلفيJava JDK 21 (والدليل يقول صراحة إن الإصدارات من 11 إلى 20 غير مدعومة)
قاعدة البياناتPostgreSQL من 14 إلى 17
البحثApache Solr 9، ومن 9.8 يلزم الخيار -Dsolr.config.lib.enabled=true
الواجهةNode.js بالإصدار 20.19 أو أحدث، أو 22، أو 24، ومعه مدير عمليات مثل PM2 في الإنتاج

والإصدار الحالي هو DSpace 10.1، صدر في 14 سبتمبر 2026 للخادم الخلفي وللواجهة، وفي اليوم نفسه صدر 9.4 و8.5، فإذا كان مستودعك على 8 أو 9 فما زال يأخذ إصلاحات، ولكن المستودع الجديد يبدأ من 10.

وقد يتساءل البعض: هل Docker مناسب للإنتاج؟ صفحة تجربة DSpace 10 تقسم الطرق إلى ثلاث، وتقول إن Docker هو الطريقة الأسهل للتجربة وبيئات التطوير والاختبار، وإن التثبيت الكامل للواجهة والخادم الخلفي هو المطلوب للإنتاج، وتطلب لـ Docker ذاكرة 6GB على الأقل وتنصح بـ 8GB. لذلك سوف نستخدم Docker لنفهم النظام ونجربه، وما نتعلمه من الإعدادات والأوامر هو نفسه في التثبيت الكامل.

التجربة العملية: DSpace على Docker

ينشر فريق DSpace ثلاثة Docker Images لكل إصدار: dspace/dspace للخادم الخلفي، وdspace/dspace-solr وفيه إعدادات Solr الخاصة بـ DSpace، وdspace/dspace-angular للواجهة، والوسم الذي ينتهي بـ -dist هو نسخة الإنتاج المبنية من الواجهة. وملفات Compose في مستودع الواجهة مكتوبة للتطوير، ففيها منافذ قاعدة البيانات وSolr منشورة، ووسوم تتحرك مثل dspace-10_x، لذلك كتبنا ملفاً أصغر بوسوم ثابتة:

name: edu4-dspace
services:
  db:
    image: postgres:17.11
    container_name: edu4-dspace-db
    mem_limit: 512m
    restart: unless-stopped
    environment:
      POSTGRES_DB: dspace
      POSTGRES_USER: dspace
      POSTGRES_PASSWORD: change-me-db
    volumes:
      - pgdata:/var/lib/postgresql/data

  solr:
    image: dspace/dspace-solr:dspace-10.1
    container_name: edu4-dspace-solr
    mem_limit: 1g
    restart: unless-stopped
    user: root
    working_dir: /var/solr/data
    entrypoint:
      - /bin/bash
      - -c
      - |
        init-var-solr
        for core in authority oai search statistics qaevent suggestion audit; do
          precreate-core $$core /opt/solr/server/solr/configsets/$$core
          cp -r /opt/solr/server/solr/configsets/$$core/* $$core
        done
        chown -R solr:solr /var/solr
        runuser -u solr -- solr-foreground
    volumes:
      - solr:/var/solr/data

  backend:
    image: dspace/dspace:dspace-10.1
    container_name: edu4-dspace-backend
    mem_limit: 2560m
    restart: unless-stopped
    depends_on: [db, solr]
    environment:
      dspace__P__dir: /dspace
      dspace__P__name: "المستودع العلمي"
      dspace__P__server__P__url: http://localhost:30880/server
      dspace__P__server__P__ssr__P__url: http://backend:8080/server
      dspace__P__ui__P__url: http://localhost:30400
      db__P__url: jdbc:postgresql://db:5432/dspace
      db__P__username: dspace
      db__P__password: change-me-db
      solr__P__server: http://solr:8983/solr
      proxies__P__trusted__P__ipranges: 172.16.0.0/12
      JAVA_OPTS: -Xmx1500m -Dfile.encoding=UTF-8
    entrypoint:
      - /bin/bash
      - -c
      - |
        while (!</dev/tcp/db/5432) > /dev/null 2>&1; do sleep 1; done
        /dspace/bin/dspace database migrate
        java $$JAVA_OPTS -jar /dspace/webapps/server-boot.jar
    ports:
      - "127.0.0.1:30880:8080"
    volumes:
      - assetstore:/dspace/assetstore

  frontend:
    image: dspace/dspace-angular:dspace-10.1-dist
    container_name: edu4-dspace-frontend
    mem_limit: 1g
    restart: unless-stopped
    depends_on: [backend]
    environment:
      DSPACE_UI_SSL: "false"
      DSPACE_UI_HOST: 0.0.0.0
      DSPACE_UI_PORT: "4000"
      DSPACE_UI_NAMESPACE: /
      DSPACE_UI_BASEURL: http://localhost:30400
      DSPACE_REST_SSL: "false"
      DSPACE_REST_HOST: localhost
      DSPACE_REST_PORT: "30880"
      DSPACE_REST_NAMESPACE: /server
      DSPACE_REST_SSRBASEURL: http://backend:8080/server
    ports:
      - "127.0.0.1:30400:4000"

volumes:
  pgdata:
    name: edu4-dspace-pgdata
  solr:
    name: edu4-dspace-solr
  assetstore:
    name: edu4-dspace-assetstore

في الإعداد أعلاه لاحظ التالي:

  • أسماء الإعدادات: كل إعداد في dspace.cfg يكتب متغير بيئة، فالنقطة تصبح __P__ والشرطة __D__، فالمتغير dspace__P__server__P__url هو dspace.server.url.
  • رابطان للخادم الخلفي: dspace.server.url هو الرابط الذي يصل إليه المتصفح، لأن الواجهة تعمل في متصفح الزائر وتطلب REST منه مباشرة، وssr.url هو الرابط الداخلي الذي تستخدمه الواجهة على السيرفر عند تجهيز الصفحة Server-Side Rendering. لذلك يجب أن يكون REST منشوراً للزوار، وليس الواجهة وحدها.
  • ترحيل قاعدة البيانات: الأمر dspace database migrate يعمل قبل كل تشغيل، فينشئ الجداول في أول مرة ويرقيها عند تغيير الإصدار.
  • Solr: سبع أنوية Cores، أهمها search للبحث، وoai لبروتوكول OAI-PMH، وstatistics لإحصاءات الزيارات والتنزيل.
  • المنافذ: قاعدة البيانات وSolr ليس لهما منافذ منشورة، والسبب أن Solr دون مصادقة، ومن يصل إليه يقرأ ويحذف الفهرس كله.
docker compose up -d
curl -s http://localhost:30880/server/api
{
  "dspaceUI" : "http://localhost:30400",
  "dspaceName" : "المستودع العلمي",
  "dspaceServer" : "http://localhost:30880/server",
  "dspaceVersion" : "DSpace 10.1",
  "type" : "root",
  ...

على جهاز المختبر، وهو مشترك مع أعمال أخرى، احتاج الخادم الخلفي نحو سبع دقائق ونصف من تشغيل الـ Container حتى استجاب، وفي سجله «Started ServerBootApplication in 215.528 seconds» بعد ترحيل قاعدة البيانات. وبعد الدورة كاملة كانت الذاكرة كما يلي: الخادم الخلفي 1.15GB، وSolr نحو 773MB، والواجهة 655MB، وPostgreSQL نحو 95MB، أي قرابة 2.7GB لمستودع فيه رسالة واحدة، وهذا يفسر طلب الدليل 6GB على الأقل.

ماذا يحدث إذا فتحت الواجهة بعنوان آخر؟

أول طلب أرسلناه للواجهة كان إلى http://127.0.0.1:30400 وليس localhost، فعادت الصفحة، ولكن في سجل الواجهة هذه الأسطر:

{"message":"Error in server-side rendering (SSR)", ...}
{"message":"Error details :  Error: URL with hostname \"127.0.0.1\" is not allowed. ...}
{"message":"Falling back to serving direct client-side rendering (CSR).", ...}

والسبب أن الواجهة لا تجهز الصفحة على السيرفر إلا لاسم المضيف الذي في إعدادها، وهو localhost هنا، فإذا جاء الطلب باسم آخر تركت التجهيز للمتصفح. والصفحة تعمل في الحالتين للزائر، ولكن الفرق مهم لمحركات البحث، فالصفحة المجهزة على السيرفر هي التي فيها البيانات الوصفية التي يقرؤها Google Scholar، كما سوف نرى. والقاعدة: اجعل DSPACE_UI_BASEURL هو النطاق الحقيقي الذي يكتبه الناس، ولا تفتح المستودع بعنوان IP.

ترتيب المحتوى: المجتمعات والمجموعات

المحتوى في DSpace شجرة من أربعة مستويات: المجتمع Community مثل كلية الحاسب، وفيه مجتمعات فرعية ومجموعات Collections مثل «رسائل الماجستير»، وفي المجموعة المواد Items، ولكل مادة ملفاتها Bitstreams. والمهم أن سير العمل والصلاحيات يضبطان على مستوى المجموعة، فمجموعة رسائل الماجستير لها مراجعون غير مراجعي أبحاث أعضاء هيئة التدريس، والصورة التالية تبين الترتيب وسير العمل معاً:

مخطط من جزأين: على اليمين الترتيب، المجتمع Community مثل كلية الحاسب وفيه مجتمعات فرعية، ثم المجموعة Collection مثل رسائل الماجستير ولها سير عمل خاص، ثم المادة Item رسالة واحدة وبياناتها الوصفية، ثم الملف Bitstream ملف PDF داخل الحزمة ORIGINAL، وعلى اليسار سير العمل في المجموعة: 1 الطالب يودع، 2 خطوة المراجعة reviewstep قبول أو رفض، 3 خطوة التحرير editstep تعديل وقبول أو رفض، 4 التحرير النهائي finaleditstep تعديل فقط، والرفض يعيد الرسالة للطالب مع سبب مكتوب، ثم 5 بعد آخر خطوة تصبح المادة مؤرشفة برابط دائم Handle وفهرسة في Solr وظهور في OAI-PMH
الخطوة التي ليس لها مجموعة مستخدمين في المجموعة يتخطاها DSpace

سير العمل الافتراضي ثلاث خطوات كما في ملف workflow.xml للإصدار 10.1: خطوة المراجعة reviewstep وفيها القبول أو الرفض، وخطوة التحرير editstep وفيها تعديل البيانات مع القبول أو الرفض، وخطوة التحرير النهائي finaleditstep وفيها التعديل دون رفض. وتوثيق سير العمل يبين أن كل خطوة ترتبط بمجموعة مستخدمين في المجموعة، وأن الخطوة التي ليس لها مجموعة لا تعمل. والطريقة البسيطة أن تفعل الخطوات الثلاث لكل مجموعة، فتمر كل رسالة على ثلاثة أشخاص، وهذا مناسب لجامعة كبيرة، ولكنه في كلية صغيرة يجعل الرسائل تنتظر أسابيع، لذلك بدأنا بخطوة واحدة.

أنشأنا المدير من سطر الأوامر، ثم مستخدمين للطالب والمراجع:

docker exec edu4-dspace-backend /dspace/bin/dspace create-administrator -e [email protected] -f مدير -l المستودع -p 'Lab-Admin-2026!' -c ar
docker exec edu4-dspace-backend /dspace/bin/dspace user --add -m [email protected] -g Lab -s User -p 'Lab-User-2026!'
docker exec edu4-dspace-backend /dspace/bin/dspace user --add -m [email protected] -g Lab -s User -p 'Lab-User-2026!'
Administrator account created
Created EPerson 235366fc-a9c3-45f2-aea4-06d110136552
Created EPerson adf70944-20ea-4895-8dae-247d8d9201fb

ثم أنشأنا عبر REST API مجتمع «كلية الحاسب»، وفيه مجموعة «رسائل الماجستير»، وأنشأنا للمجموعة مجموعتي مستخدمين: المودعين Submitters وفيها الطالب، ومراجعي الخطوة الأولى reviewer وفيها المراجع، وهي الخطوات نفسها التي في صفحة تحرير المجموعة في الواجهة، في تبويبي الأدوار Roles. وأعاد الخادم الرابط الدائم لكل منهما:

community 201 c94dea2b-df99-4a34-a94a-3c9ed8bfc003 123456789/1
collection 201 d10757f6-d788-4b0b-866a-195cc7f60ec0 123456789/2
reviewer group 201 14ead3fa-46ca-4a7d-b137-79b45b89877f
submitters group 201 96468605-e454-4eb0-a84d-573d136aede2

لاحظ البادئة 123456789 في الروابط، وهي القيمة الافتراضية في handle.prefix، وسوف نعود إليها في قسم الرابط الدائم.

إيداع رسالة ماجستير

دخل الطالب، فطلب منه DSpace قبل أي شيء الموافقة على اتفاقية المستخدم النهائي End User Agreement، ونصها الافتراضي إنجليزي، وفيه عبارة «مستودع دي سبيس» مكان اسم الجامعة، فهو نص نموذجي يجب أن تستبدله إدارة المستودع بنص قانوني معتمد. ثم بدأ الإيداع في مجموعة «رسائل الماجستير»، والصورة التالية لنموذج الإيداع:

نموذج الإيداع في DSpace والواجهة بالعربية: مسار التنقل الرئيسية ثم كلية الحاسب ثم رسائل الماجستير ثم تحرير التقديم، ومنطقة سحب الملفات، والحاوية رسائل الماجستير، وقسم وصف، ولكن أسماء الحقول بالإنجليزية: Author وفيه الطالب، خالد، وTitle وفيه تحسين أداء الاستعلامات في قواعد البيانات العلائقية، وOther Titles، وDate of Issue بالسنة 2026، وPublisher، وتحت كل حقل شرح بالإنجليزية، وفي الأسفل رسالة The submission is invalid, check missing fields وأزرار حفظ وحفظ لوقت لاحق وإيداع وتجاهل
الواجهة بالعربية، ولكن أسماء حقول النموذج وشرحها بالإنجليزية

عبأنا المؤلف «الطالب، خالد» بصيغة العائلة ثم الاسم كما يطلب شرح الحقل، والعنوان، وسنة 2026، والنوع Thesis، واللغة ar، وكلمتين مفتاحيتين وملخصاً، ثم رفعنا الملف thesis.pdf، فحسب DSpace بصمته فوراً:

upload 201 [["thesis.pdf",30507,"8eec1ea12d3fd2fbfbdf63d70ea90542","Adobe PDF"]]

والبصمة MD5 هي التي يستخدمها DSpace لاحقاً في فحص سلامة الملفات، فإذا تغير ملف على القرص لأي سبب عرفه الفحص. وبقي شرط أخير هو رخصة الإيداع:

قسم رخصة الإيداع في نموذج DSpace: النص يبدأ بعبارة NOTE: PLACE YOUR OWN LICENSE HERE وThis sample license is provided for informational purposes only، ثم NON-EXCLUSIVE DISTRIBUTION LICENSE ونص الرخصة الذي يمنح DSpace University (DSU) حق النسخ والتوزيع، وفي الأسفل مربع أؤكد الترخيص أعلاه
الرخصة الافتراضية نموذج يمنح الحقوق لجامعة اسمها «DSpace University»

هذه الرخصة أهم ما يجب تغييره قبل أول إيداع حقيقي، فالنص الافتراضي يبدأ بعبارة «NOTE: PLACE YOUR OWN LICENSE HERE»، ويمنح حق التوزيع لجامعة وهمية اسمها DSpace University، والطالب الذي يوافق عليه يوافق على نص لا يخص جامعته. والرخصة الموافق عليها تحفظ ملفاً license.txt داخل المادة نفسها، فإذا نشرت رسائل بالنص النموذجي بقي معها إلى الأبد. اكتب رخصة بالعربية تعتمدها الشؤون القانونية في الجامعة، وفيها حق الطالب في تأجيل النشر Embargo، وضعها في الملف config/default.license أو رخصة خاصة لكل مجموعة.

بعد الموافقة أرسل الطالب الرسالة، فانتقلت إلى سير العمل، وظهرت للمراجع في صفحة «ماي دي سبيس» MyDSpace ضمن «مهام سير العمل»:

صفحة ماي دي سبيس عند المراجع في DSpace بالعربية، العرض مهام سير العمل، وفيها مادة واحدة بشارتي في انتظار المتحكم والمادة، والعنوان تحسين أداء الاستعلامات في قواعد البيانات العلائقية، والطالب، خالد (2026)، والملخص، والمقدم غير قابل للتطبيق، والحاوية رسائل الماجستير، وزرا مطالبة وعرض، وعلى الجانب المنقحات الحالة والنوع والتاريخ والمقدم
مهمة المراجعة في «ماي دي سبيس»: زر «مطالبة» Claim يحجز المهمة لهذا المراجع

المهمة في البداية في «مجمع المهام» Pool، يراها كل أعضاء مجموعة المراجعين، ومن يضغط «مطالبة» يحجزها لنفسه حتى لا يراجع شخصان الرسالة نفسها. ولاحظ الترجمة «في انتظار المتحكم» للحالة Waiting for Controller، وهي من الأمثلة التي في قسم العربية.

الرفض بسبب مكتوب

حجز المراجع المهمة ورفضها، وكتب السبب «الملخص قصير جداً، أضف المنهجية والنتائج الرئيسية في فقرة الملخص»، فعادت الرسالة إلى مساحة عمل الطالب Workspace، وسجل DSpace ما حدث في حقل التاريخ dc.description.provenance داخل المادة:

Submitted by Lab User ([email protected]) on 2026-10-22T01:36:14Z workflow start=Step: reviewstep - action:claimaction
No. of bitstreams: 1
thesis.pdf: 30507 bytes, checksum: 8eec1ea12d3fd2fbfbdf63d70ea90542 (MD5)
Step: reviewstep - action:reviewaction Rejected by Lab User ([email protected]), reason: الملخص قصير جداً، أضف المنهجية والنتائج الرئيسية في فقرة الملخص. on 2026-10-22T01:38:46Z (GMT)

وهذا السجل يبقى مع المادة بعد نشرها، ولا يظهر للزوار في الصفحة المختصرة، وهو الذي يجيب عن سؤال «من راجع هذه الرسالة ومتى؟» بعد سنوات. ثم عدل الطالب الملخص وأعاد الإيداع، فقبلها المراجع، ولأن الخطوتين الثانية والثالثة ليس لهما مجموعة فقد تخطاهما DSpace، وأصبحت المادة مؤرشفة برابط 123456789/3:

صفحة المادة المنشورة في DSpace بالعربية كما يراها الزائر: العنوان تحسين أداء الاستعلامات في قواعد البيانات العلائقية، والخلاصة، والكلمات الرئيسية قواعد البيانات وتحسين الاستعلامات، والرابط http://localhost:30400/handle/123456789/3، والحاوية رسائل الماجستير، وعلى الجانب لا تتوفر صورة مصغرة، والملفات thesis.pdf بحجم 29.79 KB، والتاريخ 2026، والمؤلف الطالب، خالد، وزر صفحة المادة الكاملة
الرسالة المنشورة، ولاحظ «لا تتوفر صورة مصغرة»، وهو موضوع قسم المهام المجدولة

العربية في DSpace بصراحة

ملف الترجمة العربية للواجهة فيه 3943 مفتاحاً مثل الإنجليزي، ووجدنا أن 3600 منها مختلفة عن النص الإنجليزي، أي أن نحو 91% من نصوص الواجهة مترجمة، والعربية مفعلة في قائمة اللغات افتراضياً، والاتجاه من اليمين إلى اليسار سليم. ولكن أثناء التجربة وجدنا ما يلي:

  • نموذج الإيداع بالإنجليزية: أسماء الحقول وشرحها تأتي من ملف submission-forms.xml في الخادم الخلفي، وليس من ملف ترجمة الواجهة، وتوثيق دعم اللغات يشرح أن تعريبه يكون بنسخة من الملف باسم مثل submission-forms_ar.xml، وينبه إلى خطأ معروف: النسخة المترجمة يجب أن تحتوي كل تعريفات النماذج، وإلا عاد DSpace إلى النموذج الافتراضي.
  • الرخصة واتفاقية المستخدم: نصان نموذجيان بالإنجليزية كما رأينا.
  • شريط الموافقة على ملفات تعريف الارتباط: ظهر فيه الوسم <br/> حرفياً، وجملة «لمعرفة المزيد، يرجى قراءة .» دون اسم الصفحة.
  • ترجمات حرفية: «في انتظار المتحكم» لحالة المهمة، و«كل الدي سبيس» في القائمة، و«المقدم: غير قابل للتطبيق».

البحث العربي

جربنا البحث عبر REST API بكلمات من العنوان ومن نص الملف، والنتائج كما يلي:

كلمة البحثفي المادةالنتيجة
أداءأداءوجدها
اداء (دون همزة)أداءوجدها
العلائقيه (بالهاء)العلائقيةوجدها
الاستعلاماتالاستعلاماتوجدها
استعلامات (دون ال)الاستعلاماتلم يجدها
لاستكمال (من نص الملف)لاستكمالوجدها
استكماللاستكماللم يجدها

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

بروتوكول OAI-PMH

بروتوكول OAI-PMH هو الطريقة التي تقرأ بها المجمعات مثل BASE وOpenAIRE والفهارس الوطنية بيانات المستودع، وفي DSpace يعمل على /server/oai/request. وبعد نشر الرسالة طلبنا قائمة السجلات فكانت النتيجة:

curl -s "http://localhost:30880/server/oai/request?verb=ListRecords&metadataPrefix=oai_dc"
<error code="noRecordsMatch">No matches for the query</error>

والسبب أن OAI في DSpace لا يقرأ قاعدة البيانات مباشرة، وإنما يقرأ نواة oai في Solr، وهذه النواة تملؤها مهمة مستقلة، وتوثيق OAI يطلب تشغيلها بشكل دوري:

docker exec edu4-dspace-backend /dspace/bin/dspace oai import
There are no indexed documents, using full import.
Full import
Total: 1 items
Total: 0 items
Purging cached OAI responses.
OAI 2.0 manager action ended. It took 44 seconds.

ثم ظهرت الرسالة:

<identifier>oai:localhost:123456789/3</identifier>
<setSpec>com_123456789_1</setSpec>
<setSpec>col_123456789_2</setSpec>
...
<dc:title>تحسين أداء الاستعلامات في قواعد البيانات العلائقية</dc:title>
<dc:creator>الطالب، خالد</dc:creator>
<dc:subject>قواعد البيانات</dc:subject>
<dc:type>Thesis</dc:type>
<dc:identifier>http://localhost:30400/handle/123456789/3</dc:identifier>
<dc:language>ar</dc:language>
<dc:format>application/pdf</dc:format>

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

  • كل مجتمع وكل مجموعة مجموعة OAI Set، مثل col_123456789_2، فالمجمع الذي يريد رسائل الماجستير فقط يحصد هذه المجموعة.
  • المعرف oai:localhost:... مبني على اسم السيرفر، ورد Identify أعاد adminEmail بالقيمة الافتراضية [email protected]، وهي من mail.admin، فاضبط الاثنين قبل أن تسجل المستودع لدى أي مجمع.
  • الرابط في dc:identifier هو الرابط الدائم، فإذا بقي على localhost أو على البادئة التجريبية حصدته المجمعات كما هو.

وأما Google Scholar فيقرأ وسوماً في رأس صفحة المادة، ووجدناها في الصفحة المجهزة على السيرفر:

<meta name="citation_title" content="تحسين أداء الاستعلامات في قواعد البيانات العلائقية">
<meta name="citation_author" content="الطالب، خالد">
<meta name="citation_publication_date" content="2026">
<meta name="citation_language" content="ar">
<meta name="citation_dissertation_name" content="تحسين أداء الاستعلامات في قواعد البيانات العلائقية">
<meta name="citation_pdf_url" content="http://localhost:30400/bitstreams/dd81468b-b246-48d8-8b0b-441f761e8adb/download">

ولاحظ citation_dissertation_name، فقد عرف DSpace أن المادة رسالة من النوع Thesis. والمجلات العلمية تستخدم البروتوكول نفسه، وقد شرحناه في دليل المجلة المحكمة مع OJS.

المهام المجدولة: لماذا لا توجد صورة مصغرة؟

في صفحة الرسالة ظهرت عبارة «لا تتوفر صورة مصغرة»، والبحث عن كلمة من داخل ملف PDF لم يجد شيئاً، والسبب واحد: استخراج النص من الملفات وإنشاء الصور المصغرة مهمة اسمها filter-media لا تعمل وحدها:

docker exec edu4-dspace-backend /dspace/bin/dspace filter-media -v
FILTERED: bitstream dd81468b-b246-48d8-8b0b-441f761e8adb (item: 123456789/3) and created 'thesis.pdf.txt'
PROCESSING: bitstream dd81468b-b246-48d8-8b0b-441f761e8adb (item: 123456789/3)
File: thesis.pdf.jpg
original size: 612,792
size after fitting to maximum height: 135, 175
FILTERED: bitstream dd81468b-b246-48d8-8b0b-441f761e8adb (item: 123456789/3) and created 'thesis.pdf.jpg'
The script has completed

فأنشأ ملفين داخل المادة: النص المستخرج thesis.pdf.txt في الحزمة TEXT، والصورة المصغرة في الحزمة THUMBNAIL، وبعد dspace index-discovery أصبح البحث يجد كلمات من داخل الملف مثل «متطلبات». وصفحة المهام المجدولة فيها Crontab نموذجي للإنتاج، وأهم ما فيه:

المهمةالأمرالموعد في المثال الرسمي
تحديث OAI-PMHdspace oai importيومياً 00:15
تنظيف فهرس البحث وتحديثهdspace index-discoveryيومياً 00:15
رسائل الاشتراكات اليوميةdspace subscription-send -f Dيومياً 02:00، قبل filter-media
النص الكامل والصور المصغرةdspace filter-mediaيومياً 03:00
فحص بصمات الملفاتdspace checker -l -pأسبوعياً، اختياري

وفي Docker لا يوجد Cron داخل الـ Container، فشغل هذه الأوامر من Cron على السيرفر عبر docker exec، أو من Container مستقل من dspace/dspace-cli متصل بالشبكة نفسها والـ Volume نفسه.

الرابط الدائم Handle

كل مادة في DSpace تأخذ رابطاً دائماً من نظام Handle، مثل 123456789/3، والجزء الأول هو البادئة Prefix. والقيمة 123456789 افتراضية للتجربة فقط، فلا تقم بنشر أي رسالة حقيقية قبل تغييرها، والسبب أن الروابط تحفظ في المادة وتحصدها المجمعات وتنتشر في الاستشهادات، وتغييرها بعد ذلك يعني روابط لا تعمل في كل مكان. والبادئة الحقيقية تطلبها من سجل Handle.Net، ورسومها كما في صفحته في 21 أكتوبر 2026: 50 دولاراً لمرة واحدة عند التسجيل، و50 دولاراً سنوياً لكل بادئة، ثم تضبط خادم Handle كما في توثيق Handle في DSpace. ولم نجرب تسجيل بادئة حقيقية في المختبر.

النطاق والشهادة

في الإنتاج يحتاج المستودع نطاقاً واحداً مثل repository.example.com خلف Reverse Proxy بشهادة HTTPS كما في تثبيت Caddy، يوجه /server إلى الخادم الخلفي وكل ما عداه إلى الواجهة، ثم تجعل dspace.server.url وdspace.ui.url وDSPACE_UI_BASEURL وDSPACE_REST_HOST هذا النطاق، مع DSPACE_REST_SSL وDSPACE_UI_SSL بالقيمة true حسب مكان إنهاء الشهادة. وهذا القسم لم نختبره في المختبر المحلي، لأنه يحتاج نطاقاً وشهادة حقيقية.

التحقق من النجاح

  • /server/api يعيد dspaceVersion واسم المستودع والنطاق الحقيقي.
  • سجل الواجهة لا يحتوي «is not allowed» عند فتح المستودع بنطاقه.
  • رسالة تجريبية تمر بسير العمل، ورفضها يعيدها للطالب مع السبب، وقبولها ينشرها.
  • بعد filter-media تظهر الصورة المصغرة، والبحث يجد كلمة من داخل الملف.
  • بعد oai import يعيد ListRecords المادة، وIdentify يعيد بريد المستودع الحقيقي.

النسخ الاحتياطي والاستعادة

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

docker exec edu4-dspace-db sh -c 'pg_dump -U dspace -Fc dspace > /tmp/dspace.dump && ls -la /tmp/dspace.dump'
docker exec edu4-dspace-backend du -sh /dspace/assetstore
-rw-r--r-- 1 root root 363274 Oct 22 01:43 /tmp/dspace.dump
64K	/dspace/assetstore

وأما Solr فأغلبه يعاد بناؤه من قاعدة البيانات بالأمر dspace index-discovery -b للبحث وdspace oai import لـ OAI، ما عدا نواة statistics، ففيها إحصاءات الزيارات والتنزيل، وهي لا توجد في قاعدة البيانات، فإذا كانت الجامعة تهتم بعدد تنزيلات الرسائل فخذ نسخة منها أيضاً. ولـ DSpace طريقة أخرى هي حزم AIP، وفيها كل مادة بملفاتها وبياناتها في ملف مستقل، وهي مفيدة للنقل بين مستودعين، كما في توثيق AIP. ثم انقل النسخ خارج السيرفر واختبر استعادتها كما في النسخ الاحتياطي بقاعدة 3-2-1 واختبار الاستعادة.

التحديث إلى إصدار أحدث

  1. خذ نسخة كاملة، وجرب التحديث على نسخة من المستودع أولاً.
  2. غير وسوم الـ Images الثلاثة إلى الإصدار الجديد معاً، فالواجهة والخادم الخلفي يجب أن يكونا من الإصدار نفسه.
  3. عند التشغيل يرحل dspace database migrate قاعدة البيانات، ثم أعد بناء فهرس البحث بالأمر dspace index-discovery -b إذا طلبت ملاحظات الإصدار ذلك.
  4. راجع دليل الترقية عند الانتقال بين إصدارات رئيسية مثل 8 إلى 10، لأن إعدادات Solr والإعدادات العامة قد تتغير بينها.

مشكلات شائعة وحلولها

العرضالسببالحل
«URL with hostname ... is not allowed» في سجل الواجهةالمستودع فتح باسم مضيف غير الذي في الإعدادافتحه بالنطاق نفسه الذي في DSPACE_UI_BASEURL
OAI-PMH يعيد noRecordsMatchoai import لم يعمل بعد النشرشغله، ثم ضعه في Cron يومياً
لا توجد صور مصغرة ولا بحث في النصfilter-media لم يعملشغله ثم index-discovery، وضعهما في Cron
الرسالة لا تصل إلى أي مراجعلا توجد مجموعة مستخدمين لخطوات سير العمل، فتنشر مباشرةأنشئ مجموعة المراجعين في أدوار المجموعة قبل أول إيداع
البحث عن الكلمة دون «ال» لا يجدهاSolr دون محلل عربيابحث بالكلمة كما هي، أو أضف محللاً عربياً وأعد الفهرسة

تنظيف المختبر

docker compose down -v

ثم احذف الـ Images إذا لم تعد تحتاجها، وأحجامها في مختبرنا: الخادم الخلفي 1.7GB، وSolr نحو 1.2GB، والواجهة نحو 435MB.

تدريب عملي

  • فعل خطوة التحرير editstep بإنشاء مجموعة لها في المجموعة، ثم أودع رسالة جديدة وتابع كيف تمر على شخصين.
  • أضف فترة حجب Embargo لملف في رسالة، وتأكد أن الزائر يرى البيانات الوصفية ولا يستطيع تنزيل الملف قبل التاريخ.

الخلاصة

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

  • DSpace 10.1 جزءان: خادم خلفي بـ Java 21 مع PostgreSQL وSolr 9، وواجهة Angular على Node.js، واستخدم المختبر قرابة 2.7GB من الذاكرة لمستودع فيه رسالة واحدة.
  • سير العمل يضبط لكل مجموعة، والخطوة التي ليس لها مجموعة مستخدمين يتخطاها النظام، والرفض يبقى مع سببه في تاريخ المادة.
  • الواجهة مترجمة بنحو 91%، ولكن نموذج الإيداع والرخصة واتفاقية المستخدم بالإنجليزية ونصوص نموذجية، وتغييرها عمل لا بد منه قبل الإطلاق.
  • البحث العربي يوحد الهمزة والتاء المربوطة، ولا يحذف «ال».
  • OAI-PMH والنص الكامل والصور المصغرة مهام مجدولة، ودونها يبدو المستودع ناقصاً.
  • غير البادئة 123456789 وبريد المستودع قبل أول رسالة حقيقية.

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

  • أكتوبر 2026: كتابة الدليل وتجربته على DSpace 10.1 (الخادم الخلفي والواجهة وSolr) مع PostgreSQL 17.11.
نشرة عرب رووت | ArabRoot

معرفة تستحق مكاناً في بريدك.

مقالات مختارة وأدوات مفيدة وأفكار لمشروعك القادم، في رسالة واحدة كل أسبوع.

يمكنك إلغاء الاشتراك متى شئت. الخصوصية

تم استلام طلبك. افتح بريدك واضغط رابط التأكيد لإتمام الاشتراك.