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

Chamilo: منصة تعلم LMS خفيفة للمدارس ومراكز التدريب

كيف تثبت Chamilo 3 على Docker، وتنشئ مقرراً ودورة تدريبية لدفعة من المتدربين، ومتى يكون أنسب لمدرستك أو مركز التدريب.

Chamilo: منصة تعلم LMS خفيفة للمدارس ومراكز التدريب

مركز تدريب يقدم الدورة نفسها كل شهر لمجموعة جديدة من المتدربين، أو مدرسة صغيرة تريد منصة يفهمها المعلم في أول ساعة، هؤلاء لا يحتاجون كل ما في 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.4024 يونيو 2026الفرع القديم، ما زالت تصدر له تحديثات
2.0.014 أبريل 2026أول إصدار من الجيل الجديد
3.0.09 سبتمبر 2026ميزات ذكاء اصطناعي وغرف وفروع للتدريب الحضوري
3.0.119 سبتمبر 2026إصلاح أمني يطلب الفريق التحديث إليه من 2.x و3.0.0

والذي يميز Chamilo عن غيره فكرة الدورة التدريبية Session، فالمقرر Course هو المحتوى: المستندات ومسار التعلم Learning Path والاختبارات، والدورة هي تشغيل لهذا المقرر لمجموعة محددة من المتدربين بتواريخ ومدرب Coach خاص بها، فتكتب المحتوى مرة واحدة وتعيد استخدامه كل شهر دون نسخه، وكل دفعة لها نتائجها المنفصلة. والصورة التالية تبين الفكرة:

مخطط مقرر واحد في Chamilo يستخدم في دورتين تدريبيتين: المقرر Course فيه المستندات Documents ومسار التعلم Learning Path والاختبارات Tests ويكتب مرة واحدة، وتخرج منه دورة Session لدفعة سبتمبر من 1 إلى 30 سبتمبر لها مدرب Coach خاص ونتائج خاصة بأربعة متعلمين، ودورة Session لدفعة يناير من 1 إلى 31 يناير يمكن أن يدرسها مدرب آخر ونتائجها منفصلة بثلاثة متعلمين
المحتوى في المقرر، والتواريخ والمدرب والمتدربون والنتائج في كل دورة

وهذا بالضبط ما يحتاجه مركز التدريب، وفي 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 -d
ccb2304d8154da93e470a02ce17c8a4f6deb6b8890b6900a09787765aaf57c31  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، فأظهرت صفحة المتطلبات التالي:

جدول الإعدادات الموصى بها في معالج تثبيت Chamilo بالعربية: Display Errors الموصى به OFF والحالي ON باللون الأحمر، وShort Open Tag الموصى به OFF والحالي ON باللون الأحمر، وباقي الإعدادات File Uploads وSession auto start وCookie HTTP Only وحدود الرفع والذاكرة باللون الأخضر
دون ملف php.ini تبقى قيم PHP الافتراضية، ومنها عرض الأخطاء للزائر

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

الجدول نفسه في معالج تثبيت Chamilo بعد استخدام php.ini-production: Display Errors الحالي OFF وShort Open Tag الحالي OFF وكل الإعدادات باللون الأخضر
بعد نسخ php.ini-production أصبحت الإعدادات كما يوصي Chamilo

وفي الصفحة نفسها تحذيران باللون الأصفر لإضافتي 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
localhost داخل Container يعني ال Container نفسه، وليس قاعدة البيانات

والرسالة 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 خلال ثانيتين تقريباً. لذلك ثبت كل الإضافات التي في قائمة ملف المشروع، حتى التي يقول عنها المعالج إنها اختيارية.

وفي الأخير الصورة التالية لآخر خطوة في المعالج بعد التثبيت الناجح:

الخطوة 7 تنفيذ عملية التثبيت في Chamilo بالعربية: رسالة أن النسخة تأتي مع مقرر أو أكثر مثبت مسبقاً، ونصيحة أمان بجعل مسار config للقراءة فقط وحذف مسار public/main/install مع الأمرين chmod -R 0555 config/ وrm -r public/main/install/، ورابط اذهب إلى بوابتك الجديدة
نهاية المعالج: نصيحة الأمان التي طبقناها، ومقرران تجريبيان يأتيان مع التثبيت

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

مقرر Course ومستخدمون واختبار Test

لوحة الإدارة

بعد الدخول بحساب المدير تظهر لوحة الإدارة بالعربية ومن اليمين إلى اليسار:

لوحة الإدارة في Chamilo 3 بالعربية: ثلاث بطاقات إدارة المستخدمين وفيها قائمة المستخدمين وإضافة مستخدمين وإستيراد قائمة من المستخدمين من ملف XML/CSV، وإدارة الدورات وفيها قائمة المقرر وإضافة مساق واستيراد قائمة المقررات، وإدارة الجلسات وفيها قائمة الدورات واضافة دورة، وفي القائمة الجانبية البداية ومقرراتي وادارة وتحتها مستخدمين والمسارات التعليمية والجلسات
لوحة الإدارة: لاحظ أن الكلمة نفسها تترجم مرة «مقرر» ومرة «مساق» ومرة «دورة»

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

وهذه البساطة هي ما يجعل Chamilo سهلاً على مدرب يستخدم منصة تعلم لأول مرة، فلا توجد صفحة إعدادات للمقرر يحتاج أن يمر عليها قبل أن يبدأ.

اختبار يحله متدرب

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

صفحة أسئلة اختبار قصير DNS في Chamilo: رسالة الأسئلة لمجموع الدرجة 0 لـ 0، وتحتها صفان من أيقونات أنواع الأسئلة منها الاختيار من متعدد والإجابات المتعددة وملء الفراغات والمطابقة والسؤال المفتوح والصوت والصورة، ورسالة لا يوجد أي سؤال حالياً
28 نوعاً من الأسئلة، من الاختيار من متعدد حتى أسئلة الصوت والصور

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

صفحة نتيجة اختبار قصير DNS للمتدرب في Chamilo: المحاولة رقم 1 بكلمة إنجليزية completed، والنقاط 10 من 10، والنسبة المئوية مكتوبة النسبة المؤوية 100%، والمدة 00:10، والسؤال الأول إجابة فريدة ما وظيفة DNS والخيار الصحيح تحويل اسم النطاق إلى عنوان IP بعلامة جواب صحيح، ومسار الصفحة بالإنجليزية Exercises وExercise result، وزرا أعد المحاولة والعودة إلى الصفحة الرئيسية للمقرر
النتيجة فورية: 10 من 10 في عشر ثوان، مع كلمات بقيت بالإنجليزية

الدورة التدريبية Session لدفعة من المتدربين

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

صفحة نظرة عامة حول الدورة دفعة نوفمبر 2026 في Chamilo: تم إنشاؤه بواسطة Lab Admin، والمدرب العام سارة المدربة، وتواريخ العرض والوصول من الخميس 22 أكتوبر 2026، وإمكانية الزيارة بعد نهاية التاريخ القراءة فقط، وقائمة المقرر فيها مقدمة في الشبكات NET101 بعدد مستخدمين 2 وعمود غرفة، وقائمة المستخدمين فيها خالد المتدرب student1 وريم المتدربة student2 بحالة طالب
الدورة تجمع المقرر بمدربه ومتدربيه وتواريخه، والمقرر نفسه لم يتغير

في الصورة أعلاه لاحظ التالي:

  • المقرر داخل الدورة له عدد مستخدمين خاص به هو 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، ومعالج التثبيت نفسه فيه زر «ترقية اصدار النظام» في خطوة المتطلبات، وقد رأيناه ولكن لم نجرب الترقية، والطريقة المعقولة كما يلي:

  1. خذ نسخة كاملة كما في القسم السابق، وجرب الترقية على نسخة من المنصة أولاً.
  2. افرد الإصدار الجديد في Volume جديد، وانقل إليه .env وconfig وvar/upload.
  3. افتح المعالج واختر الترقية بدلاً من التثبيت الجديد، ثم احذف مجلد التثبيت مرة أخرى.

وأما الانتقال من الفرع 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.
Could not load content
نشرة عرب رووت | ArabRoot

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

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

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

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