في كثير من المدارس والكليات ما زالت المكتبة تعمل بجدول Excel فيه عناوين الكتب، ودفتر يكتب فيه الموظف اسم الطالب وتاريخ الإرجاع، وهذا يكفي حتى يأتي يوم التخرج فيسأل قسم شؤون الطلاب «هل على هذا الطالب كتب لم يرجعها؟» فيبدأ البحث في الدفاتر. وفي مقال الأنظمة التي تحتاجها الجامعة ذكرنا أن المكتبة تحتاج نظاماً متكاملاً Integrated Library System واختصاراً ILS، يعرف الكتاب ونسخه والقارئ والإعارة، ويعطي شؤون الطلاب حالة إخلاء الطرف، وأشهر هذه الأنظمة المفتوحة المصدر هو Koha، وفي هذا المقال سوف نتناول:
- مكونات Koha، وتثبيته من حزم Debian الرسمية كما يوصي دليله، في مختبر على Docker.
- معالج التثبيت والإعداد الأولي، وتفعيل الواجهة العربية.
- الفهرسة Cataloguing بمعيار MARC21 لكتب عربية، واستيرادها دفعة واحدة.
- البحث بالعربية: الإعداد الافتراضي الذي يعيد كل الكتب لأي كلمة عربية، وكيف أصلحناه.
- الإعارة Circulation والتجديد والإرجاع، ودرس عن مكتبة الموظف تعلمناه في التجربة، ثم النسخ الاحتياطي والتحديث.
ما الذي يتكون منه Koha؟
Koha تطبيق ويب مكتوب بلغة Perl، له واجهتان: الفهرس العام OPAC الذي يبحث فيه القارئ ويحجز ويرى إعاراته، وواجهة الموظفين Staff Interface التي فيها الفهرسة والإعارة والإدارة، والصورة التالية تبين ما خلفهما:

في المخطط أعلاه لاحظ التالي:
- النسخة 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 --listar-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:

اختر 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--data-binary @file ولا تكتبه في سطر الأمر، فعندما كتبناه مباشرة في Git Bash على Windows وصل الاسم إلى Koha علامات استفهام «??????? ????????»، لأن السطر مر بترميز Windows قبل أن يصل إلى curl.الفهرسة بـ MARC21
معيار MARC21 للبيانات الببليوغرافية يصف الكتاب في حقول مرقمة: 100 للمؤلف، و245 للعنوان، و650 للموضوع، و041 للغة، وغيرها، ولكل حقل حقول فرعية بحروف مثل $a و$c. والفكرة الأهم في Koha أن العمل يفهرس مرة واحدة، وأن كل نسخة على الرف لها سجل نسخة Item مستقل في الحقل 952 بباركود ومكتبة ورقم طلب Call Number، والإعارة تكون للنسخة وليس للعنوان، والصورة التالية تبين ذلك:

استيراد كتب عربية دفعة واحدة
الطريقة البسيطة أن يفهرس الموظف كل كتاب من محرر 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 في مكانه:

ولاحظ زر «استيراد التسجيلة عبر 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.idx13: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والقاعدة تطبق على الفهرس وعلى كلمة البحث معاً، فالعنوان المكتوب «مقدمة» يحفظ «مقدمه»، ويبحث الطالب بأي الشكلين فيجده. ولا تقم بإضافة قواعد أكثر من ذلك دون اختبار على بياناتك، والسبب أن كل قاعدة تطابق كلمات مختلفة المعنى، فتحويل الألف المقصورة إلى ياء يجعل «على» و«علي» كلمة واحدة في البحث.

الإعارة والتجديد والإرجاع
أنشأنا قارئين من فئة الطلاب في المكتبة المركزية، ثم أعرنا النسخة 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 أن الكتاب رجع إلى مكتبة أخرى، فأنشأ طلب نقل 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 واختبار الاستعادة.
التحديث إلى إصدار أحدث
- خذ نسخة بالأمر
koha-dump، وانسخ مجلد/etc/koha/sites. - للإصدار الفرعي داخل 26.05:
sudo apt-get updateثمsudo apt-get install koha-common، والحزمة تشغلkoha-upgrade-schemaلكل النسخ. - للإصدار الرئيسي التالي: غير
26.05في/etc/apt/sources.list.d/koha.listإلى الإصدار الجديد، وجرب ذلك على نسخة من السيرفر أولاً. - بعد التحديث تأكد أن ملفات ICU في مجلد النسخة ما زالت موجودة، وجرب البحث العربي من جديد.
مشكلات شائعة وحلولها
| العرض | السبب | الحل |
|---|---|---|
| أي كلمة عربية تعيد كل الكتب | Zebra دون ICU لا يعرف الحروف العربية | ICU في default.idx للنسخة، ثم إعادة الفهرسة وإعادة تشغيل Zebra |
| لا نتائج لأي بحث بعد إعادة الفهرسة | Zebra لم يعد تشغيله بعد البناء | koha-zebra --restart library |
خطأ 500 وsetgid(1000): Operation not permitted | mpm-itk داخل Container | EnableCapabilities 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.