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

نظام المكتبة Koha: فهرسة MARC21 بالعربية والإعارة

كيف تثبت Koha من حزمه الرسمية بالعربية، وتفهرس كتباً عربية بـ MARC21 وتعيرها، وتصلح البحث العربي الذي لا يعمل في الإعداد الافتراضي.

نظام المكتبة Koha: فهرسة MARC21 بالعربية والإعارة

في كثير من المدارس والكليات ما زالت المكتبة تعمل بجدول Excel فيه عناوين الكتب، ودفتر يكتب فيه الموظف اسم الطالب وتاريخ الإرجاع، وهذا يكفي حتى يأتي يوم التخرج فيسأل قسم شؤون الطلاب «هل على هذا الطالب كتب لم يرجعها؟» فيبدأ البحث في الدفاتر. وفي مقال الأنظمة التي تحتاجها الجامعة ذكرنا أن المكتبة تحتاج نظاماً متكاملاً Integrated Library System واختصاراً ILS، يعرف الكتاب ونسخه والقارئ والإعارة، ويعطي شؤون الطلاب حالة إخلاء الطرف، وأشهر هذه الأنظمة المفتوحة المصدر هو Koha، وفي هذا المقال سوف نتناول:

  • مكونات Koha، وتثبيته من حزم Debian الرسمية كما يوصي دليله، في مختبر على Docker.
  • معالج التثبيت والإعداد الأولي، وتفعيل الواجهة العربية.
  • الفهرسة Cataloguing بمعيار MARC21 لكتب عربية، واستيرادها دفعة واحدة.
  • البحث بالعربية: الإعداد الافتراضي الذي يعيد كل الكتب لأي كلمة عربية، وكيف أصلحناه.
  • الإعارة Circulation والتجديد والإرجاع، ودرس عن مكتبة الموظف تعلمناه في التجربة، ثم النسخ الاحتياطي والتحديث.

ما الذي يتكون منه Koha؟

Koha تطبيق ويب مكتوب بلغة Perl، له واجهتان: الفهرس العام OPAC الذي يبحث فيه القارئ ويحجز ويرى إعاراته، وواجهة الموظفين Staff Interface التي فيها الفهرسة والإعارة والإدارة، والصورة التالية تبين ما خلفهما:

مخطط مكونات نسخة Koha واحدة: على اليمين من يستخدم النظام، القارئ والطالب على الفهرس العام OPAC بالمنفذ 80، وموظف المكتبة على واجهة الموظفين بالمنفذ 8080، وجهاز الإعارة الذاتية عبر SIP2، وفي الوسط سيرفر الويب Apache مع Plack وكود Koha بلغة Perl ونسخة باسم library أنشأها koha-create، وعلى اليسار خلف الواجهة قاعدة البيانات MariaDB للسجلات والقراء والإعارات، ومحرك البحث Zebra أو Elasticsearch لفهرسة سجلات MARC، والذاكرة المؤقتة Memcached، والمهام في الخلفية koha-worker
نسخة Koha واحدة: واجهتان على منفذين، وخلفهما قاعدة البيانات ومحرك البحث والذاكرة المؤقتة والمهام في الخلفية

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

  • النسخة Instance: السيرفر الواحد يشغل أكثر من مكتبة، ولكل مكتبة نسخة لها قاعدة بيانات وفهرس بحث ومستخدم Linux خاص بها، وكل أوامر الإدارة تأخذ اسم النسخة، ونحن سمينا نسختنا library.
  • محرك البحث: Koha يبحث في فهرس مستقل وليس في قاعدة البيانات، والافتراضي هو Zebra، ويمكن استخدام Elasticsearch بدلاً منه، وسوف نرى أن إعداد هذا الفهرس هو الذي يحدد هل يعمل البحث بالعربية أم لا.
  • Plack: خادم يبقي كود Perl محملاً في الذاكرة بدلاً من تشغيله من جديد مع كل طلب، والفرق في السرعة كبير، لذلك فعله دائماً.

المتطلبات

دليل التثبيت الرسمي يقول إن Koha يعمل على Linux مثل Debian وUbuntu، وإن طريقة تثبيته على السيرفر هي الحزم Packages، وإنه لا يوجد حتى الآن Docker Image جاهز للإنتاج، وإن تشغيله يحتاج معرفة بإدارة Linux وApache وMariaDB وخادم البريد. لذلك سوف نثبته من الحزم كما يطلب الدليل، وفي المختبر داخل Container من Debian 13 فقط لأننا نعمل على جهاز Windows، وعلى سيرفرك تنفذ الأوامر نفسها مباشرة.

  • الإصدار: Koha 26.05.04، وقد صدر في 1 أكتوبر 2026 مع 38 إصلاحاً، منها ستة إصلاحات أمنية، أحدها في المصادقة عبر REST API بكلمة المرور Basic Auth، وسوف نستخدمها بعد قليل. ويصدر Koha إصدارين رئيسيين في السنة، في مايو ونوفمبر، وهذا ما تراه في أسماء مستودعات الحزم مثل 25.05 و25.11 و26.05.
  • الذاكرة: في مختبرنا كانت النسخة كلها (MariaDB وApache وPlack وZebra وMemcached والمهام في الخلفية) تستخدم 1.67GB بعد تثبيت الواجهة العربية وتشغيل الإعارة، فابدأ بسيرفر فيه 4GB على الأقل.
  • النطاق: اسمان، واحد للفهرس العام مثل library.example.com وواحد للموظفين مثل library-intra.example.com، وهذا هو الشكل الافتراضي في إعداد الحزم.

التثبيت من حزم Debian

مستودع Koha والحزم

حزم Koha في مستودع المشروع وليس في مستودعات Debian، وفي قائمة المستودع مسار لكل إصدار رئيسي مثل 26.05، ومسار stable الذي يتحرك إلى الإصدار الجديد كلما صدر. والطريقة البسيطة هي stable، ولكن معناها أن الأمر apt upgrade العادي قد ينقلك إلى إصدار رئيسي جديد دون أن تخطط له، لذلك ثبتنا المسار على الإصدار نفسه:

sudo apt-get update
sudo apt-get install -y ca-certificates wget gnupg2 apache2 mariadb-server
wget -qO - https://debian.koha-community.org/koha/gpg.asc | sudo gpg --dearmor -o /usr/share/keyrings/koha-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/koha-keyring.gpg] https://debian.koha-community.org/koha 26.05 main' | sudo tee /etc/apt/sources.list.d/koha.list
sudo apt-get update
sudo apt-get install -y koha-common

والحزمة koha-common تسحب معها مئات الحزم من Perl وZebra وأدوات PDF، ففي مختبرنا ثبت بناء الـ Image كله 925 حزمة مع Apache وMariaDB، والحزمة koha-l10n التي فيها ملفات الترجمة جاءت معها. وفي المختبر وضعنا هذه الأوامر في Dockerfile فوق debian:trixie-20261005-slim، والإصدارات التي ثبتت: koha-common 26.05.04-1، وMariaDB 11.8.6، وPerl 5.40.1، وApache 2.4.69.

إنشاء نسخة المكتبة

الملف /etc/koha/koha-sites.conf فيه الإعدادات التي تأخذها كل نسخة جديدة، والافتراضي أن الواجهتين على المنفذ 80 وتختلفان بالاسم، فالفهرس على library.myDNSname.org والموظفون على library-intra.myDNSname.org. وفي المختبر لا يوجد نطاق، لذلك جعلنا واجهة الموظفين على المنفذ 8080، ثم أنشأنا النسخة:

sudo sed -i 's/^INTRAPORT="80"/INTRAPORT="8080"/' /etc/koha/koha-sites.conf
echo "Listen 8080" | sudo tee -a /etc/apache2/ports.conf
sudo a2enmod rewrite cgi headers proxy_http
sudo a2dissite 000-default
sudo koha-create --create-db library
sudo koha-plack --enable library
sudo koha-plack --start library
sudo systemctl reload apache2

والمخرج سوف يكون كما يلي، وهذه نهايته:

Koha instance is empty, no staff user created.
Restarting Apache httpd web server: apache2.
Starting Koha worker daemon for library (default)
Starting Koha worker daemon for library (long_tasks)
Starting Koha indexing daemon for library:.

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

  • النسخة فارغة ولا يوجد فيها موظف بعد، فأول دخول يكون بمستخدم قاعدة البيانات الذي أنشأه koha-create، واسمه koha_library، وكلمة مروره تقرؤها بالأمر sudo koha-passwd library.
  • بدأ koha-create عاملين Workers للمهام في الخلفية، ودائماً للفهرسة يأخذ كل تسجيلة جديدة إلى Zebra، فلا تحتاج إعادة الفهرسة يدوياً مع كل كتاب.

الواجهة العربية

sudo koha-translate --install ar-Arab
sudo koha-translate --list
ar-Arab

استغرق تثبيت الترجمة 77 ثانية في المختبر، لأن الأمر يبني قوالب الواجهتين كلها بالعربية، والقائمة koha-translate --list --available فيها أكثر من تسعين لغة.

ماذا يحدث إذا شغلته داخل Container؟

بعد أول تشغيل في المختبر أعادت الواجهتان الخطأ 500، وفي سجل Apache السطر التالي:

[mpm_itk:warn] [pid 975:tid 975] (itkmpm: pid=975 uid=33, gid=33) itk_post_perdir_config(): setgid(1000): Operation not permitted

والسبب أن حزم Koha تشغل Apache بالوحدة mpm-itk، وهي التي تجعل كل نسخة تعمل بمستخدم Linux خاص بها، فتحاول تغيير المستخدم مع كل طلب، وقيود الصلاحيات Capabilities داخل الـ Container تمنعها. والحل الذي جربناه هو إيقاف إدارة الصلاحيات في الوحدة:

echo "EnableCapabilities Off" | sudo tee /etc/apache2/conf-available/itk-docker.conf
sudo a2enconf itk-docker
sudo systemctl restart apache2

وتأكدنا منه بالتجربة في الاتجاهين: دون هذا الملف عادت واجهة الموظفين بالرمز 500 والخطأ نفسه في السجل، ومعه عادت بالرمز 302 إلى معالج التثبيت. وهذا خاص بالـ Container، فعلى سيرفر Debian عادي لا تحتاجه.

معالج التثبيت والإعداد الأولي

افتح واجهة الموظفين، فيحولك Koha إلى installer/install.pl، وادخل بالمستخدم koha_library، ثم اختر العربية، فتظهر بقية الخطوات بالعربية: التحقق من تبعيات Perl، وإعدادات قاعدة البيانات، وإنشاء الجداول، ثم اختيار شكل MARC:

معالج تثبيت Koha بالعربية في خطوة اختر شكل المارك الخاص بك، وعلى الجانب قائمة الخطوات من اختيار اللغة إلى بدء عملية الإعداد، وشرح أن مارك اختصار للفهرسة الآلية القابلة للقراءة وأن مارك21 يستخدم في أنحاء العالم ويونيمارك في بعض الدول الأوروبية، وخياران Marc21 وUnimarc
اختيار MARC21 أو UNIMARC في معالج التثبيت، وهو قرار لا يتغير بعد بدء الفهرسة

اختر MARC21، وهو المعيار الذي تستخدمه أغلب المكتبات، والذي يعرفه المفهرسون في الجامعات العربية، ولا تقم بتغييره بعد أن تبدأ الفهرسة، والسبب أن كل حقل في كل تسجيلة مبني عليه. ثم تظهر قائمة الإعدادات الافتراضية، وفيها جزء إلزامي (إطارات MARC21 وأنواع الاستناد) وجزء اختياري، وفي الاختياري بيانات تجريبية مثل مكتبات وفئات قراء. وفي المختبر اخترنا كل الاختياري، فظهرت عندنا 12 مكتبة تجريبية بأسماء مثل Centerville وFairfield، وفي الإنتاج لا تقم باختيار المكتبات والقراء التجريبيين، والسبب أن حذفها لاحقاً أصعب من إنشاء مكتبتك من البداية.

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

وبعد الإعداد ضبطنا بعض تفضيلات النظام System Preferences من سطر الأوامر بالأداة koha-preferences، وهي نفسها التي في صفحة الإدارة:

sudo koha-shell library -c "perl /usr/share/koha/bin/admin/koha-preferences set StaffInterfaceLanguages ar-Arab,en"
sudo koha-shell library -c "perl /usr/share/koha/bin/admin/koha-preferences set OPACLanguages ar-Arab,en"
sudo koha-shell library -c "perl /usr/share/koha/bin/admin/koha-preferences set OPACLanguagesDisplay 1"
sudo koha-shell library -c "perl /usr/share/koha/bin/admin/koha-preferences set RESTBasicAuth 1"

ولاحظ أن التفضيل القديم language لم يعد موجوداً، فالأمر معه انتهى برمز الخروج 2، وهو الرمز الذي تعيده الأداة عندما لا يوجد التفضيل، واسمه الحالي StaffInterfaceLanguages. وأما RESTBasicAuth فيسمح باستدعاء REST API باسم المستخدم وكلمة المرور، وقد استخدمناه في المختبر لإنشاء المكتبة والقراء والإعارات، وفي الإنتاج استخدم حساباً مخصصاً للتكامل بصلاحيات محدودة، وتأكد أنك على 26.05.04 أو أحدث، لأن هذا الإصدار أغلق ثغرة كانت تسمح بتجاوز قفل الحساب عبر هذه الطريقة.

ثم أنشأنا مكتبتنا «المكتبة المركزية» برمز MAIN عبر REST API:

printf '%s' '{"library_id":"MAIN","name":"المكتبة المركزية","pickup_location":true,"public":true}' > lib.json
curl -s -u 'libadmin:Lab-Koha-2026!x' -H 'Content-Type: application/json' -X POST http://127.0.0.1:30181/api/v1/libraries --data-binary @lib.json
💡
أرسل JSON الذي فيه نص عربي من ملف بالخيار --data-binary @file ولا تكتبه في سطر الأمر، فعندما كتبناه مباشرة في Git Bash على Windows وصل الاسم إلى Koha علامات استفهام «??????? ????????»، لأن السطر مر بترميز Windows قبل أن يصل إلى curl.

الفهرسة بـ MARC21

معيار MARC21 للبيانات الببليوغرافية يصف الكتاب في حقول مرقمة: 100 للمؤلف، و245 للعنوان، و650 للموضوع، و041 للغة، وغيرها، ولكل حقل حقول فرعية بحروف مثل $a و$c. والفكرة الأهم في Koha أن العمل يفهرس مرة واحدة، وأن كل نسخة على الرف لها سجل نسخة Item مستقل في الحقل 952 بباركود ومكتبة ورقم طلب Call Number، والإعارة تكون للنسخة وليس للعنوان، والصورة التالية تبين ذلك:

مخطط من جزأين: على اليمين التسجيلة الببليوغرافية وفيها الحقل 100 المؤلف ابن خلدون عبد الرحمن بن محمد، و245 العنوان مقدمة ابن خلدون، و650 الموضوع التاريخ وعلم الاجتماع، و041 اللغة ara، و942 نوع المادة كتاب BK، وتحتها النسخ في الحقل 952 نسختان بباركود LIB-0001 وLIB-0002 في المكتبة MAIN ورقم الطلب 901، وعلى اليسار الإعارة: القارئ برقم بطاقته وفئته، ثم مسح باركود النسخة، ثم قاعدة الإعارة من المكتبة وفئة القارئ ونوع المادة تحدد مدة الإعارة وتاريخ الإرجاع، ثم الإرجاع أو التأخير
تسجيلة واحدة للعمل، ونسخ لها باركود، وقاعدة إعارة تجمع المكتبة وفئة القارئ ونوع المادة

استيراد كتب عربية دفعة واحدة

الطريقة البسيطة أن يفهرس الموظف كل كتاب من محرر MARC في الواجهة، وهذا مناسب لكتاب أو كتابين في اليوم، ولكن المكتبة التي تنتقل من Excel أو من نظام قديم عندها آلاف الكتب، لذلك تحول البيانات إلى ملف MARCXML وتستورده. وهذا جزء من الملف الذي استوردناه، وفيه «مقدمة ابن خلدون» بنسختين:

<record>
  <leader>00000nam a22000007a 4500</leader>
  <controlfield tag="008">261021s2026    xx            000 0 ara d</controlfield>
  <datafield tag="041" ind1="0" ind2=" "><subfield code="a">ara</subfield></datafield>
  <datafield tag="100" ind1="0" ind2=" "><subfield code="a">ابن خلدون، عبد الرحمن بن محمد،</subfield><subfield code="d">1332-1406</subfield></datafield>
  <datafield tag="245" ind1="1" ind2="0"><subfield code="a">مقدمة ابن خلدون /</subfield><subfield code="c">عبد الرحمن بن خلدون</subfield></datafield>
  <datafield tag="650" ind1=" " ind2="4"><subfield code="a">التاريخ</subfield><subfield code="x">فلسفة</subfield></datafield>
  <datafield tag="650" ind1=" " ind2="4"><subfield code="a">علم الاجتماع</subfield></datafield>
  <datafield tag="942" ind1=" " ind2=" "><subfield code="c">BK</subfield></datafield>
  <datafield tag="952" ind1=" " ind2=" "><subfield code="a">MAIN</subfield><subfield code="b">MAIN</subfield><subfield code="y">BK</subfield><subfield code="o">901 خ ل م</subfield><subfield code="p">LIB-0001</subfield></datafield>
  <datafield tag="952" ind1=" " ind2=" "><subfield code="a">MAIN</subfield><subfield code="b">MAIN</subfield><subfield code="y">BK</subfield><subfield code="o">901 خ ل م</subfield><subfield code="p">LIB-0002</subfield></datafield>
</record>

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

  • الموقع 35 إلى 37 في الحقل 008 هو رمز اللغة ara، ومنه تأخذ الواجهة «اللغة: العربية» وفلتر اللغة في البحث، والحقل 041 يكرره.
  • في الحقل 952 الحرف a هو المكتبة المالكة Home Library، وb المكتبة الحالية Holding Library، وy نوع المادة، وo رقم الطلب، وp الباركود، وهذه رموز Koha وليست من MARC21 نفسه.
  • المؤشر الثاني 4 في الحقل 650 يعني أن مصدر رأس الموضوع غير محدد، والمكتبة الجامعية تستخدم قائمة رؤوس موضوعات معتمدة وتكتب مصدرها، وهذا قرار المفهرسين وليس قرار النظام.
  • لم نكتب في الملف بيانات الناشر وسنة الطبعة، لأنها تأتي من النسخة التي بين يديك، وفي التسجيلة الحقيقية تكتب في الحقل 264.

ثم استوردنا الملف بأداة bulkmarcimport.pl:

sudo koha-shell library -c "perl /usr/share/koha/bin/migration_tools/bulkmarcimport.pl -b -m MARCXML -file /tmp/books.xml -v"
Characteristic MARC flavour: MARC21
...
3 MARC records done in 3.36926817893982 seconds

ثلاث تسجيلات وأربع نسخ، وتأكدنا من النسخ عبر REST API:

1 1 LIB-0001 MAIN 901 خ ل م BK
2 1 LIB-0002 MAIN 901 خ ل م BK
3 2 LIB-0003 MAIN 928 ح س ي BK
4 3 LIB-0004 MAIN 892.7 ق ف ع BK

والصورة التالية لمحرر MARC في واجهة الموظفين وهو يفتح التسجيلة نفسها، والحقل 008 فيه ara في مكانه:

محرر الفهرسة في واجهة موظفي Koha بالعربية بعنوان تحرير مقدمة ابن خلدون عبد الرحمن بن خلدون رقم التسجيلة 1، وأزرار الأقسام من 0 إلى 9، والقسم 0 مفتوح وفيه الحقول 000 الفاتح و001 رقم التحكم و003 و005 تاريخ ووقت أحدث معاملة و006 و007 و008 عناصر بيانات ذات طول ثابت وقيمته فيها ara، و010 رقم تحكم مكتبة الكونجرس، وبجانب الحقول الإلزامية كلمة مطلوب، وزر حفظ واستيراد التسجيلة عبر Z39.50/SRU
محرر MARC بالعربية: أرقام الحقول كما هي، وأسماؤها مترجمة، وZ39.50 لاستيراد تسجيلة من مكتبة أخرى

ولاحظ زر «استيراد التسجيلة عبر Z39.50/SRU» في المحرر، وهو يجلب التسجيلة من فهرس مكتبة أخرى بدلاً من كتابتها من الصفر، وهو أسرع طريقة لفهرسة كتاب مشهور، ولكنه يحتاج إضافة خوادم Z39.50 من الإدارة، ولم نجربه في المختبر.

البحث بالعربية: المشكلة والحل

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

زززز => بحثك 3 نتيجة
خلدون => بحثك 3 نتيجة
1332 => تسجيلة واحدة biblionumber=1

أي أن البحث بالأرقام والحروف اللاتينية يعمل، وأي كلمة عربية تطابق كل التسجيلات. والسبب في إعداد Zebra الافتراضي، فالفهرس w في الملف /etc/koha/zebradb/etc/default.idx يستخدم جدول الحروف word-phrase-utf.chr، وهذا الجدول يعرف الحروف اللاتينية واليونانية فقط:

lowercase {0-9}{a-z}αβγδεζηθικλμνξοπρστυφχψω
uppercase {0-9}{A-Z}ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ

وفي الملف نفسه الخيار alwaysmatches 1 للفهرس w، ونتيجة التجربة تتفق مع أن الكلمة العربية تسقط حروفها فتطابق كل شيء. وتصور مكتبة فيها عشرون ألف كتاب عربي يبحث فيها الطالب عن عنوان فتعطيه عشرين ألف نتيجة، فيظن أن البحث لا يعمل، وهو محق.

والحل أن يستخدم Zebra مكتبة ICU في تقسيم الكلمات، وKoha يأتي بملفات ICU جاهزة هي words-icu.xml وphrases-icu.xml، ولكنها غير مفعلة. ومسار الإعداد للنسخة يبدأ بالمجلد /etc/koha/sites/library، فإذا وضعت فيه نسخة معدلة من default.idx قرأها Zebra قبل الملف العام:

cd /etc/koha/sites/library
sudo cp /etc/koha/zebradb/etc/default.idx .
sudo sed -i '0,/charmap word-phrase-utf.chr/s//icuchain words-icu.xml/' default.idx
sudo sed -i '0,/charmap word-phrase-utf.chr/s//icuchain phrases-icu.xml/' default.idx
grep -n "icuchain" default.idx
13:icuchain words-icu.xml
21:icuchain phrases-icu.xml

ثم أعد بناء الفهرس كاملاً، وأعد تشغيل Zebra بعده:

sudo koha-rebuild-zebra -b -f -v library
sudo koha-zebra --restart library

ولاحظ ترتيب الأمرين، ففي إحدى المحاولات أعدنا البناء ولم نعد تشغيل Zebra، فأعاد البحث «لم يتم العثور على اي نتيجة» لكل كلمة حتى للرقم 1332، ولما أعدنا تشغيله ظهرت النتائج. وبعد ICU كانت النتائج كما يلي:

كلمة البحثZebra الافتراضيبعد ICUبعد ICU مع تطبيع ة وى
زززز3 نتائجلا نتائجلا نتائج
خلدون3 نتائجمقدمة ابن خلدونمقدمة ابن خلدون
إبن خلدون (بهمزة)3 نتائجمقدمة ابن خلدونمقدمة ابن خلدون
الايام (دون همزة)3 نتائجالأيامالأيام
مقدمه (بالهاء)3 نتائجلا نتائجمقدمة ابن خلدون
كليله (بالهاء)لم نجربهالم نجربهاكليلة ودمنة
اجتماع (دون ال)3 نتائجلا نتائجلم نجربها

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

  • الهمزة عولجت مع ICU دون أي إضافة، لأن سلسلة words-icu.xml تفكك الحروف NFD ثم تحذف العلامات غير المتباعدة Nonspacing Marks، والهمزة فوق الألف وتحتها منها، فتصبح «أ» و«إ» ألفاً.
  • التاء المربوطة والهاء لم تعالجا، فالطالب الذي يكتب «مقدمه» لا يجد الكتاب، لذلك أضفنا قاعدة تحويل في نسخة النسخة من الملفين، بعد سطر NFC.
  • أداة التعريف «ال» لم تعالج، فكلمة «اجتماع» لا تجد «الاجتماع»، وهذا يحتاج تجذيعاً Stemming للعربية لا يوفره هذا الإعداد، فعلم الطلاب البحث بالكلمة كما في العنوان أو استخدم البحث بالبداية Truncation.

وهذه قاعدة التحويل التي أضفناها إلى نسختي words-icu.xml وphrases-icu.xml في مجلد النسخة:

cd /etc/koha/sites/library
for f in words-icu.xml phrases-icu.xml; do
  sudo cp /etc/koha/zebradb/etc/$f .
  sudo sed -i 's|<transform rule="NFC"/>|<transform rule="NFC"/>\n  <transliterate rule="ة > ه ; ى > ي ;"/>|' $f
done
sudo koha-rebuild-zebra -b -f library
sudo koha-zebra --restart library

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

صفحة تفاصيل مقدمة ابن خلدون في الفهرس العام لـ Koha بالعربية: العنوان والمؤلف ابن خلدون عبد الرحمن بن محمد 1332-1406، ونوع المادة نص، واللغة العربية، والموضوع التاريخ فلسفة وعلم الاجتماع، وجدول المقتنيات فيه نسختان: الأولى في Centerville بحالة معارة وتاريخ الاستحقاق 12/03/2026، والثانية في المكتبة المركزية بحالة متاح، ورقم الطلب 901 خ ل م لكل منهما
الفهرس العام بالعربية: نسخة معارة ونسخة متاحة، ولاحظ أن النسخة المعارة تظهر في مكتبة أخرى كما في القسم التالي

الإعارة والتجديد والإرجاع

أنشأنا قارئين من فئة الطلاب في المكتبة المركزية، ثم أعرنا النسخة LIB-0001 للطالب «خالد» عبر REST API:

printf '{"item_id":1,"patron_id":2,"library_id":"MAIN"}' > co.json
curl -s -u 'libadmin:Lab-Koha-2026!x' -H 'Content-Type: application/json' -X POST http://127.0.0.1:30181/api/v1/checkouts --data-binary @co.json
{"checkout_date":"2026-10-22T01:02:54+00:00","checkout_id":1,"due_date":"2026-11-05T23:59:00+00:00","item_id":1,"library_id":"CPL","patron_id":2,"renewals_count":0, ...}

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

  • تاريخ الإرجاع بعد 14 يوماً بالضبط، من قاعدة الإعارة التي أنشأناها في الإعداد الأولي.
  • الإعارة سجلت في المكتبة CPL وليس MAIN التي أرسلناها، لأن Koha يسجل الإعارة في مكتبة الموظف الذي نفذها، وحساب المدير أنشأناه في مكتبة تجريبية، وسوف نرى نتيجة ذلك عند الإرجاع.

ثم جربنا ما يحدث إذا حاولت الطالبة «ريم» استعارة النسخة نفسها، فرفض Koha بالرسالة {"error":"Confirmation error"}، وطلب فحص التوفر checkouts/availability بين السبب:

{"blockers":{},"confirms":{"ISSUED_TO_ANOTHER":1,"issued_cardnumber":"STU-1001","issued_firstname":"خالد","issued_surname":"الطالب"},"warnings":{}}

أي أن النسخة معارة لقارئ آخر، وهذا تأكيد Confirmation وليس منعاً Blocker، فالموظف يستطيع تجاوزه بإرجاع النسخة على حساب الأول وإعارتها للثانية في خطوة واحدة، ولذلك تحتاج الواجهة من الموظف أن يؤكد. ثم جددنا إعارة «خالد» ثلاث مرات:

renewal 1: "due_date":"2026-11-19T23:59:00+00:00","renewals_count":1
renewal 2: "due_date":"2026-12-03T23:59:00+00:00"
renewal 3: {"error":"Renewal not authorized (too_many)"}

كل تجديد أضاف 14 يوماً، والثالث رفض لأن القاعدة تسمح بتجديدين. ولم نجد في REST API لهذا الإصدار طريقاً للإرجاع، فطرق الإعارة فيه هي الإعارة والتجديد وفحص التوفر، لذلك أرجعنا النسخة من صفحة «رد» في واجهة الموظفين بمسح الباركود:

صفحة رد المواد في واجهة موظفي Koha بالعربية، وفوقها نافذة بعنوان يرجى إعادة هذه المادة إلى المكتبة المركزية، وفيها LIB-0001 مقدمة ابن خلدون، وسبب النقل العودة إلى المكتبة الرئيسية، وزرا موافق وطباعة الكعب، وتحتها جدول المواد التي تم ردها وفيه تاريخ الاستحقاق 12/03/2026 والمكتبة الرئيسية المكتبة المركزية ونقل إلى المكتبة المركزية والمستفيد الطالب خالد STU-1001
عند الإرجاع طلب Koha نقل النسخة إلى «المكتبة المركزية»، لأن الموظف مسجل في مكتبة أخرى

وهذا هو الدرس: الموظف مسجل في مكتبة تجريبية، فاعتبر Koha أن الكتاب رجع إلى مكتبة أخرى، فأنشأ طلب نقل Transfer إلى مكتبته الرئيسية، وظهرت النسخة في الفهرس العام في «Centerville» طوال الإعارة. وفي مكتبة جامعية لها فروع هذا السلوك صحيح ومفيد، ولكنه يربك المكتبة ذات الفرع الواحد إذا أنشأت حسابات الموظفين في مكتبة خاطئة، لذلك اجعل مكتبة كل موظف مكتبته الحقيقية، واستخدم «اضبط المكتبة» في الواجهة عندما يعمل الموظف في فرع آخر.

وأما الإعارة الذاتية فأجهزتها تتصل بـ Koha عبر بروتوكول SIP2، وتفعله للنسخة بالأمر koha-enable-sip، ولم نجربه في المختبر لأنه يحتاج جهازاً أو محاكياً، وفي Koha أداة اختبار له هي sip_cli_emulator.pl.

البريد والمهام المجدولة

التذكير بموعد الإرجاع وإشعار التأخير والغرامات كلها مهام مجدولة Cron Jobs، والحزمة تضع ملفاً في /etc/cron.daily/koha-common يشغلها لكل النسخ، وهذه بعض أسطره من المختبر:

koha-run-backups --days 2 --output /var/spool/koha
koha-foreach --chdir --enabled /usr/share/koha/bin/cronjobs/fines.pl
koha-foreach --chdir --enabled --email /usr/share/koha/bin/cronjobs/overdue_notices.pl -t
koha-foreach --chdir --enabled --email /usr/share/koha/bin/cronjobs/advance_notices.pl -c

لاحظ الخيار --email، فهذه المهام لا ترسل بريداً إلا للنسخ التي فعلت فيها البريد بالأمر koha-email-enable library، وهو غير مفعل بعد koha-create، والسبب أن نسخة جديدة فيها بيانات تجريبية قد ترسل إشعارات لعناوين حقيقية. فعله بعد أن تضبط خادم SMTP كما في البريد التفاعلي Transactional Email، وراجع قائمة المهام في دليل المهام المجدولة. وفي الـ Container لا يعمل Cron، فلم تعمل هذه المهام في المختبر.

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

على السيرفر الحقيقي اترك المنفذين على 80 كما في الإعداد الافتراضي، واكتب نطاقك في DOMAIN داخل koha-sites.conf قبل koha-create، فيصبح الفهرس library.example.com وواجهة الموظفين library-intra.example.com، ثم ضع أمامهما Reverse Proxy بشهادة HTTPS كما في تثبيت Caddy أو Nginx Proxy Manager. ولا تقم بنشر واجهة الموظفين على الإنترنت إذا كان الموظفون يعملون من داخل الجامعة فقط، والسبب أن فيها بيانات القراء كلها. وهذا القسم لم نختبره في المختبر المحلي، لأنه يحتاج نطاقاً وشهادة حقيقية.

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

  • الأمر sudo koha-list يظهر النسخة، والواجهتان تفتحان دون خطأ 500.
  • البحث عن كلمة عربية لا وجود لها في الفهرس يعيد «لم يتم العثور على اي نتيجة»، وليس كل الكتب.
  • البحث بالهمزة ودونها، وبالتاء المربوطة والهاء، يجد الكتاب نفسه.
  • إعارة تجريبية تأخذ تاريخ الإرجاع الصحيح، والإرجاع لا يطلب نقلاً إلى مكتبة أخرى.
  • بريد تجريبي من إشعارات Koha يصل إلى صندوق خارجي بعد تفعيل البريد.

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

الأمر koha-dump يأخذ قاعدة البيانات في ملف، والإعدادات ومجلد النسخة في ملف آخر:

sudo koha-dump library
ls -la /var/spool/koha/library/
Dumping Koha site library:
* DB to /var/spool/koha/library/library-2026-10-22.sql.gz
* configs, logs to /var/spool/koha/library/library-2026-10-22.tar.gz
Done.
-rw-r----- 1 root library-koha 777326 Oct 22 01:06 library-2026-10-22.sql.gz
-rw-r----- 1 root library-koha  51301 Oct 22 01:06 library-2026-10-22.tar.gz

وفي ملف الإعدادات وجدنا ملفات ICU التي أضفناها في مجلد النسخة، مع koha-conf.xml وإعداد Apache، وهذا مهم لأنك إذا استعدت قاعدة البيانات دون هذه الملفات عاد البحث العربي إلى المشكلة الأولى. والاستعادة على سيرفر جديد بالأمر koha-restore مع الملفين، ثم إعادة بناء فهرس Zebra. والمهمة اليومية koha-run-backups --days 2 تأخذ هذه النسخة كل يوم وتحتفظ بآخر يومين، وهذا يحميك من خطأ اليوم، ولا يحميك من تلف القرص، فانقل الملفات خارج السيرفر كما في النسخ الاحتياطي بقاعدة 3-2-1 واختبار الاستعادة.

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

  1. خذ نسخة بالأمر koha-dump، وانسخ مجلد /etc/koha/sites.
  2. للإصدار الفرعي داخل 26.05: sudo apt-get update ثم sudo apt-get install koha-common، والحزمة تشغل koha-upgrade-schema لكل النسخ.
  3. للإصدار الرئيسي التالي: غير 26.05 في /etc/apt/sources.list.d/koha.list إلى الإصدار الجديد، وجرب ذلك على نسخة من السيرفر أولاً.
  4. بعد التحديث تأكد أن ملفات ICU في مجلد النسخة ما زالت موجودة، وجرب البحث العربي من جديد.

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

العرضالسببالحل
أي كلمة عربية تعيد كل الكتبZebra دون ICU لا يعرف الحروف العربيةICU في default.idx للنسخة، ثم إعادة الفهرسة وإعادة تشغيل Zebra
لا نتائج لأي بحث بعد إعادة الفهرسةZebra لم يعد تشغيله بعد البناءkoha-zebra --restart library
خطأ 500 وsetgid(1000): Operation not permittedmpm-itk داخل ContainerEnableCapabilities Off، وهذا في الـ Container فقط
الإرجاع يطلب نقل الكتاب إلى مكتبة أخرىمكتبة الموظف غير مكتبة النسخةصحح مكتبة الموظف، أو «اضبط المكتبة» في الواجهة
أسماء عربية تصل علامات استفهام عبر APIنص عربي في سطر الأمر على Windowsأرسل JSON من ملف بالخيار --data-binary
لا تصل إشعارات التأخيرالبريد غير مفعل للنسخة، أو Cron لا يعملkoha-email-enable، وتأكد من خدمة Cron

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

docker rm -f edu4-koha
docker image rm edu4-koha:26.05

الـ Image الذي بنيناه كان 3.36GB، أغلبها حزم Perl وأدوات Koha.

تدريب عملي

  • أضف قاعدة إعارة لفئة أعضاء هيئة التدريس بمدة 30 يوماً، ثم أعر نسخة لعضو هيئة تدريس وقارن تاريخ الإرجاع بتاريخ الطالب.
  • جرب البحث بالبداية بكتابة «اجتماع*» في البحث المتقدم، وقارن النتيجة بالجدول أعلاه.

الخلاصة

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

  • Koha يثبت من حزم Debian الرسمية، وثبت مستودع الحزم على الإصدار الرئيسي مثل 26.05 حتى لا تنتقل إلى إصدار جديد دون تخطيط.
  • الواجهتان بالعربية بعد koha-translate --install ar-Arab، والنسخة كلها استخدمت 1.67GB من الذاكرة في المختبر.
  • العمل يفهرس مرة واحدة بـ MARC21، وكل نسخة لها باركود في الحقل 952، والاستيراد بـ bulkmarcimport.pl أسرع طريق للانتقال من Excel.
  • البحث العربي في Zebra لا يعمل في الإعداد الافتراضي، ومع ICU يعالج الهمزة، وبقاعدة تحويل يعالج التاء المربوطة، ولا يعالج «ال».
  • الإعارة والتجديد يتبعان قاعدة الإعارة، ومكتبة الموظف تحدد مكان الإعارة والإرجاع، فاضبطها من البداية.
  • koha-dump يأخذ قاعدة البيانات والإعدادات معاً، والإعدادات فيها ملفات ICU التي يعتمد عليها البحث العربي.

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

  • أكتوبر 2026: كتابة الدليل وتجربته على Koha 26.05.04 من حزم Debian الرسمية فوق Debian 13 مع MariaDB 11.8.6.
Could not load content
نشرة عرب رووت | ArabRoot

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

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

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

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