> ## 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.

# مستودع الجامعة Institutional Repository مع DSpace
- URL: https://arabroot.io/articles/تثبيت-المستودع-العلمي-للجامعة-مع-dspace/
- Published: 2026-10-14T10:30:00.000Z
- Updated: 2026-10-25T08:50:16.000Z
- Description: كيف تشغل DSpace لأرشفة رسائل الطلاب وأبحاث الجامعة، من الإيداع ومراجعته حتى الحصاد عبر OAI-PMH، وما يحتاج تعريباً قبل الإطلاق.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, التعليم والبحث العلمي, تطبيقات لفريقك, الاستضافة الذاتية, DSpace

كل سنة يناقش طلاب الدراسات العليا في الجامعة عشرات الرسائل، ثم تذهب النسخة الورقية إلى رف في المكتبة، والنسخة الرقمية إلى قرص في مكتب الدراسات العليا، وبعد خمس سنوات يطلب باحث رسالة بعينها فلا يجدها أحد، ولا يعرف أحد هل يسمح صاحبها بنشرها. والمستودع المؤسسي Institutional Repository هو النظام الذي يحل هذا: مكان واحد تودع فيه الرسائل والأبحاث، ويراجعها موظف قبل نشرها، ويبقى لكل منها رابط دائم، وتقرؤه محركات الحصاد الدولية. وفي مقال [الأنظمة التي تحتاجها الجامعة](https://arabroot.io/articles/%D8%A7%D9%84%D8%A7%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D8%AD%D8%AA%D8%A7%D8%AC%D9%87%D8%A7-%D8%A7%D9%84%D8%AC%D8%A7%D9%85%D8%B9%D8%A9-%D9%85%D9%86-%D8%A7%D9%84%D9%82%D8%A8%D9%88%D9%84-%D8%A7%D9%84%D9%89-%D8%A7%D9%84%D8%AA%D8%AE%D8%B1%D8%AC/) ذكرنا أن المستودع جزء من مرحلة التعلم والبحث، وفي هذا المقال سوف نشغل [DSpace](https://dspace.lyrasis.org/?ref=arabroot.io)، وهو أشهر المستودعات المفتوحة المصدر، وسوف نتناول:

- أجزاء 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 من الخادم الخلفي](https://arabroot.io/content/images/2026/10/dspace-01-architecture.webp)

الواجهة لا تحفظ شيئاً، وكل قراءة وكتابة تمر عبر REST إلى الخادم الخلفي

و[دليل تثبيت DSpace 10](https://wiki.lyrasis.org/display/DSDOC10x/Installing+DSpace?ref=arabroot.io) يحدد ما يحتاجه كل جزء:

| الجزء          | المتطلب                                                                           |
| -------------- | --------------------------------------------------------------------------------- |
| الخادم الخلفي  | 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](https://github.com/DSpace/DSpace/releases/tag/dspace-10.1?ref=arabroot.io)، صدر في 14 سبتمبر 2026 للخادم الخلفي [وللواجهة](https://github.com/DSpace/dspace-angular/releases/tag/dspace-10.1?ref=arabroot.io)، وفي اليوم نفسه صدر 9.4 و8.5، فإذا كان مستودعك على 8 أو 9 فما زال يأخذ إصلاحات، ولكن المستودع الجديد يبدأ من 10.

وقد يتساءل البعض: هل Docker مناسب للإنتاج؟ صفحة [تجربة DSpace 10](https://wiki.lyrasis.org/display/DSPACE/Try+out+DSpace+10?ref=arabroot.io) تقسم الطرق إلى ثلاث، وتقول إن 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`، لذلك كتبنا ملفاً أصغر بوسوم ثابتة:

```yaml
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 دون مصادقة، ومن يصل إليه يقرأ ويحذف الفهرس كله.

```bash
docker compose up -d
curl -s http://localhost:30880/server/api
```

```text
{
  "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`، فعادت الصفحة، ولكن في سجل الواجهة هذه الأسطر:

```text
{"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](https://arabroot.io/content/images/2026/10/dspace-02-hierarchy-workflow.webp)

الخطوة التي ليس لها مجموعة مستخدمين في المجموعة يتخطاها DSpace

سير العمل الافتراضي ثلاث خطوات كما في ملف `workflow.xml` للإصدار 10.1: خطوة المراجعة `reviewstep` وفيها القبول أو الرفض، وخطوة التحرير `editstep` وفيها تعديل البيانات مع القبول أو الرفض، وخطوة التحرير النهائي `finaleditstep` وفيها التعديل دون رفض. و[توثيق سير العمل](https://wiki.lyrasis.org/display/DSDOC10x/Configurable+Workflow?ref=arabroot.io) يبين أن كل خطوة ترتبط بمجموعة مستخدمين في المجموعة، وأن الخطوة التي ليس لها مجموعة لا تعمل. والطريقة البسيطة أن تفعل الخطوات الثلاث لكل مجموعة، فتمر كل رسالة على ثلاثة أشخاص، وهذا مناسب لجامعة كبيرة، ولكنه في كلية صغيرة يجعل الرسائل تنتظر أسابيع، لذلك بدأنا بخطوة واحدة.

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

```bash
docker exec edu4-dspace-backend /dspace/bin/dspace create-administrator -e admin@example.com -f مدير -l المستودع -p 'Lab-Admin-2026!' -c ar
docker exec edu4-dspace-backend /dspace/bin/dspace user --add -m student@example.com -g Lab -s User -p 'Lab-User-2026!'
docker exec edu4-dspace-backend /dspace/bin/dspace user --add -m reviewer@example.com -g Lab -s User -p 'Lab-User-2026!'
```

```text
Administrator account created
Created EPerson 235366fc-a9c3-45f2-aea4-06d110136552
Created EPerson adf70944-20ea-4895-8dae-247d8d9201fb
```

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

```text
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`، وسوف نعود إليها في قسم [الرابط الدائم](#handle).

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

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

![نموذج الإيداع في DSpace والواجهة بالعربية: مسار التنقل الرئيسية ثم كلية الحاسب ثم رسائل الماجستير ثم تحرير التقديم، ومنطقة سحب الملفات، والحاوية رسائل الماجستير، وقسم وصف، ولكن أسماء الحقول بالإنجليزية: Author وفيه الطالب، خالد، وTitle وفيه تحسين أداء الاستعلامات في قواعد البيانات العلائقية، وOther Titles، وDate of Issue بالسنة 2026، وPublisher، وتحت كل حقل شرح بالإنجليزية، وفي الأسفل رسالة The submission is invalid, check missing fields وأزرار حفظ وحفظ لوقت لاحق وإيداع وتجاهل](https://arabroot.io/content/images/2026/10/dspace-03-submission-form.webp)

الواجهة بالعربية، ولكن أسماء حقول النموذج وشرحها بالإنجليزية

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

```text
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) حق النسخ والتوزيع، وفي الأسفل مربع أؤكد الترخيص أعلاه](https://arabroot.io/content/images/2026/10/dspace-04-sample-license.webp)

الرخصة الافتراضية نموذج يمنح الحقوق لجامعة اسمها «DSpace University»

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

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

![صفحة ماي دي سبيس عند المراجع في DSpace بالعربية، العرض مهام سير العمل، وفيها مادة واحدة بشارتي في انتظار المتحكم والمادة، والعنوان تحسين أداء الاستعلامات في قواعد البيانات العلائقية، والطالب، خالد (2026)، والملخص، والمقدم غير قابل للتطبيق، والحاوية رسائل الماجستير، وزرا مطالبة وعرض، وعلى الجانب المنقحات الحالة والنوع والتاريخ والمقدم](https://arabroot.io/content/images/2026/10/dspace-05-workflow-tasks.webp)

مهمة المراجعة في «ماي دي سبيس»: زر «مطالبة» Claim يحجز المهمة لهذا المراجع

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

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

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

```text
Submitted by Lab User (student@example.com) 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 (reviewer@example.com), reason: الملخص قصير جداً، أضف المنهجية والنتائج الرئيسية في فقرة الملخص. on 2026-10-22T01:38:46Z (GMT)
```

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

![صفحة المادة المنشورة في DSpace بالعربية كما يراها الزائر: العنوان تحسين أداء الاستعلامات في قواعد البيانات العلائقية، والخلاصة، والكلمات الرئيسية قواعد البيانات وتحسين الاستعلامات، والرابط http://localhost:30400/handle/123456789/3، والحاوية رسائل الماجستير، وعلى الجانب لا تتوفر صورة مصغرة، والملفات thesis.pdf بحجم 29.79 KB، والتاريخ 2026، والمؤلف الطالب، خالد، وزر صفحة المادة الكاملة](https://arabroot.io/content/images/2026/10/dspace-06-item-page.webp)

الرسالة المنشورة، ولاحظ «لا تتوفر صورة مصغرة»، وهو موضوع قسم المهام المجدولة

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

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

- **نموذج الإيداع بالإنجليزية:** أسماء الحقول وشرحها تأتي من ملف `submission-forms.xml` في الخادم الخلفي، وليس من ملف ترجمة الواجهة، و[توثيق دعم اللغات](https://wiki.lyrasis.org/display/DSDOC10x/Multilingual+Support?ref=arabroot.io) يشرح أن تعريبه يكون بنسخة من الملف باسم مثل `submission-forms_ar.xml`، وينبه إلى خطأ معروف: النسخة المترجمة يجب أن تحتوي كل تعريفات النماذج، وإلا عاد DSpace إلى النموذج الافتراضي.
- **الرخصة واتفاقية المستخدم:** نصان نموذجيان بالإنجليزية كما رأينا.
- **شريط الموافقة على ملفات تعريف الارتباط:** ظهر فيه الوسم `<br/>` حرفياً، وجملة «لمعرفة المزيد، يرجى قراءة .» دون اسم الصفحة.
- **ترجمات حرفية:** «في انتظار المتحكم» لحالة المهمة، و«كل الدي سبيس» في القائمة، و«المقدم: غير قابل للتطبيق».

### البحث العربي

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

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

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

## بروتوكول OAI-PMH

[بروتوكول OAI-PMH](https://www.openarchives.org/OAI/openarchivesprotocol.html?ref=arabroot.io) هو الطريقة التي تقرأ بها المجمعات مثل BASE وOpenAIRE والفهارس الوطنية بيانات المستودع، وفي DSpace يعمل على `/server/oai/request`. وبعد نشر الرسالة طلبنا قائمة السجلات فكانت النتيجة:

```bash
curl -s "http://localhost:30880/server/oai/request?verb=ListRecords&metadataPrefix=oai_dc"
```

```text
<error code="noRecordsMatch">No matches for the query</error>
```

والسبب أن OAI في DSpace لا يقرأ قاعدة البيانات مباشرة، وإنما يقرأ نواة `oai` في Solr، وهذه النواة تملؤها مهمة مستقلة، و[توثيق OAI](https://wiki.lyrasis.org/display/DSDOC10x/OAI?ref=arabroot.io) يطلب تشغيلها بشكل دوري:

```bash
docker exec edu4-dspace-backend /dspace/bin/dspace oai import
```

```text
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.
```

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

```text
<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` بالقيمة الافتراضية `dspace-help@myu.edu`، وهي من `mail.admin`، فاضبط الاثنين قبل أن تسجل المستودع لدى أي مجمع.
- الرابط في `dc:identifier` هو الرابط الدائم، فإذا بقي على `localhost` أو على البادئة التجريبية حصدته المجمعات كما هو.

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

```text
<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](https://arabroot.io/articles/%D8%A7%D8%B5%D8%AF%D8%A7%D8%B1-%D9%85%D8%AC%D9%84%D8%A9-%D8%B9%D9%84%D9%85%D9%8A%D8%A9-%D9%85%D8%AD%D9%83%D9%85%D8%A9-%D9%85%D8%B9-open-journal-systems/).

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

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

```bash
docker exec edu4-dspace-backend /dspace/bin/dspace filter-media -v
```

```text
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` أصبح البحث يجد كلمات من داخل الملف مثل «متطلبات». و[صفحة المهام المجدولة](https://wiki.lyrasis.org/display/DSDOC10x/Scheduled+Tasks+via+Cron?ref=arabroot.io) فيها Crontab نموذجي للإنتاج، وأهم ما فيه:

| المهمة                     | الأمر                         | الموعد في المثال الرسمي        |
| -------------------------- | ----------------------------- | ------------------------------ |
| تحديث OAI-PMH              | dspace 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](https://www.handle.net/payment.html?ref=arabroot.io)، ورسومها كما في صفحته في 21 أكتوبر 2026: 50 دولاراً لمرة واحدة عند التسجيل، و50 دولاراً سنوياً لكل بادئة، ثم تضبط خادم Handle كما في [توثيق Handle في DSpace](https://wiki.lyrasis.org/display/DSDOC10x/Handle.Net+Registry+Support?ref=arabroot.io). ولم نجرب تسجيل بادئة حقيقية في المختبر.

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

في الإنتاج يحتاج المستودع نطاقاً واحداً مثل `repository.example.com` خلف Reverse Proxy بشهادة HTTPS كما في [تثبيت Caddy](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-caddy-reverse-proxy/)، يوجه `/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`، والإعدادات. وأخذناها في المختبر كما يلي:

```bash
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
```

```text
-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](https://wiki.lyrasis.org/display/DSDOC10x/AIP+Backup+and+Restore?ref=arabroot.io). ثم انقل النسخ خارج السيرفر واختبر استعادتها كما في [النسخ الاحتياطي بقاعدة 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/).

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

1. خذ نسخة كاملة، وجرب التحديث على نسخة من المستودع أولاً.
2. غير وسوم الـ Images الثلاثة إلى الإصدار الجديد معاً، فالواجهة والخادم الخلفي يجب أن يكونا من الإصدار نفسه.
3. عند التشغيل يرحل `dspace database migrate` قاعدة البيانات، ثم أعد بناء فهرس البحث بالأمر `dspace index-discovery -b` إذا طلبت ملاحظات الإصدار ذلك.
4. راجع [دليل الترقية](https://wiki.lyrasis.org/display/DSDOC10x/Upgrading+DSpace?ref=arabroot.io) عند الانتقال بين إصدارات رئيسية مثل 8 إلى 10، لأن إعدادات Solr والإعدادات العامة قد تتغير بينها.

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

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

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

```bash
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.