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

# مستودع البيانات Data Repository: Dataverse أم Zenodo؟
- URL: https://arabroot.io/articles/مستودع-بيانات-البحث-dataverse-ام-zenodo/
- Published: 2026-10-21T10:10:00.000Z
- Updated: 2026-10-23T14:39:36.000Z
- Description: الفرق بين مستودعات بيانات البحث وبوابات البيانات المفتوحة، مع تجربة كاملة لإيداع بيانات بوصف عربي ونشرها بمعرف DOI في Dataverse.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, التعليم والبحث العلمي

في مقال إدارة بيانات البحث ومبادئ FAIR وصلنا إلى أن البيانات يجب أن تنتهي في مستودع بيانات Data Repository يعطيها معرفاً دائماً ووصفاً وترخيصاً، فإذا جاء وقت الإيداع وجدت أمامك أسماء كثيرة: Dataverse وZenodo وFigshare وDryad، وCKAN الذي تراه خلف بوابات البيانات الحكومية، وDSpace الذي تستخدمه مكتبة جامعتك للرسائل والأبحاث. وهذا المقال موجه للباحث الذي يريد أن يعرف أين يودع بياناته، ولعمادة البحث العلمي أو المكتبة أو إدارة تقنية المعلومات في الجامعة التي تفكر في تشغيل مستودع بيانات خاص بها.

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

- الفرق بين مستودع بيانات البحث وبوابة البيانات المفتوحة الحكومية Open Data Portal والمستودع المؤسسي Institutional Repository.
- Dataverse وZenodo وCKAN، ونظرة سريعة على Figshare وDryad: لمن صمم كل واحد، ونقاط القوة ونقاط الضعف.
- كيف يصل الـ DOI إلى بياناتك عبر DataCite، وما بادئة الاختبار 10.5072.
- تجربة حقيقية: تشغيل Dataverse 6.12.1 في Docker، وإنشاء مجموعة Collection، وإيداع بيانات بوصف عربي، ونشرها بمعرف DOI تجريبي، والبحث فيها بالعربية.
- الإيداع في Zenodo عبر الـ API وبيئة الاختبار Sandbox.

## ثلاثة أنواع من المستودعات Repositories لثلاث وظائف

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

![ثلاث مجموعات: مستودع بيانات البحث Research Data Repository مثل Dataverse وZenodo وFigshare وDryad لبيانات الباحث مع DOI واستشهاد ونسخ Versions، وبوابة البيانات المفتوحة Open Data Portal مثل CKAN لبيانات الجهات الحكومية مع API وتحديث دوري، والمستودع المؤسسي Institutional Repository مثل DSpace للأبحاث والرسائل مع OAI-PMH](https://arabroot.io/content/images/2026/10/data-repositories-01-landscape.webp)

نوع المحتوى ومن ينشره هما ما يحدد المستودع المناسب، وليس شهرة الاسم.

- **مستودع بيانات البحث Research Data Repository:** يودع فيه الباحث مجموعة بيانات مرتبطة ببحث، ويحصل على DOI واستشهاد جاهز ونسخ مرقمة Versions، ويتحكم في الترخيص والوصول. وهنا تقع Dataverse وZenodo وFigshare وDryad.
- **بوابة البيانات المفتوحة Open Data Portal:** تنشر فيها جهة حكومية أو مؤسسة بياناتها التشغيلية، مثل أعداد الطلاب أو الميزانيات أو بيانات النقل، وتحدثها دورياً وتتيحها عبر API، والمستخدم فيها مطور أو صحفي أو باحث يريد أحدث نسخة وليس نسخة مجمدة مرتبطة ببحث. وهنا يقع CKAN، وفي السعودية [المنصة الوطنية للبيانات المفتوحة](https://open.data.gov.sa/?ref=arabroot.io) التي تنظمها [سياسة البيانات المفتوحة](https://sdaia.gov.sa/en/SDAIA/about/Documents/OpenDataPolicy.pdf?ref=arabroot.io) من مكتب إدارة البيانات الوطنية في سدايا.
- **المستودع المؤسسي Institutional Repository:** مكتبة الجامعة الرقمية للأبحاث المنشورة والرسائل العلمية، يحصدها Google Scholar والفهارس عبر OAI-PMH، وقد شرحناه بالتفصيل في دليل [مستودع الجامعة مع DSpace](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D8%A7%D9%84%D8%B9%D9%84%D9%85%D9%8A-%D9%84%D9%84%D8%AC%D8%A7%D9%85%D8%B9%D8%A9-%D9%85%D8%B9-dspace/). يستطيع DSpace أن يحفظ ملفات بيانات، لكنه لا يفهم الجداول ولا يصف المتغيرات كما يفعل مستودع البيانات.

[![](https://arabroot.io/content/images/2026/10/dspace-cover-cover-1.webp)دليلمستودع الجامعة Institutional Repository مع DSpaceكيف تشغل DSpace لأرشفة رسائل الطلاب وأبحاث الجامعة، من الإيداع ومراجعته حتى الحصاد عبر OAI-PMH، وما يحتاج تعريباً قبل الإطلاق.](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D8%A7%D9%84%D8%B9%D9%84%D9%85%D9%8A-%D9%84%D9%84%D8%AC%D8%A7%D9%85%D8%B9%D8%A9-%D9%85%D8%B9-dspace/)[![](https://arabroot.io/content/images/2026/10/research-data-management-cover-cover.webp)دليلإدارة بيانات البحث Research Data Management ومبادئ FAIRكيف تحفظ بيانات بحثك وتصفها وتشاركها وفق مبادئ FAIR وما يطلبه الممولون في خطة إدارة البيانات، مع قالب جاهز وتجربة لإخفاء الهوية.](https://arabroot.io/articles/%D8%A7%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-research-data-management-%D9%88%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-fair/)

## المستودعات واحداً واحداً

### Dataverse

[Dataverse](https://dataverse.org/about?ref=arabroot.io) برنامج مفتوح المصدر بترخيص Apache 2.0 يطوره معهد العلوم الاجتماعية الكمية IQSS في جامعة Harvard مع مجتمع واسع، وتشغله الجامعة نفسها في مستودع Harvard Dataverse المفتوح للباحثين من كل التخصصات، وتشغله جامعات ومراكز بحث كثيرة على خوادمها، وآخر إصدار عند كتابة المقال [6.12.1 الصادر في 8 أكتوبر 2026](https://github.com/IQSS/dataverse/releases/tag/v6.12.1?ref=arabroot.io). والفكرة فيه أن كل جهة أو مجموعة بحثية لها مجموعة Collection (كانت تسمى dataverse بحرف صغير) فيها مجموعات بيانات Datasets، ولكل مجموعة بيانات وصف ونسخ وملفات ومعرف دائم.

**نقاط القوة:**

- يفهم البيانات الجدولية، فعند رفع CSV أو SPSS أو Stata يحولها بعملية [Tabular Data Ingest](https://guides.dataverse.org/en/6.12.1/user/tabulardataingest/index.html?ref=arabroot.io) إلى صيغة نصية مستقلة عن البرامج، ويستخرج وصفاً لكل متغير وإحصاءات ملخصة، ويحسب بصمة رقمية UNF تثبت أن الأرقام لم تتغير.
- يصدر DOI عبر DataCite أو EZID، أو Handle، أو رابطاً دائماً PermaLink للاستخدام الداخلي.
- يسمح بتقييد ملفات بعينها مع طلب وصول Access Request، فالوصف منشور والبيانات الحساسة خلف موافقة صاحبها.
- كتل وصف Metadata Blocks جاهزة للعلوم الاجتماعية والجغرافيا والفلك وعلوم الحياة، و[API كامل](https://guides.dataverse.org/en/6.12.1/api/native-api.html?ref=arabroot.io) لكل ما تفعله من الواجهة.

**نقاط الضعف:**

- تشغيله على خادمك يحتاج إلى Payara وPostgreSQL وSolr، أي أنه نظام كامل يحتاج من يديره، وليس برنامجاً تثبته وتنساه.
- الواجهة من اليسار إلى اليمين، والبحث بالعربية يطابق الكلمة كما كتبت كما سوف نرى في التجربة.
- الـ DOI الحقيقي يحتاج عضوية في DataCite أو اتفاقاً مع جهة عضو، وهي تكلفة سنوية على الجامعة.

### Zenodo

Zenodo مستودع عام يشغله مختبر CERN على برنامج InvenioRDM مفتوح المصدر، ويقبل البيانات والكود والأبحاث والعروض من أي باحث في أي تخصص، وقد عرضناه في مقال [النشر المسبق Preprints](https://arabroot.io/articles/%D8%A7%D9%84%D9%86%D8%B4%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-preprints-%D9%88%D8%A7%D9%84%D8%AD%D9%82%D9%88%D9%82/) كمكان للنسخ المسبقة. والأرقام التالية من [صفحة سياساته](https://about.zenodo.org/policies/?ref=arabroot.io):

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

**نقاط القوة:** لا تحتاج أن تشغل شيئاً، والـ DOI حقيقي من أول إيداع، والنسخ Versioning مدعومة بـ DOI لكل نسخة وDOI يجمعها، ومعه [REST API](https://developers.zenodo.org/?ref=arabroot.io) وبيئة اختبار منفصلة.

**نقاط الضعف:** لا يفهم الجداول ولا يستخرج وصف المتغيرات، والجامعة لا تملك المستودع ولا تتحكم في سياساته، وبياناتك على خوادم خارج المملكة، وهذا يهم إذا كانت البيانات شخصية لأن نقلها خارج المملكة له [أحكام في لائحة نظام حماية البيانات الشخصية](https://sdaia.gov.sa/en/SDAIA/about/Documents/ImplementingRegulationPersonalDataProtectionLaw.pdf?ref=arabroot.io)، فالبيانات التي أخفيت هويتها فعلاً هي وحدها المناسبة لمستودع عام.

### CKAN

[CKAN](https://ckan.org/?ref=arabroot.io) نظام مفتوح المصدر بترخيص AGPL من Open Knowledge Foundation، يصف نفسه بأنه نظام لإدارة البيانات يشغل بوابات البيانات المفتوحة، ويستخدمه عدد من الحكومات الوطنية والمحلية في أوروبا والأمريكتين وآسيا، وآخر إصدار له [2.12.0 الصادر في 26 أغسطس 2026](https://github.com/ckan/ckan/releases/tag/ckan-2.12.0?ref=arabroot.io).

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

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

### Figshare وDryad باختصار

- **Figshare:** مستودع تجاري من شركة Digital Science، الحساب المجاني فيه بحسب [صفحة حدود الحسابات](https://info.figshare.com/user-guide/account-limits/?ref=arabroot.io) مساحة 20GB وحد أقصى للملف الواحد 20GB، ولديه نسخة مؤسسية مدفوعة تشغلها بعض الجامعات مستودعاً لها.
- **Dryad:** مستودع غير ربحي يراجع فريقه كل إيداع قبل نشره Curation، ويشترط [ترخيص CC0](https://datadryad.org/requirements?ref=arabroot.io) لكل البيانات، ويطلب رسوم نشر بيانات Data Publishing Charge إذا لم تكن جامعتك أو مجلتك شريكاً له، وهي بحسب [صفحة التكاليف](https://datadryad.org/costs?ref=arabroot.io) السارية منذ 6 مايو 2025: 150 دولاراً حتى 5GB، و180 دولاراً حتى 10GB، و520 دولاراً حتى 50GB.

### المقارنة في جدول

|                        | Dataverse                       | Zenodo                  | CKAN                            |
| ---------------------- | ------------------------------- | ----------------------- | ------------------------------- |
| صمم من أجل             | بيانات البحث في جهة أو جامعة    | أي مخرج بحثي من أي باحث | بيانات الجهات الحكومية المفتوحة |
| التشغيل                | على خادمك، أو Harvard Dataverse | خدمة يشغلها CERN        | على خادمك                       |
| الترخيص البرمجي        | Apache 2.0                      | InvenioRDM مفتوح المصدر | AGPL                            |
| المعرف الدائم          | DOI أو Handle أو PermaLink      | DOI لكل نسخة            | ليس محور تصميمه                 |
| فهم الجداول والمتغيرات | نعم، Ingest وUNF                | لا                      | DataStore وAPI للجداول          |
| ملفات مقيدة بطلب وصول  | نعم                             | نعم                     | مجموعات خاصة بحسب الصلاحيات     |
| مكان البيانات          | حيث تشغله                       | جنيف وبودابست           | حيث تشغله                       |

وقد يتساءل البعض: إذا كان Zenodo يعطي DOI حقيقياً دون أن أشغل شيئاً، فلماذا تشغل جامعة Dataverse؟ والإجابة في ثلاث نقاط من الجدول: البيانات الشخصية التي لا يمكن إخفاء هويتها تحتاج أن تبقى داخل المملكة وتحت صلاحيات الجامعة، والجامعة تريد أن تجمع بيانات باحثيها في مكان واحد يحمل اسمها وتخرج منه تقاريرها، والبيانات الجدولية تستفيد من الـ Ingest ووصف المتغيرات. أما الباحث الفرد الذي لديه بيانات مخفية الهوية أو كود ولا يوجد في جامعته مستودع بيانات، فـ Zenodo هو الحل الأنسب له.

## كيف يصل الـ DOI إلى بياناتك؟

شرحنا ما هو الـ DOI ومن يسجله في مقال [معرف ORCID وDOI](https://arabroot.io/articles/%D9%85%D8%B9%D8%B1%D9%81-orcid-%D9%88-doi-%D9%83%D9%8A%D9%81-%D8%AA%D8%B1%D8%A8%D8%B7-%D8%A7%D8%B3%D9%85%D9%83-%D8%A8%D8%A7%D8%A8%D8%AD%D8%A7%D8%AB%D9%83/)، والذي يهمنا هنا أن معرفات البيانات تسجل عادة عند DataCite وليس Crossref الذي تسجل عنده المجلات أبحاثها. والمستودع هو الذي يتحدث مع DataCite نيابة عنك، كما في الصورة التالية:

![أربع خطوات: الباحث ينشر مجموعة البيانات في Dataverse، فيرسل Dataverse الوصف ورابط الصفحة إلى DataCite عبر MDS API باسم حساب الجامعة وبادئتها مثل 10.xxxx، فيسجل DataCite المعرف والوصف ويفهرسه، وعندما يفتح أحد https://doi.org/10.xxxx/ABC يحوله إلى صفحة البيانات. وفي الأسفل: البادئة 10.5072 للاختبار فقط، ويحولها doi.org إلى صفحة DataCite عن بادئة الاختبار](https://arabroot.io/content/images/2026/10/data-repositories-07-doi-flow.webp)

المستودع يسجل المعرف عند DataCite بحساب الجامعة، وdoi.org يحول الرابط إلى صفحة البيانات.

وللاختبار تستخدم Dataverse مزوداً وهمياً اسمه FAKE يصنع معرفات بالبادئة 10.5072 دون أن يتصل بأحد، وهي البادئة نفسها التي تستخدمها بيئة الاختبار في Zenodo و[بيئة الاختبار في DataCite](https://support.datacite.org/docs/testing-guide?ref=arabroot.io). ولاحظ أن الرابط `https://doi.org/10.5072/...` لا يفتح صفحة بياناتك، فـ doi.org يحول أي معرف بهذه البادئة إلى صفحة DataCite التي تشرح أنها بادئة اختبار، وهذا ما رأيناه في التجربة بالأمر التالي:

```bash
curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' https://doi.org/10.5072/FK2XSXQ3V
```

```text
302 http://www.datacite.org/testprefix
```

## تجربة عملية: Dataverse في Docker

سوف نشغل Dataverse بالإعداد الذي ينشره المشروع في [دليل التشغيل التجريبي بالـ Containers](https://guides.dataverse.org/en/6.12.1/container/running/demo.html?ref=arabroot.io)، مع تعديلات قليلة: إصدارات مثبتة بدلاً من `latest`، ومزود DOI وهمي FAKE بدلاً من PermaLinks حتى نرى شكل الـ DOI، وبدون خدمة البريد وأداة المعاينة. وهذا الإعداد للتجربة والتعلم وليس للإنتاج Production، فكلمات المرور فيه مكتوبة في الملف، والـ Admin API مفتوح.

### المتطلبات

- Docker مع Docker Compose، وذاكرة 4GB على الأقل متاحة للـ Containers، فخادم Payara وحده محدد بـ 2GB، ومعه PostgreSQL وSolr.
- مساحة قرص نحو 3GB للـ Images.
- المنفذ 8080 على جهازك.

### ملف docker-compose.yml

```yaml
name: dataverse-lab
services:
  dataverse:
    hostname: dataverse
    image: gdcc/dataverse:6.12.1-noble-r0
    restart: on-failure
    user: payara
    environment:
      DATAVERSE_SITEURL: "http://localhost:8080"
      DATAVERSE_DB_HOST: postgres
      DATAVERSE_DB_PASSWORD: secret
      DATAVERSE_DB_USER: dataverse
      DATAVERSE_FEATURE_API_BEARER_AUTH: "1"
      DATAVERSE_MAIL_SYSTEM_EMAIL: "Demo Dataverse <dataverse@example.org>"
      JVM_ARGS: -Ddataverse.files.storage-driver-id=file1
        -Ddataverse.files.file1.type=file
        -Ddataverse.files.file1.label=Filesystem
        -Ddataverse.files.file1.directory=/dv/store
        -Ddataverse.pid.providers=fake1
        -Ddataverse.pid.default-provider=fake1
        -Ddataverse.pid.fake1.type=FAKE
        -Ddataverse.pid.fake1.label=FakeDOI
        -Ddataverse.pid.fake1.authority=10.5072
        -Ddataverse.pid.fake1.shoulder=FK2
    ports:
      - "8080:8080"
    depends_on: [postgres, solr, dv_initializer]
    volumes:
      - dv-app:/dv
      - dv-secrets:/secrets
      - ./persistence.xml:/opt/payara/deployments/dataverse/WEB-INF/classes/META-INF/persistence.xml:ro
      - ./platform-fix/classes/org/arabroot:/opt/payara/deployments/dataverse/WEB-INF/classes/org/arabroot:ro
    tmpfs:
      - /dumps:mode=1777,size=2052M
      - /tmp:mode=1777,size=2052M
    mem_limit: 2147483648
  bootstrap:
    image: gdcc/configbaker:6.12.1-noble-r0
    restart: "no"
    environment: [TIMEOUT=10m]
    command: [bootstrap.sh, dev]
  dv_initializer:
    image: gdcc/configbaker:6.12.1-noble-r0
    restart: "no"
    command: [sh, -c, "fix-fs-perms.sh dv"]
    volumes:
      - dv-app:/dv
  postgres:
    hostname: postgres
    image: postgres:17.6-alpine
    restart: on-failure
    environment: [POSTGRES_USER=dataverse, POSTGRES_PASSWORD=secret]
    volumes:
      - dv-db:/var/lib/postgresql/data
  solr_initializer:
    image: gdcc/configbaker:6.12.1-noble-r0
    restart: "no"
    command: [sh, -c, "fix-fs-perms.sh solr && cp -a /template/* /solr-template"]
    volumes:
      - dv-solr:/var/solr
      - dv-solrconf:/solr-template
  solr:
    hostname: solr
    image: solr:9.8.0
    depends_on: [solr_initializer]
    restart: on-failure
    environment: [SOLR_OPTS=-Dsolr.jetty.request.header.size=102400]
    command: [solr-precreate, collection1, /template]
    volumes:
      - dv-solr:/var/solr
      - dv-solrconf:/template
volumes:
  dv-app:
  dv-secrets:
  dv-db:
  dv-solr:
  dv-solrconf:
```

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

- الخدمة `bootstrap` تنتظر حتى يعمل Dataverse ثم تنشئ المستخدم المدير `dataverseAdmin` والمجموعة الرئيسية Root والتراخيص، والوضع `dev` يترك الـ Admin API مفتوحاً، لذلك لا تستخدمه على خادم متصل بالإنترنت، فللإنتاج يوجد الوضع `demo` الذي يطلب مفتاحاً لفتح الـ Admin API.
- الخدمتان `dv_initializer` و`solr_initializer` تضبطان صلاحيات الـ Volumes وتنسخان إعداد Solr الخاص بـ Dataverse ثم تنتهيان.
- مزود الـ DOI اسمه `fake1` ونوعه `FAKE` بالبادئة 10.5072، وفي الإنتاج تستبدله بمزود من نوع `datacite` ببادئة جامعتك وحسابها كما في [دليل الإعداد](https://guides.dataverse.org/en/6.12.1/installation/config.html?ref=arabroot.io).
- السطران الأخيران في `volumes` علاج لعطل في الإصدار الحالي نشرحه الآن.

### لماذا يفشل التشغيل الأول؟ عطل SERIAL

عند تشغيل الإعداد الرسمي كما هو على قاعدة بيانات جديدة لم يعمل Dataverse، وبقيت الصفحة ترجع 404، وفي سجلات Payara ظهرت مئات الأخطاء من هذا النوع:

```text
PER01000: Got SQLException executing statement "CREATE TABLE EXTERNALTOOLTYPE (ID BIGINT SERIAL NOT NULL, TYPE VARCHAR(255) NOT NULL, EXTERNALTOOL_ID BIGINT NOT NULL, PRIMARY KEY (ID))": org.postgresql.util.PSQLException: ERROR: syntax error at or near "SERIAL"
```

ثم فشلت ترحيلات Flyway Migrations لأن الجداول لم تنشأ:

```text
Caused by: org.flywaydb.core.internal.exception.FlywayMigrateException: Failed to execute script V4.11__5513-database-variablemetadata.sql
Message    : ERROR: relation "datavariable" does not exist
```

والسبب أن الـ Image مبنية على Payara 7.2026.9، وفيها نسخة EclipseLink 5.0.0.payara-p1 التي تكتب `BIGINT SERIAL` للأعمدة التي تزيد تلقائياً، وهي صيغة لا يقبلها PostgreSQL، والعطل موثق في [تقرير Payara رقم 8250](https://github.com/payara/Payara/issues/8250?ref=arabroot.io) الذي ظهر منذ الإصدار 7.2026.6، وفي [تقرير Dataverse رقم 12724](https://github.com/IQSS/dataverse/issues/12724?ref=arabroot.io). والترقية من إصدار سابق لا تتأثر لأن الجداول موجودة أصلاً، أما التثبيت الجديد فيتعطل. وقد جربنا أولاً أن نحدد المنصة `PostgreSQLPlatform` القديمة في `persistence.xml` فظهر الخطأ نفسه، لأنها تكتب `SERIAL` بالطريقة نفسها.

والعلاج الذي نجح كلاس صغير يرث منصة PostgreSQL 10 ويكتب الصيغة المعيارية `GENERATED BY DEFAULT AS IDENTITY`:

```java
package org.arabroot.lab;

import java.io.IOException;
import java.io.Writer;
import org.eclipse.persistence.exceptions.ValidationException;
import org.eclipse.persistence.platform.database.PostgreSQL10Platform;

/** EclipseLink 5.0.0.payara-p1 prints "BIGINT SERIAL" for IDENTITY columns (eclipse-ee4j/eclipselink#2644);
 *  PostgreSQL 10+ needs "GENERATED BY DEFAULT AS IDENTITY". Used only to create a fresh Dataverse database. */
public class FixedPostgreSQLPlatform extends PostgreSQL10Platform {
    @Override
    public void printFieldIdentityClause(Writer writer) throws ValidationException {
        try {
            writer.write(" GENERATED BY DEFAULT AS IDENTITY");
        } catch (IOException e) {
            throw ValidationException.fileError(e);
        }
    }
}
```

نأخذ مكتبة EclipseLink من الـ Image نفسها حتى نترجم Compile الكلاس على النسخة نفسها، ثم نترجمه في Container فيه JDK 21، ثم ننسخ ملف `persistence.xml` من الـ Image ونضيف إليه سطراً واحداً:

```bash
docker create --name dv-tmp gdcc/dataverse:6.12.1-noble-r0
docker cp dv-tmp:/opt/payara/appserver/glassfish/modules/org.eclipse.persistence.core.jar platform-fix/
docker cp dv-tmp:/opt/payara/deployments/dataverse/WEB-INF/classes/META-INF/persistence.xml .
docker rm dv-tmp
docker run --rm -v "$PWD/platform-fix":/w -w /w eclipse-temurin:21.0.8_9-jdk-noble \
  javac --release 21 -cp org.eclipse.persistence.core.jar -d classes FixedPostgreSQLPlatform.java
```

```xml
<property name="eclipselink.weaving" value="false"/>
<property name="eclipselink.target-database" value="org.arabroot.lab.FixedPostgreSQLPlatform"/>
```

والسطر الثاني هو الإضافة، تضعه بعد السطر الأول داخل `<properties>`. والـ Compose أعلاه يركب الملف والكلاس فوق الموجود في الـ Image للقراءة فقط. وبعد إصلاح العطل في إصدار قادم من Dataverse أو Payara احذف السطرين من `volumes`، ولا تضف هذا العلاج إلى خادم يعمل منذ إصدار سابق، فهو يحتاجه التثبيت الجديد فقط.

### التشغيل

```bash
docker compose up -d
docker compose logs -f bootstrap
```

التشغيل الأول يأخذ عدة دقائق، فخادم Payara ينشئ الجداول ثم تعمل ترحيلات Flyway ثم يبدأ `bootstrap` عمله، وآخر ما يكتبه:

```text
Setting DOI provider to "FAKE"...
{"status":"OK","data":{"message":"Setting :DoiProvider added."}}Publishing root dataverse...
Checking Dataverse version...
{"status":"OK","data":{"version":"6.12.1","build":null}}
Done, your instance has been configured for development. Have a nice day!
```

### حساب الباحث والتوكن API Token

الوضع `dev` يضبط مفتاح إنشاء المستخدمين `:BuiltinUsersKey` على القيمة `burrito`، فننشئ حساباً لباحث عبر الـ API، والرد يحتوي على التوكن API Token الذي نستخدمه في باقي الخطوات، ونحفظه في متغير دون أن نطبعه:

```bash
B=http://localhost:8080
curl -s -X POST "$B/api/builtin-users?password=Lab-Passw0rd-2026&key=burrito" \
  -H "Content-Type: application/json" \
  -d '{"firstName":"Research","lastName":"Lab","userName":"researcher","affiliation":"ArabRoot","email":"researcher@example.com"}' > user.json
python3 -c "import json;d=json.load(open('user.json'));print(d['status'], d['data']['user']['userName'])"
TOKEN=$(python3 -c "import json;print(json.load(open('user.json'))['data']['apiToken'])")
```

```text
OK researcher
```

وفي الإنتاج لا يوجد هذا المفتاح، فالباحث يسجل من الواجهة أو بحساب الجامعة عبر SSO، ثم ينشئ التوكن من صفحة API Token في حسابه.

### إنشاء مجموعة Collection

نحدد المجموعة في ملف `dataverse.json`:

```json
{
  "alias": "arabroot-lab",
  "name": "مختبر بيانات البحث",
  "affiliation": "ArabRoot",
  "dataverseType": "LABORATORY",
  "description": "مجموعة تجريبية لإيداع بيانات البحث بوصف عربي",
  "dataverseContacts": [{ "contactEmail": "data@example.com" }]
}
```

```bash
curl -s -H "X-Dataverse-key: $TOKEN" -X POST "$B/api/dataverses/root" \
  -H "Content-Type: application/json" --data-binary @dataverse.json
```

والرد يؤكد الإنشاء، والمجموعة غير منشورة بعد `"isReleased":false` حتى ننشرها بعد إضافة البيانات.

### مجموعة بيانات بوصف عربي

ملف البيانات هو الاستبانة التي رمزنا هويتها وعممنا العمر فيها في مقال إدارة بيانات البحث، 400 صف بترميز UTF-8، ومعه ملف `README.md` فيه قاموس المتغيرات. والوصف في ملف `dataset.json` بكتلة الاستشهاد Citation الإلزامية:

```json
{
  "datasetVersion": {
    "license": { "name": "CC0 1.0", "uri": "http://creativecommons.org/publicdomain/zero/1.0" },
    "metadataBlocks": {
      "citation": {
        "fields": [
          { "typeName": "title", "multiple": false, "typeClass": "primitive",
            "value": "استبانة استخدام الإنترنت لدى طلاب الجامعة" },
          { "typeName": "alternativeTitle", "multiple": true, "typeClass": "primitive",
            "value": ["University students internet use survey"] },
          { "typeName": "author", "multiple": true, "typeClass": "compound", "value": [
            { "authorName": { "typeName": "authorName", "multiple": false, "typeClass": "primitive", "value": "فريق عرب رووت" },
              "authorAffiliation": { "typeName": "authorAffiliation", "multiple": false, "typeClass": "primitive", "value": "ArabRoot" } } ] },
          { "typeName": "datasetContact", "multiple": true, "typeClass": "compound", "value": [
            { "datasetContactEmail": { "typeName": "datasetContactEmail", "multiple": false, "typeClass": "primitive", "value": "data@example.com" } } ] },
          { "typeName": "dsDescription", "multiple": true, "typeClass": "compound", "value": [
            { "dsDescriptionValue": { "typeName": "dsDescriptionValue", "multiple": false, "typeClass": "primitive",
              "value": "بيانات استبانة مولدة للتجربة من 400 مشارك بعد ترميز الهوية وتعميم العمر، مع قاموس المتغيرات في ملف README." } } ] },
          { "typeName": "subject", "multiple": true, "typeClass": "controlledVocabulary", "value": ["Social Sciences"] },
          { "typeName": "keyword", "multiple": true, "typeClass": "compound", "value": [
            { "keywordValue": { "typeName": "keywordValue", "multiple": false, "typeClass": "primitive", "value": "استبانة" } },
            { "keywordValue": { "typeName": "keywordValue", "multiple": false, "typeClass": "primitive", "value": "الإنترنت" } } ] },
          { "typeName": "language", "multiple": true, "typeClass": "controlledVocabulary", "value": ["Arabic"] }
        ]
      }
    }
  }
}
```

```bash
curl -s -H "X-Dataverse-key: $TOKEN" -X POST "$B/api/dataverses/arabroot-lab/datasets" \
  -H "Content-Type: application/json" --data-binary @dataset.json
```

```text
{"status":"OK","data":{"id":3,"persistentId":"doi:10.5072/FK2XSXQ3V"}}
```

لاحظ أن الـ DOI حجز من لحظة إنشاء المسودة Draft، قبل النشر، حتى يستطيع الباحث أن يكتبه في البحث قبل إرساله للمجلة.

### رفع الملفات وتحويل الجدول Ingest

```bash
P=doi:10.5072/FK2XSXQ3V
curl -s -H "X-Dataverse-key: $TOKEN" -X POST "$B/api/datasets/:persistentId/add?persistentId=$P" \
  -F "file=@deposit/survey_shared.csv" -F 'jsonData={"description":"","restrict":"false"}'
```

ارفع الملف الثاني `README.md` بالأمر نفسه بعد أن ينتهي تحويل الملف الأول، فالمجموعة تكون مقفلة Locked أثناء الـ Ingest، وقد رفض Dataverse الملف الثاني عندما أرسلناه مباشرة بعد الأول. ثم نعرض قائمة الملفات:

```bash
curl -s -H "X-Dataverse-key: $TOKEN" "$B/api/datasets/:persistentId/versions/:draft/files?persistentId=$P" | python3 -c "
import json,sys
for f in json.load(sys.stdin)['data']:
    x=f['dataFile'];print(x['id'],x['filename'],x['contentType'],x['filesize'],x.get('tabularData'),x.get('originalFileFormat'),x.get('originalFileSize'))"
```

```text
5 README.md text/markdown 1009 False None None
4 survey_shared.tab text/tab-separated-values 17320 True text/csv 14581
```

في المخرج أعلاه لاحظ أن ملف CSV أصبح `survey_shared.tab`، أي أن Dataverse قرأ الجدول وحوله إلى صيغته المستقلة واحتفظ بالأصل بحجمه 14581 بايت لمن يريد تنزيله كما رفع. ووصف المتغيرات الذي استخرجه متاح بصيغة DDI، وفيه 6 متغيرات، ولعمود الرضا `q1_satisfaction` حسب المتوسط 3.0225 والوسيط 3.0 والانحراف المعياري 1.3845 من 400 قيمة صالحة، دون أن نكتب سطراً من التحليل.

### النشر والاستشهاد Citation

ننشر المجموعة أولاً ثم مجموعة البيانات، فلا يمكن نشر بيانات داخل مجموعة غير منشورة:

```bash
curl -s -H "X-Dataverse-key: $TOKEN" -X POST "$B/api/dataverses/arabroot-lab/actions/:publish"
curl -s -H "X-Dataverse-key: $TOKEN" -X POST "$B/api/datasets/:persistentId/actions/:publish?persistentId=$P&type=major"
```

```text
{"status":"OK","data":{"id":3,"identifier":"FK2XSXQ3V","persistentUrl":"https://doi.org/10.5072/FK2XSXQ3V","protocol":"doi","authority":"10.5072","separator":"/","publisher":"Root","storageIdentifier":"local://10.5072/FK2XSXQ3V","datasetType":"dataset","locks":["finalizePublication"]}}
```

ثم نطلب الاستشهاد الذي يولده Dataverse:

```bash
curl -s "$B/api/datasets/:persistentId/versions/:latest-published/citation?persistentId=$P"
```

```text
{"status":"OK","data":{"message":"فريق عرب رووت, 2026, \"استبانة استخدام الإنترنت لدى طلاب الجامعة\", <a href=\"https://doi.org/10.5072/FK2XSXQ3V\" target=\"_blank\">https://doi.org/10.5072/FK2XSXQ3V</a>, Root, V1, UNF:6:wxIGMvSLEnRhkJD+qcEewA== [fileUNF]"}}
```

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

- الناشر Publisher في الاستشهاد هو `Root`، أي اسم المجموعة الرئيسية، فعلى خادم الجامعة غير اسمها إلى اسم الجامعة قبل أول نشر، لأن هذا الاسم يذهب إلى DataCite ويظهر في كل استشهاد.
- الاستشهاد ينتهي ببصمة UNF، فإذا أعاد أحد التحليل على ملف مختلف ولو برقم واحد اختلفت البصمة.
- النسخة V1، وأي تعديل لاحق ينشئ مسودة ثم V1.1 أو V2، والنسخة الأولى تبقى كما هي لمن استشهد بها.

![صفحة مجموعة البيانات في Dataverse بعنوان عربي، وفيها الاستشهاد مع الرابط https://doi.org/10.5072/FK2XSXQ3V وبصمة UNF، والوصف والموضوع Social Sciences والكلمات المفتاحية العربية والترخيص CC0 1.0، وتبويبات Files وMetadata وTerms وVersions](https://arabroot.io/content/images/2026/10/data-repositories-03-dataset.webp)

صفحة مجموعة البيانات بعد النشر: العنوان العربي والاستشهاد والترخيص في أعلى الصفحة.

ولاحظ في الصورة أن الواجهة من اليسار إلى اليمين، فالفقرة العربية التي تنتهي بكلمة إنجليزية مثل README تظهر الكلمة في غير مكانها، والحل البسيط أن تختم الفقرة العربية بكلمة عربية، وأن تضع العنوان الإنجليزي في حقل العنوان البديل Alternative Title كما فعلنا. وتبويب Metadata يعرض كل الحقول، ومنه زر Export Metadata الذي يصدر الوصف بصيغ DataCite وDDI وDublin Core وSchema.org:

![تبويب Metadata في Dataverse يعرض المعرف doi:10.5072/FK2XSXQ3V وتاريخ النشر 2026-10-23 والعنوان العربي والعنوان البديل الإنجليزي والمؤلف والوصف والموضوع والكلمات المفتاحية واللغة Arabic، وزر Export Metadata](https://arabroot.io/content/images/2026/10/data-repositories-04-metadata.webp)

كتلة الاستشهاد Citation Metadata كما يراها الزائر، وزر التصدير بصيغ الوصف المعيارية.

### الوصف Metadata الذي يصل إلى DataCite

نصدر الوصف بصيغة DataCite لنرى ما سوف يرسله المستودع عند التسجيل الحقيقي:

```bash
curl -s "$B/api/datasets/export?exporter=Datacite&persistentId=$P"
```

```xml
<resource xmlns="http://datacite.org/schema/kernel-4" xsi:schemaLocation="http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.7/metadata.xsd">
<identifier identifierType="DOI">10.5072/FK2XSXQ3V</identifier>
<creators>
<creator>
<creatorName nameType="Personal">فريق عرب رووت</creatorName>
<affiliation>ArabRoot</affiliation>
</creator>
</creators>
<titles>
<title>استبانة استخدام الإنترنت لدى طلاب الجامعة</title>
<title titleType="AlternativeTitle">University students internet use survey</title>
</titles>
<publisher>Root</publisher>
<publicationYear>2026</publicationYear>
<subjects>
<subject>Social Sciences</subject>
<subject>استبانة</subject>
<subject>الإنترنت</subject>
</subjects>
<language>ara</language>
<resourceType resourceTypeGeneral="Dataset"/>
<rightsList>
<rights rightsURI="info:eu-repo/semantics/openAccess"/>
<rights rightsURI="http://creativecommons.org/publicdomain/zero/1.0" rightsIdentifier="CC0-1.0" rightsIdentifierScheme="SPDX" schemeURI="https://spdx.org/licenses/" xml:lang="en">Creative Commons CC0 1.0 Universal Public Domain Dedication.</rights>
</rightsList>
</resource>
```

اختصرنا من المخرج عناصر التاريخ والحجم والصيغ، والذي يهمنا فيه نقطتان: المخطط هو DataCite 4.7 والعناصر الإلزامية الستة موجودة، واسم الفريق صنفه Dataverse شخصاً `nameType="Personal"` لأنه لا يعرف أنه اسم جهة، فإذا كان المؤلف مؤسسة أو فريقاً فراجع هذا الحقل قبل التسجيل الحقيقي، واربط كل مؤلف شخص بمعرف ORCID في حقل معرف المؤلف.

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

البحث في Dataverse يعمل عبر Solr، ونريد أن نعرف كيف يتعامل مع العربية. ولاحظ هنا تفصيلة صغيرة كلفتنا وقتاً: عند إرسال كلمة عربية من Git Bash على Windows بالأمر `curl --data-urlencode` وصلت إلى السيرفر علامات استفهام، وعلامة الاستفهام في Solr رمز يطابق أي حرف، فظهرت نتائج لكل كلمة لها عدد الحروف نفسه. لذلك كتبنا سكربتاً صغيراً بـ Python يرمز الكلمة بـ UTF-8 بشكل صحيح:

```python
import json, sys, urllib.parse, urllib.request
base = "http://localhost:8080/api/search?"
for q in sys.argv[1:]:
    url = base + urllib.parse.urlencode({"q": q, "type": "dataset"})
    d = json.load(urllib.request.urlopen(url))["data"]
    print(f"{q:<12} total={d['total_count']}  {[i['name'] for i in d['items']]}")
```

```bash
python3 -X utf8 dvsearch.py "استبانة" "الاستبانة" "استبانات" "الإنترنت" "الانترنت" "طلاب" "الطلاب" "internet"
```

```text
استبانة      total=1  ['استبانة استخدام الإنترنت لدى طلاب الجامعة']
الاستبانة    total=0  []
استبانات     total=0  []
الإنترنت     total=1  ['استبانة استخدام الإنترنت لدى طلاب الجامعة']
الانترنت     total=0  []
طلاب         total=1  ['استبانة استخدام الإنترنت لدى طلاب الجامعة']
الطلاب       total=0  []
internet     total=1  ['استبانة استخدام الإنترنت لدى طلاب الجامعة']
```

والنتيجة واضحة: البحث العربي يطابق الكلمة كما كتبت فقط، فإضافة «ال» أو الجمع أو كتابة الألف دون همزة تعطي صفراً، والسبب أن حقل العنوان في مخطط Solr الذي يأتي مع Dataverse نوعه `text_en`، أي أنه مضبوط للإنجليزية، وملف المخطط نفسه فيه نوع `text_ar` بفلاتر التطبيع Normalization والتجذيع Stemming العربية لكنه غير مستخدم في حقول Dataverse. والكلمة الإنجليزية `internet` وجدت البيانات لأننا وضعنا العنوان البديل بالإنجليزية.

![صفحة البحث في Dataverse بعد البحث عن كلمة الاستبانة بأل التعريف، والنتيجة صفر في Dataverses وDatasets وFiles مع رسالة لا توجد نتائج](https://arabroot.io/content/images/2026/10/data-repositories-06-search-miss.webp)

البحث عن «الاستبانة» بأل التعريف لا يجد مجموعة البيانات التي عنوانها يبدأ بكلمة «استبانة».

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

## الإيداع في Zenodo عبر الـ API

لم نشغل هذا الجزء لأن الإيداع في Zenodo يحتاج حساباً وتوكناً شخصياً، والخطوات التالية من [توثيق Zenodo للمطورين](https://developers.zenodo.org/?ref=arabroot.io). وللتجربة توجد بيئة اختبار على `https://sandbox.zenodo.org` تحتاج تسجيلاً وتوكناً منفصلين عن الموقع الحقيقي، وتصدر معرفات بالبادئة 10.5072، ويمكن أن تمسح محتواها في أي وقت. والتوكن يحتاج الصلاحيتين `deposit:write` و`deposit:actions`، والمسار كالتالي:

1. إنشاء إيداع فارغ: `POST /api/deposit/depositions`، والرد فيه رقم الإيداع ورابط `bucket`.
2. رفع الملف بطلب `PUT` إلى رابط الـ `bucket` متبوعاً باسم الملف.
3. إضافة الوصف: `PUT /api/deposit/depositions/<id>` بالعنوان والمؤلفين والوصف ونوع الرفع `dataset` والترخيص.
4. النشر: `POST /api/deposit/depositions/<id>/actions/publish`، وبعده لا يمكن حذف الملفات، وإنما إنشاء نسخة جديدة.

⚠️

لا تضع التوكن في السكربت ولا في مستودع Git، فمن يحصل عليه يستطيع أن ينشر باسمك. ضعه في متغير بيئة Environment Variable تقرؤه السكربتات، وجرب كل شيء على بيئة الاختبار قبل الموقع الحقيقي، لأن النشر في Zenodo لا رجوع عنه إلا بنسخة جديدة.

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

- `curl -s http://localhost:8080/api/info/version` يرجع `{"status":"OK","data":{"version":"6.12.1","build":null}}`.
- صفحة المجموعة `http://localhost:8080/dataverse/arabroot-lab` تعرض مجموعة البيانات المنشورة.
- الاستشهاد ينتهي بـ `V1` وبصمة UNF، وقائمة الملفات فيها `survey_shared.tab` بقيمة `tabularData` تساوي True.
- البحث عن «استبانة» يجد مجموعة البيانات.

![صفحة المجموعة مختبر بيانات البحث في Dataverse وفيها مجموعة بيانات واحدة منشورة مع الاستشهاد، وعلى الجانب فلاتر سنة النشر واسم المؤلف والموضوع والكلمات المفتاحية العربية](https://arabroot.io/content/images/2026/10/data-repositories-02-collection.webp)

المجموعة بعد النشر، والفلاتر الجانبية Facets تعمل بالكلمات المفتاحية العربية.

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

بيانات Dataverse في مكانين: قاعدة PostgreSQL للوصف والصلاحيات والنسخ، ومجلد الملفات `/dv/store` في الـ Volume. أما فهرس Solr فيمكن إعادة بنائه من القاعدة، لذلك لا تحتاج إلى نسخه.

```bash
docker compose exec -T postgres pg_dump -U dataverse -Fc dataverse > dataverse-$(date +%F).dump
docker run --rm -v dataverse-lab_dv-app:/dv -v "$PWD":/backup alpine:3.22 tar czf /backup/dv-store-$(date +%F).tar.gz -C /dv store
```

وبعد الاستعادة أعد بناء الفهرس بالأمر `curl http://localhost:8080/api/admin/index` من داخل الخادم، والسبب أن نتائج البحث تأتي من Solr وليس من القاعدة.

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

اقرأ ملاحظات الإصدار في [صفحة إصدارات Dataverse](https://github.com/IQSS/dataverse/releases/tag/v6.12.1?ref=arabroot.io) قبل أي تحديث، فبعض الإصدارات تطلب تحديث مخطط Solr أو إعادة الفهرسة أو خطوات يدوية. خذ نسخة احتياطية، وغير الوسم في الأسطر الأربعة من `gdcc/dataverse` و`gdcc/configbaker` إلى الإصدار الجديد، ثم `docker compose pull` و`docker compose up -d`، وراجع هل ما زال علاج SERIAL لازماً، فإذا أصلح الإصدار الجديد العطل فاحذف السطرين من `volumes`.

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

- **الصفحة ترجع 404 بعد عدة دقائق، وفي السجلات `syntax error at or near "SERIAL"`:** هو عطل EclipseLink الذي شرحناه، وعلاجه الكلاس والسطر في `persistence.xml`، ثم `docker compose down -v` وتشغيل جديد لأن القاعدة الأولى نصف منشأة.
- **`bootstrap` ينتهي قبل أن يعمل Dataverse:** زد قيمة `TIMEOUT`، فالتشغيل الأول على جهاز بأربع أنوية قد يأخذ أكثر من خمس دقائق.
- **رفض رفع ملف بعد ملف جدولي مباشرة:** انتظر حتى ينتهي الـ Ingest، وتأكد من عدم وجود أقفال بالأمر `/api/datasets/:persistentId/locks`.
- **البحث العربي يرجع نتائج غريبة أو كل شيء:** تأكد أن الكلمة وصلت بترميز UTF-8، وليس علامات استفهام.
- **الاستشهاد يذكر Root ناشراً:** غير اسم المجموعة الرئيسية إلى اسم جهتك.

## الخلاصة

- مستودع بيانات البحث للبيانات المجمدة المرتبطة ببحث مع DOI واستشهاد، وبوابة البيانات المفتوحة مثل CKAN للبيانات الحكومية المتجددة، والمستودع المؤسسي مثل DSpace للأبحاث والرسائل.
- Zenodo هو الحل الأنسب للباحث الفرد ببيانات مخفية الهوية، وDataverse للجامعة التي تريد مستودعاً تملكه وتبقي فيه البيانات الحساسة داخل المملكة.
- Dataverse 6.12.1 يحول الجداول ويصف المتغيرات ويعطي استشهاداً ببصمة UNF، لكن التثبيت الجديد يحتاج علاجاً لعطل EclipseLink حتى يصلح في إصدار قادم.
- البحث العربي في Dataverse يطابق الكلمة كما كتبت، فاكتب الكلمات المفتاحية بصيغها الشائعة ومعها الإنجليزية.

وفي المقال التالي بإذن الله سوف نستخدم معرف البيانات في تحليل كامل يعيد أي أحد تشغيله ويحصل على الأرقام نفسها:

[![](https://arabroot.io/content/images/2026/10/reproducible-research-cover-cover.webp)دليلالبحث القابل لإعادة الإنتاج Reproducibility مع Dockerكيف تحزم تحليلك بحيث يعيد أي أحد تشغيله فيحصل على أرقامك نفسها، مع تجربة حقيقية لأسباب اختلاف النتائج بين التشغيلات والأجهزة.](https://arabroot.io/articles/%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D8%A7%D9%84%D9%82%D8%A7%D8%A8%D9%84-%D9%84%D8%A7%D8%B9%D8%A7%D8%AF%D8%A9-%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D8%A7%D8%AC-%D9%85%D8%B9-jupyter-%D9%88-git-%D9%88-docker/)

## تدريب عملي

1. عدل ملف `dataset.json` وأضف كلمة «استبيان» و«الانترنت» إلى الكلمات المفتاحية، وأنشئ نسخة جديدة V2، ثم أعد تشغيل سكربت البحث ولاحظ ما تغير.
2. ارفع ملفاً ثالثاً مقيداً بالخيار `"restrict":"true"`، ثم افتح صفحة البيانات دون تسجيل الدخول وانظر كيف يظهر الملف المقيد وزر طلب الوصول.

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

- أكتوبر 2026: كتابة الدليل واختباره على Dataverse 6.12.1 (gdcc/dataverse:6.12.1-noble-r0) مع PostgreSQL 17.6 وSolr 9.8.0.