مركز تدريب يقدم الدورة نفسها كل شهر لمجموعة جديدة من المتدربين، أو مدرسة صغيرة تريد منصة يفهمها المعلم في أول ساعة، هؤلاء لا يحتاجون كل ما في Moodle من إعدادات، ولا خدمات Open edX التي تستهلك 5GB من الذاكرة وهي خاملة، وفي مقال أنظمة إدارة التعلم LMS ذكرنا أن Chamilo هو الخيار الخفيف بين الأنظمة المفتوحة. وفي هذا المقال سوف نتناول:
- ما هو Chamilo، وما فكرة الدورات التدريبية Sessions التي تميزه.
- تثبيت Chamilo 3.0.1 على Docker بأربعة أعطال حقيقية ظهرت لنا وكيف حللناها.
- مقرر ومستخدمون من ملف CSV، واختبار يحله متدرب، ودورة تدريبية تجمع المقرر بمتدربيه.
- العربية في الواجهة، والموارد، والنسخ الاحتياطي، ومتى يناسب مدرستك أو مركز التدريب.
ما هو Chamilo؟
Chamilo نظام إدارة تعلم LMS مكتوب بلغة PHP، وملف المشروع يقول إنه منشور بترخيص GNU/GPLv3+ وإن أكثر من 40 مليون شخص استخدموه منذ 2010، وتحت الواجهة يقوم الإصدار الجديد على إطار Symfony مع واجهات Vue. ويعمل المشروع على فرعين في الوقت نفسه، وفيما يلي آخر إصداراتهما من صفحة الإصدارات:
| الإصدار | التاريخ | ملاحظة |
|---|---|---|
| 1.11.40 | 24 يونيو 2026 | الفرع القديم، ما زالت تصدر له تحديثات |
| 2.0.0 | 14 أبريل 2026 | أول إصدار من الجيل الجديد |
| 3.0.0 | 9 سبتمبر 2026 | ميزات ذكاء اصطناعي وغرف وفروع للتدريب الحضوري |
| 3.0.1 | 19 سبتمبر 2026 | إصلاح أمني يطلب الفريق التحديث إليه من 2.x و3.0.0 |
والذي يميز Chamilo عن غيره فكرة الدورة التدريبية Session، فالمقرر Course هو المحتوى: المستندات ومسار التعلم Learning Path والاختبارات، والدورة هي تشغيل لهذا المقرر لمجموعة محددة من المتدربين بتواريخ ومدرب Coach خاص بها، فتكتب المحتوى مرة واحدة وتعيد استخدامه كل شهر دون نسخه، وكل دفعة لها نتائجها المنفصلة. والصورة التالية تبين الفكرة:

وهذا بالضبط ما يحتاجه مركز التدريب، وفي Moodle تصل إلى شيء قريب بنسخ المقرر لكل دفعة أو بالمجموعات Groups، ولكن Chamilo جعلها مفهوماً أساسياً في لوحة الإدارة.
المتطلبات Requirements
ملف المشروع للإصدار 3.0.1 يذكر المتطلبات التالية:
- العتاد: معالجان vCPU و4GB من الذاكرة و4GB من القرص، ويذكر أنه جرب على آلة افتراضية بمعالجين و2GB وعمل، وأن الفريق لم يجر اختبار أحمال Load Testing بعد لمعرفة عدد المستخدمين المتزامنين.
- PHP: الإصدار 8.3 أو 8.4 أو 8.5، مع الإضافات apcu وbcmath وcurl وgd وintl وldap وmbstring وmysql وsoap وxml وzip.
- قاعدة البيانات Database: MariaDB 10 أو أحدث، أو MySQL 5.7 أو أحدث، ولا يدعم PostgreSQL.
- النطاق: نطاق أو نطاق فرعي Subdomain مستقل، وليس مجلداً فرعياً داخل موقع فيه تطبيق آخر.
ولاحظ أن العدد الذي ذكره الفريق عن المستخدمين المتزامنين مفقود، لذلك إذا كانت لديك دفعات كبيرة تدخل اختباراً في الوقت نفسه فقس بنفسك كما شرحنا في اختبار الأحمال والضغط.
التثبيت على Docker
لا يوجد Docker Image رسمي حديث لـ Chamilo، والطريقة التي في ملف المشروع هي Apache وPHP على سيرفر Ubuntu، لذلك سوف نبني Docker Image صغيراً فوق ال Image الرسمي لـ PHP مع Apache، ونضع معه MariaDB، وهي الخطوات نفسها التي في ملف المشروع ولكن داخل Containers.
ملفات المختبر
أولاً الملف Dockerfile، وفيه إضافات PHP التي يطلبها Chamilo:
FROM php:8.4.26-apache-trixie
RUN apt-get update \
&& apt-get install -y --no-install-recommends libicu-dev libzip-dev libpng-dev libjpeg62-turbo-dev \
libfreetype6-dev libxml2-dev libldap2-dev unzip \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j"$(nproc)" bcmath gd intl mysqli pdo_mysql soap zip opcache exif ldap \
&& pecl install apcu \
&& docker-php-ext-enable apcu \
&& a2enmod rewrite headers expires \
&& rm -rf /var/lib/apt/lists/*
RUN cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY chamilo.conf /etc/apache2/sites-available/000-default.confثم ملف الموقع chamilo.conf، وهو منقول من الملف public/main/install/apache.dist.conf الذي يأتي مع Chamilo، مع تغيير واحد في memory_limit سوف نشرح سببه:
<VirtualHost *:80>
ServerName lms.example.com
DocumentRoot /var/www/chamilo/public/
RewriteEngine On
<Directory /var/www/chamilo/public>
AllowOverride All
Require all granted
</Directory>
php_value session.cookie_httponly 1
php_admin_value memory_limit 512M
php_admin_value upload_max_filesize 256M
php_admin_value post_max_size 256M
php_admin_value pcre.jit 0
php_admin_value display_startup_errors 0
php_admin_value error_reporting 6135
<LocationMatch "/.git">
Require all denied
</LocationMatch>
<LocationMatch "/documentation">
Require all denied
</LocationMatch>
</VirtualHost>وأخيراً compose.yaml:
name: edu1-chamilo
services:
db:
image: mariadb:11.4.13
container_name: edu1-chamilo-db
restart: unless-stopped
environment:
MARIADB_DATABASE: chamilo
MARIADB_USER: chamilo
MARIADB_PASSWORD: change-me-db
MARIADB_ROOT_PASSWORD: change-me-root
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
retries: 10
mem_limit: 768m
volumes:
- db:/var/lib/mysql
web:
build: .
image: edu1-chamilo-web:3.0.1
container_name: edu1-chamilo-web
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:27380:80"
mem_limit: 1g
volumes:
- code:/var/www/chamilo
volumes:
db:
name: edu1-chamilo-db
code:
name: edu1-chamilo-codeفي الإعداد أعلاه لاحظ التالي:
- تثبيت الإصدارات:
php:8.4.26-apache-trixieوmariadb:11.4.13بأرقامها، وليسlatest، حتى يبقى ما تشغله اليوم هو نفسه بعد شهر. - ملف php.ini: ال Image الرسمي لـ PHP لا يفعل أي ملف
php.ini، وتوثيقه يوصي بشدة باستخدام ملف الإنتاج، وسوف نرى بعد قليل ماذا يحدث بدونه. - الفحص الصحي Healthcheck: سيرفر الويب لا يبدأ حتى تكون MariaDB جاهزة فعلاً، وليس فقط حتى يبدأ ال Container.
- المنفذ: منشور على
127.0.0.1فقط، وأمامه في الإنتاج Reverse Proxy بشهادة HTTPS كما في تثبيت Caddy.
وضع كود Chamilo في ال Volume
حمل الملف chamilo-3.0.1.zip من صفحة الإصدار، وهو بحجم 247MB لأنه يأتي ومعه مكتبات PHP وملفات الواجهة جاهزة، فلا تحتاج Composer ولا Node على السيرفر. ثم افرده داخل ال Volume، وأعط مستخدم Apache حق الكتابة كما يطلب ملف المشروع:
curl -sL -o chamilo-3.0.1.zip https://github.com/chamilo/chamilo-lms/releases/download/v3.0.1/chamilo-3.0.1.zip
sha256sum chamilo-3.0.1.zip
docker compose build
docker volume create edu1-chamilo-code
docker run --rm -v "$PWD":/dl:ro -v edu1-chamilo-code:/var/www/chamilo --entrypoint sh edu1-chamilo-web:3.0.1 \
-c 'cd /var/www/chamilo && unzip -q /dl/chamilo-3.0.1.zip && touch .env && chown -R www-data:www-data /var/www/chamilo'
docker compose up -dccb2304d8154da93e470a02ce17c8a4f6deb6b8890b6900a09787765aaf57c31 chamilo-3.0.1.zipوالكود بعد الفرد 881MB، ثم يحول الموقع أي طلب إلى معالج التثبيت:
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" http://127.0.0.1:27380/302 http://127.0.0.1:27380/main/install/index.phpمعالج التثبيت Installer وأربعة أعطال حقيقية
المعالج سبع خطوات: اللغة، والمتطلبات، والترخيص، وقاعدة البيانات، والإعدادات، والمراجعة، ثم التثبيت، وقد اختار العربية تلقائياً من لغة المتصفح. وفي تجربتنا لم يمر التثبيت من أول مرة، وفيما يلي ما ظهر بالترتيب، لأنه غالباً ما سوف يظهر لك.
نجرب العطل: PHP دون ملف إعداد
في أول نسخة من ال Dockerfile لم يكن فيها سطر php.ini-production، فأظهرت صفحة المتطلبات التالي:

والسبب أن PHP دون ملف إعداد يعمل بقيمه الافتراضية المبنية فيه، ومنها display_errors وshort_open_tag مفعلان، وعرض الأخطاء للزائر يكشف مسارات الملفات وتفاصيل السيرفر، وبعد إضافة السطر وإعادة البناء أصبحت كل القيم خضراء:

وفي الصفحة نفسها تحذيران باللون الأصفر لإضافتي LDAP وXapian، والمعالج يعرضهما كأمرين اختياريين، وسوف نرى في العطل الرابع أن LDAP ليس اختيارياً كما يبدو.
نجرب العطل: قاعدة البيانات على localhost
خطوة قاعدة البيانات تقترح localhost والمستخدم root، وعند ترك المضيف كما هو ظهر الخطأ التالي:
![الخطوة 4 إعدادات قاعدة البيانات في معالج تثبيت Chamilo: المضيف localhost والمنفذ مكتوب بالأرقام العربية الهندية والمستخدم root واسم قاعدة البيانات chamilo، وتحت زر التحقق من اتصال قاعدة البيانات رسالة حمراء: فشل الاتصال بقاعدة البيانات An exception occurred in the driver SQLSTATE[HY000] [2002] No such file or directory](https://arabroot.io/content/images/2026/10/chamilo-04-db-localhost-error.webp)
والرسالة SQLSTATE[HY000] [2002] No such file or directory تحتاج قراءة، فعندما يكون المضيف localhost تحاول مكتبة MySQL في PHP الاتصال عبر ملف Socket على الجهاز نفسه وليس عبر الشبكة، وداخل Container الويب لا توجد قاعدة بيانات أصلاً، فلا يوجد الملف. والحل أن تكتب اسم الخدمة في Compose وهو db، والمستخدم chamilo الذي أنشأناه، ثم تضغط زر التحقق قبل «التالي»، لأن الزر يبقى معطلاً حتى ينجح التحقق. ولاحظ أن خانة المنفذ عرضت الرقم 3306 بالأرقام الهندية «٣٣٠٦».
نجرب العطل: نفاد الذاكرة أثناء التثبيت
في المحاولة الأولى كان memory_limit بالقيمة 256M كما في ملف Apache الذي يأتي مع Chamilo، فأنشأ التثبيت 329 جدولاً ثم توقف، وفي سجل Apache وجدنا السبب:
docker logs edu1-chamilo-web 2>&1 | grep "Allowed memory size"PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 20480 bytes) in /var/www/chamilo/vendor/doctrine/orm/src/Mapping/PropertyAccessors/RawValuePropertyAccessor.php on line 56والأسوأ أن الملف .env كتب فيه APP_INSTALLED='1' قبل أن يتوقف التثبيت، فأصبح الموقع في حالة نصف مثبت، لذلك حذفنا ال Volumes وبدأنا من جديد بعد رفع الحد إلى 512M. والقاعدة هنا: إذا توقف التثبيت في منتصفه فلا تحاول إكماله، احذف قاعدة البيانات والكود وابدأ من نسخة نظيفة، لأن حالة نصف مثبتة ستظهر لك أخطاء غريبة بعد أسابيع.
نجرب العطل: الصفحة الرئيسية ترجع 500
بعد التثبيت الناجح، أظهر المعالج نصيحة أمان بجعل مجلد config للقراءة فقط وحذف مجلد التثبيت، وملف المشروع ينصح بإعادة ملكية .env وconfig إلى المستخدم root، فقمنا بذلك:
docker exec edu1-chamilo-web sh -c 'cd /var/www/chamilo && chown -R root:root .env config && chmod -R a-w config .env && rm -rf public/main/install'
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:27380/500وقد يتساءل البعض: هل السبب تغيير الصلاحيات؟ لا، والسجل هو الذي يجيب:
Uncaught PHP Exception Symfony\Component\Ldap\Exception\LdapException: "The LDAP PHP extension is not enabled." at Adapter.php line 32فالصفحة الرئيسية تحتاج إضافة LDAP في PHP، مع أن معالج التثبيت عرضها تحذيراً أصفر، وملف المشروع يقول إنها مطلوبة فقط إذا أردت الاتصال بـ LDAP، وهذا ما جعلنا نضيف libldap2-dev وldap إلى ال Dockerfile الذي في أعلى المقال، وبعد إعادة البناء أصبحت الصفحة ترجع 200 خلال ثانيتين تقريباً. لذلك ثبت كل الإضافات التي في قائمة ملف المشروع، حتى التي يقول عنها المعالج إنها اختيارية.
وفي الأخير الصورة التالية لآخر خطوة في المعالج بعد التثبيت الناجح:

ولاحظ أن التثبيت يضيف مقررين تجريبيين بالإنجليزية هما «AI Act» و«Using Chamilo»، فاحذفهما أو اجعلهما خاصين قبل أن يراهما المتدربون.
مقرر Course ومستخدمون واختبار Test
لوحة الإدارة
بعد الدخول بحساب المدير تظهر لوحة الإدارة بالعربية ومن اليمين إلى اليسار:

أنشأنا المقرر من «إضافة مساق» بالعنوان «مقدمة في الشبكات» والرمز NET101 ولغته العربية، ثم أضفنا مدربة ومتدربين من ملف CSV عبر «إستيراد قائمة من المستخدمين»، والعمود Courses يسجلهم في المقرر في الخطوة نفسها، وStatus يحدد الدور: teacher للمدرب وuser للمتدرب:
LastName,FirstName,Email,UserName,Password,AuthSource,language,Status,Courses
المدربة,سارة,[email protected],teacher1,Lab-Teach-2026!,platform,arabic,teacher,NET101
المتدرب,خالد,[email protected],student1,Lab-Stud-2026!,platform,arabic,user,NET101
المتدربة,ريم,[email protected],student2,Lab-Stud-2026!,platform,arabic,user,NET101واخترنا «لا» في خيار إرسال البريد، لأن المختبر بلا خادم بريد، فأظهرت الصفحة «تم اضافة المستخدم» للثلاثة، وفي قاعدة البيانات أصبح تسجيلهم في المقرر كما يلي، والحالة 1 للمدرب و5 للمتدرب:
docker exec edu1-chamilo-db mariadb -uchamilo -p chamilo -e "select u.username, c.code, cu.status from course_rel_user cu join user u on u.id=cu.user_id join course c on c.id=cu.c_id where c.code='NET101';"username code status
admin NET101 1
teacher1 NET101 1
student1 NET101 5
student2 NET101 5وفي الإنتاج اضبط البريد من خطوة الإعدادات في المعالج أو من الإدارة، فخانة DSN البريد تأخذ عنوان خدمة البريد كما في Transactional Email، وإلا فلن تصل رسائل استعادة كلمة المرور.
أدوات المقرر
عندما تدخل المدربة إلى المقرر تجد أدواته في شبكة واحدة، وعددها 22 أداة منها المستندات ومسار التعلم والاختبارات والمنتدى والحضور وكتاب الدرجات والاستبيانات والويكي، وكل أداة يمكن إخفاؤها عن المتدربين بأيقونة العين:

وهذه البساطة هي ما يجعل Chamilo سهلاً على مدرب يستخدم منصة تعلم لأول مرة، فلا توجد صفحة إعدادات للمقرر يحتاج أن يمر عليها قبل أن يبدأ.
اختبار يحله متدرب
أنشأت المدربة اختباراً من أداة الاختبارات بعنوان «اختبار قصير: DNS»، وبعد العنوان تظهر أنواع الأسئلة، وعددها في هذا الإصدار 28 نوعاً:

أضافت سؤالاً من نوع الاختيار من متعدد «ما وظيفة DNS؟» بأربعة خيارات ودرجة 10، ثم دخل المتدرب خالد وحل الاختبار، فكانت النتيجة كما يلي:

الدورة التدريبية Session لدفعة من المتدربين
الآن نطبق الفكرة التي في أول المقال، فمن «إدارة الجلسات» ثم «اضافة دورة» أنشأنا دورة باسم «دفعة نوفمبر 2026»، والمعالج ثلاث خطوات: الاسم والمدرب العام، ثم المقررات، ثم المتدربون، والصورة التالية للنتيجة:

في الصورة أعلاه لاحظ التالي:
- المقرر داخل الدورة له عدد مستخدمين خاص به هو 2، وهؤلاء نتائجهم في هذه الدورة فقط، فإذا أنشأت «دفعة ديسمبر» على المقرر نفسه بدأت نتائجها من الصفر.
- عمود «غرفة» من ميزات الإصدار 3.0 التي تذكرها ملاحظات الإصدار: الغرف والفروع للتدريب الحضوري، وربط الدورة والحضور بغرفة محددة.
- خيار «إمكانية الزيارة بعد نهاية التاريخ» بقيمة «القراءة فقط»، فيبقى المتدرب قادراً على مراجعة المحتوى بعد انتهاء دفعته دون أن يحل اختبارات جديدة.
العربية واتجاه الكتابة RTL بصراحة
الواجهة كلها من اليمين إلى اليسار، ومعالج التثبيت ولوحة الإدارة وأدوات المقرر بالعربية، ولكن الترجمة أقل اتساقاً مما رأيناه في Moodle، وفيما يلي ما وجدناه بالتحديد:
- مصطلح واحد بأربع ترجمات: Course تظهر «مقرر» و«مساق» و«دورة»، وSession تظهر «جلسة» و«دورة»، فتجد في البطاقة نفسها «إدارة الجلسات» وتحتها «قائمة الدورات»، ورابط قائمة المقررات في القائمة الجانبية عنوانه «المسارات التعليمية».
- اسم المدير الافتراضي: اقترح المعالج للمدير الاسم «الانضمام دو»، وهو ترجمة حرفية للاسم الإنجليزي الافتراضي.
- وسم HTML مترجم: صفحة استيراد المستخدمين تقول إن الحقول «في <قوي>عريض إجبارية»، أي أن الوسم
<strong>ترجم كنص. - كلمات إنجليزية: «Start test» و«Exercises» و«Exercise result» و«completed» في مسار الاختبار.
- أخطاء إملائية: «النسبة المؤوية» بدلاً من «المئوية» في نتيجة الاختبار.
وأغلب هذه التفاصيل تصلحها من أداة الترجمات في الإدارة، فاجمعها في قائمة قبل أن يراها المتدربون، واختر مصطلحاً واحداً للمقرر وآخر للدورة في كل مراسلاتك.
كم يستهلك من الذاكرة RAM والقرص؟
بعد التجربة كاملة، بالمقررات التجريبية ومقررنا والدورة والاختبار، قسنا الذاكرة بالأمر docker stats --no-stream: سيرفر الويب 304MiB، وMariaDB 245MiB، أي نحو 550MB للمنصة كلها، ووصل سيرفر الويب أثناء التثبيت إلى 427MiB. وحجم ال Docker Image الذي بنيناه 870MB، والكود في ال Volume 881MB، وقاعدة البيانات 329 جدولاً. وهذه أرقام منصة خاملة، والحمل الحقيقي تحدده لحظة دخول دفعة كاملة إلى اختبار.
النطاق Domain والشهادة HTTPS
ضع أمام سيرفر الويب Reverse Proxy مثل Caddy على نطاق مستقل مثل lms.example.com، وغير ServerName في chamilo.conf إلى النطاق نفسه. والملف .env بعد التثبيت فيه السطر TRUSTED_PROXIES=127.0.0.1، والتعليق الذي فوقه في .env.dist يقول إن هذا الإعداد يفعل عند العمل خلف Reverse Proxy، وإنه يحتاج أن يرسل ال Proxy ترويسات عنوان العميل والبروتوكول X-Forwarded، فإذا كان ال Proxy في Container آخر فاكتب عنوانه أو شبكته هنا، وإلا فسوف يبني Chamilo روابط http بدلاً من https. وهذه خطوة لم نجربها محلياً لأنها تحتاج نطاقاً حقيقياً.
التحقق Verification من النجاح
curlعلى الصفحة الرئيسية يرجع 200، وليس 302 إلى المعالج ولا 500.- مجلد
public/main/installغير موجود، وconfigو.envللقراءة فقط. - متدرب مسجل يدخل المقرر ويحل اختباراً فتظهر نتيجته مباشرة.
- الدورة التدريبية تعرض المقرر والمتدربين والمدرب والتواريخ.
النسخ الاحتياطي Backup والاستعادة Restore
النسخة الكاملة لـ Chamilo أربعة أشياء: قاعدة البيانات، والملفات المرفوعة في var/upload، والملف .env الذي يحمل كلمات المرور والمفاتيح، ومجلد config. وأما var/cache فلا تنسخه، فهو في منصتنا 309MB من أصل 314MB في مجلد var كله، ويعاد بناؤه تلقائياً:
docker exec edu1-chamilo-db sh -c 'mariadb-dump -uchamilo -p"$MARIADB_PASSWORD" --single-transaction chamilo | gzip > /tmp/chamilo.sql.gz && ls -la /tmp/chamilo.sql.gz'-rw-r--r-- 1 root root 866569 Oct 22 03:32 /tmp/chamilo.sql.gzأي أن قاعدة البيانات بعد الضغط 866KB، والملفات المرفوعة في var/upload كانت 3.3MB، فاضغطها مع .env وconfig في ملف واحد، ثم انقل النسختين خارج السيرفر واختبر استعادتهما كما في النسخ الاحتياطي بقاعدة 3-2-1 واختبار الاستعادة. والخيار --single-transaction يأخذ نسخة متسقة من جداول InnoDB دون أن يوقف المنصة.
التحديث Upgrade إلى إصدار أحدث
ملاحظات الإصدار 3.0.1 تطلب التحديث إليه من 2.x و3.0.0، ومعالج التثبيت نفسه فيه زر «ترقية اصدار النظام» في خطوة المتطلبات، وقد رأيناه ولكن لم نجرب الترقية، والطريقة المعقولة كما يلي:
- خذ نسخة كاملة كما في القسم السابق، وجرب الترقية على نسخة من المنصة أولاً.
- افرد الإصدار الجديد في Volume جديد، وانقل إليه
.envوconfigوvar/upload. - افتح المعالج واختر الترقية بدلاً من التثبيت الجديد، ثم احذف مجلد التثبيت مرة أخرى.
وأما الانتقال من الفرع 1.11 إلى الجيل الجديد فهو أكبر من تحديث، لأن بنية الملفات وقاعدة البيانات تغيرت، فعامله كمشروع ترحيل Migration مستقل بخطة واختبار، ولا تبدأه في منتصف فصل دراسي.
متى يناسب Chamilo مدرستك أو مركز التدريب؟
- نقاط القوة: خفيف، نحو 550MB من الذاكرة وهو خامل في Containerين فقط، والدورات التدريبية Sessions تحل مشكلة الدفعات المتكررة دون نسخ المقررات، وأدوات المقرر بسيطة للمدرب الجديد، وفيه الحضور والغرف والفروع للتدريب الحضوري، والحزمة تأتي جاهزة دون Composer أو Node على السيرفر.
- نقاط الضعف: الترجمة العربية غير متسقة في المصطلحات، ولا يدعم PostgreSQL، والفريق لم ينشر أرقام اختبار أحمال، والتثبيت على Docker يحتاج انتباهاً للإضافات والذاكرة كما رأينا، والإصدار 3 جديد عمره شهر واحد.
فإذا كنت مركز تدريب يعيد الدورة نفسها لدفعات متتالية، أو مدرسة صغيرة بمعلمين يريدون أداة بسيطة، فهو خيار مناسب جداً، وإذا كنت جامعة بمئات الشعب وتكاملات كثيرة فالأقرب لك Moodle.
مشكلات شائعة وحلولها Troubleshooting
SQLSTATE[HY000] [2002] No such file or directory: المضيفlocalhostداخل Container، فاكتب اسم خدمة قاعدة البيانات.- التثبيت يتوقف في منتصفه: ابحث في السجل عن
Allowed memory size، وارفعmemory_limitإلى 512M، وابدأ من قاعدة بيانات فارغة. - الصفحة الرئيسية ترجع 500 بعد التثبيت: ابحث في السجل عن
LdapException، وثبت إضافةldapفي PHP. - Display Errors بالأحمر في المتطلبات: لا يوجد
php.ini، فانسخphp.ini-productionكما في ال Dockerfile. - زر «التالي» معطل في خطوة قاعدة البيانات: اضغط «التحقق من اتصال قاعدة البيانات» أولاً.
- استيراد الأسئلة بصيغة Aiken: صفحة الاستيراد أرجعت خطأ 500 في تجربتنا على 3.0.1 بملف عربي وآخر إنجليزي، فأنشأنا السؤال من نموذج الأسئلة، فإذا ظهر لك الخطأ نفسه فأنشئ الأسئلة يدوياً حتى يصدر إصلاح.
تنظيف المختبر
docker compose down -v
docker image rm edu1-chamilo-web:3.0.1 Container edu1-chamilo-db Removed
Network edu1-chamilo_default Removing
Volume edu1-chamilo-db Removing
Volume edu1-chamilo-code Removing
Volume edu1-chamilo-db Removed
Network edu1-chamilo_default Removed
Volume edu1-chamilo-code Removedتدريب عملي
- أنشئ دورة ثانية «دفعة ديسمبر» على المقرر نفسه، وسجل فيها المتدربة ريم فقط، ثم قارن نتائج الاختبار في الدورتين.
- غير ترجمة «مساق» إلى «مقرر» من أداة الترجمات في الإدارة، وافتح لوحة الإدارة مرة أخرى.
الخلاصة
وصلنا لنهاية الموضوع، وأهم ما فيه:
- Chamilo 3.0.1 منصة PHP خفيفة بترخيص GPLv3+، تعمل في Containerين بنحو 550MB من الذاكرة وهي خاملة.
- فكرته المميزة الدورة التدريبية Session: المقرر يكتب مرة، وكل دفعة لها تواريخها ومدربها ونتائجها.
- على Docker استخدم
php.ini-production، وثبت إضافةldap، وارفعmemory_limitإلى 512M قبل التثبيت، واكتب اسم خدمة قاعدة البيانات بدلاً منlocalhost. - المستخدمون والتسجيل في المقررات يأتون من ملف CSV واحد، والاختبار يعطي النتيجة فوراً.
- العربية تعمل من اليمين إلى اليسار، ولكن مصطلحاتها غير متسقة، فراجعها قبل الإطلاق.
- النسخة الكاملة هي قاعدة البيانات و
var/uploadو.envوconfig.
سجل التحديثات
- أكتوبر 2026: كتابة الدليل وتجربته على Chamilo 3.0.1 وPHP 8.4.26 وMariaDB 11.4.13.