حل المشكلات
الأخطاء التي قد تواجهها أثناء تثبيت Learnio، وسبب كل منها، وكيف تصلحها.
لحزمة الحزمة الكاملة
Docker لا يعمل
failed to connect to the docker API at unix:///…/docker.sock; check if the path is correct and if the daemon is runningتعرض إصدارات Docker الأقدم الرسالة "Cannot connect to the Docker daemon" بدلًا من ذلك. وفي الحالتين، محرك Docker غير مُشغَّل.
افتح Docker Desktop
شغّل Docker Desktop وانتظر حتى يُظهر أن المحرك يعمل. على Linux، شغّل الخدمة:
sudo systemctl start docker.تحقق من أن Docker يستجيب
الطرفيةdocker infoالنتيجة المتوقعة: يطبع قسم Server بدلًا من رسالة خطأ.
شغّل أمر التشغيل مرة أخرى
docker compose up --buildللحزمة الكاملة، أو أمرَيdocker buildوdocker runالخاصين بك لتطبيق واحد.
المنفذ مستخدم بالفعل
ports are not available: exposing port TCP 0.0.0.0:3030 … bind: address already in use
Error: listen EADDRINUSE: address already in use :::3030السطر الأول من Docker، والثاني من yarn dev. هناك برنامج آخر يستمع بالفعل على 3030 أو 3031 أو 8000: غالبًا تشغيل سابق لـ Learnio، أو خادم تطوير لمشروع آخر.
اعرف ما الذي يشغل المنفذ
على macOS أو Linux:
الطرفيةlsof -i :3030على Windows، في PowerShell:
الطرفيةnetstat -ano | findstr :3030أوقفه
أغلق ذلك البرنامج، أو أوقف التشغيل السابق: Ctrl+C في طرفيته، أو
docker compose downفي مجلده، أوdocker stopلحاوية شغّلتها بالأمرdocker run. ثم شغّل Learnio من جديد.أو شغّل Learnio على منافذ أخرى
مع الحزمة الكاملة في Docker، أنشئ ملفًا باسم
.envداخل المجلدlearnio-lmsبجوارdocker-compose.ymlيحدد المنفذ الذي تحتاجه.SITE_PORTينقل موقع الطلاب، وADMIN_PORTلوحة الإدارة، وAPI_PORTواجهة API، وتتبعها العناوين التي تستخدمها التطبيقات تلقائيًا.learnio-lms/.envADMIN_PORT=3041ثم شغّل الأمر نفسه من جديد. بعد تشغيل فاشل يكمل من حيث توقف:
الطرفيةفيlearnio-lmsdocker compose up --buildالنتيجة المتوقعة: يجيب التطبيق على منفذه الجديد، هنا localhost:3041محلي.
بدون Docker تكون المنافذ ثابتة في ملفات .env. لنقل واجهة API هناك، غيّر PORT في back-end/.env، وNEXT_PUBLIC_API_BASE_URL في الواجهتين الأماميتين، وCORS_ORIGIN معًا: يجب أن تتطابق الثلاثة. ومع Docker استخدم API_PORT بدلًا من ذلك. ولتطبيق واحد شُغّل بـ docker run، غيّر الرقم الموجود على يسار -p.
فشل بناء Docker
ينزّل البناء الأول الصور الأساسية وكل الاعتماديات، ثم يبني الصور. وعندما يعترضه شيء، يتوقف بالرسالة "failed to solve" مع الخطوة التي فشلت.
- لا اتصال أو انتهت المهلة: يحتاج البناء إلى الإنترنت. شغّل الأمر مرة أخرى بعد عودة الاتصال؛ الخطوات المكتملة محفوظة في ذاكرة التخزين المؤقت.
- لا توجد مساحة كافية على الجهاز (No space left on device): حرّر مساحة في Docker Desktop، أو تحقق مما يستخدمه Docker بالأمر
docker system df. - يفشل عند الخطوة نفسها في كل مرة: أعد البناء من دون ذاكرة التخزين المؤقت، ثم شغّل التطبيقات.
learnio-lmsdocker compose build --no-cache
docker compose upلحزمة التطبيق الواحد، أضف --no-cache إلى أمر docker build الخاص بك.
التشغيل الأول الذي يبدو عالقًا يكون غالبًا لا يزال يملأ البيانات التجريبية. لا يبدأ موقع الطلاب ولوحة الإدارة إلا بعد أن تعلن واجهة API أنها سليمة.
يقول Yarn إن إصداره 1.22
This project's package.json defines "packageManager": "yarn@4…". However the current global version of Yarn is 1.22…يثبّت كل تطبيق Yarn 4 عبر Corepack. تعني هذه الرسالة أن Corepack لم يُفعَّل بعد.
corepack enableعلى Node 26، الذي لم يعد يتضمن Corepack، ثبّته أولًا بالأمر npm install -g corepack. انتهاء yarn install بالرسالة "Done with warnings" أمر متوقع؛ أما الفشل الحقيقي فينتهي بالرسالة "Failed with errors".
تتوقف واجهة API قبل أن تبدأ
✖ The API cannot start. Fix these in back-end/.env:تتحقق واجهة API من إعداداتها أولًا وتعرض قائمة بما يجب إصلاحه. الأسباب المعتادة:
- لا يوجد ملف `.env`. أنشئه في
back-end/بالأمرcp .env.example .env. - `JWT_SECRET` فارغ، أو يحمل القيمة المثال مع `NODE_ENV=production`. ولّد مفتاحًا سريًا خاصًا بك.
- `CORS_ORIGIN` فارغ مع `NODE_ENV=production`. اذكر موقع الطلاب ولوحة الإدارة، مفصولين بفاصلة.
- `DB_TYPE` ليس `sqlite` ولا `mysql`.
فشل تسجيل الدخول
- تحقق من الحساب والتطبيق. تسجّل حسابات الطاقم الدخول إلى لوحة الإدارة على المنفذ
3031:admin@learnio.comبكلمة المرورAdmin@123. ويسجّل الطالب التجريبي الدخول إلى موقع الطلاب على المنفذ3030:demo@learnio.comبكلمة المرورDemo@123. - راجع سجل واجهة API. الرسالة "The database has no accounts, so nobody can sign in" تعني أن البيانات التجريبية لم تُضَف قط. من دون Docker، شغّل
yarn seedفيback-end/. ومع Docker، فقد أُنشئت وحدة التخزين معSEED_DEMO_DATA=false. - الرسالة "The database has no tables yet" تعني أن مخطط قاعدة البيانات لم يُنشأ قط: شغّل
yarn seedفيback-end/وأعد تشغيل واجهة API. - غيّرت كلمة مرور المدير العام ولم تعد تعرفها: ابدأ من جديد ببيانات تجريبية جديدة، كما هو موضح أدناه.
- "That email and password combination didn't work" هي الإجابة نفسها لبريد غير مسجّل ولكلمة مرور خاطئة على حد سواء، فتحقّق من الاثنين.
- "Too many attempts" تعني أن عنوانًا واحدًا أجرى أكثر من 10 محاولات على نموذج تسجيل دخول أو كلمة مرور خلال دقيقة، وهو ما يرفضه الخادم الحي بالرمز
429. انتظر دقيقة ثم حاول مجددًا.
فشل تسجيل الدخول
- راجع سجل واجهة API. الرسالة "The database has no accounts, so nobody can sign in" تعني أن البيانات التجريبية لم تُضَف قط: شغّل
yarn seed، أو شغّل حاوية Docker مع-e SEED_DEMO_DATA=trueعلى وحدة تخزين جديدة. - الرسالة "The database has no tables yet" تعني أن مخطط قاعدة البيانات لم يُنشأ قط: شغّل
yarn seedوأعد تشغيل واجهة API. - تحقّق من الحساب. المدير العام هو
admin@learnio.comبكلمة المرورAdmin@123، والطالب التجريبيdemo@learnio.comبكلمة المرورDemo@123. تسجيل الدخول الفاشل يُجاب بالرمز401وبالرسالة نفسها سواء كان الخطأ في البريد أو في كلمة المرور. - إجابة `429` تعني أن عنوانًا واحدًا أجرى أكثر من 10 محاولات على مسار تسجيل دخول أو إنشاء حساب أو كلمة مرور خلال دقيقة. ترويسة
Retry-Afterتحدد عدد الثواني التي يجب انتظارها.
فشل تسجيل الدخول
مع المحاكاة داخل المتصفح، يسجّل أي بريد إلكتروني وأي كلمة مرور دخولك بصفة المدير العام. بعد ربط واجهة API، سجّل الدخول بحساب موجود فيها؛ حساب المدير العام التجريبي هو admin@learnio.com بكلمة المرور Admin@123.
يظهر إشعار "Sample data"
لم تتمكن الواجهة الأمامية من الوصول إلى واجهة API، لذا تعرض بياناتها النموذجية المرفقة بدلًا منها.
تحقق من أن واجهة API تستجيب
افتح localhost:8000/api/healthمحلي. يجب أن يجيب بحالة
ok.تحقق من عنوان واجهة API في الواجهة الأمامية
يجب أن تكون قيمة
NEXT_PUBLIC_API_BASE_URLفي ملف.envالخاص بالواجهة الأمامية عنوانَ واجهة API متضمنًا/api، مثلhttp://localhost:8000/api.أعد تشغيل الواجهة الأمامية
العنوان مُضمَّن أثناء البناء. أعد تشغيل
yarn devبعد تغييره؛ ومع Docker، شغّلdocker compose up --buildمرة أخرى.
صور الدورات لا تظهر بعد ربط R2
مع وجود مفاتيح R2_* في back-end/.env تقدّم واجهة API الوسائط من مخزنك، ولا تعرض الواجهتان الأماميتان إلا الصور القادمة من مضيفين بُنيتا للوثوق بهم. ومن دون ذلك المضيف تظهر الصورة المصغّرة لكل دورة نصًا بديلًا بدل الصورة.
حدّد المضيف العام لمخزنك
مع Docker، ضع
MEDIA_HOSTNAME=your-bucket.r2.devفي ملف.envبجانبdocker-compose.yml. ومن دون Docker، اضبطNEXT_PUBLIC_MEDIA_HOSTNAMEفي ملف.envلكل واجهة أمامية. اكتب اسم المضيف فقط، من دونhttps://.أعد بناء الواجهتين الأماميتين
المضيف مُضمَّن أثناء البناء. شغّل
docker compose up --buildمرة أخرى، أو أعد تشغيلyarn devوأعد البناء للإنتاج.النتيجة المتوقعة: تظهر صور الدورات المصغّرة من مخزنك.
المجلد يبدو مختلفًا
شغّل الأوامر داخل المجلد الذي يُستخرج إليه ملف ZIP. إذا لم يكن الأمر unzip متوفرًا، فاستخرجه بمدير الملفات بدلًا من ذلك؛ تضيف بعض الأدوات مجلدًا إضافيًا يحمل اسم ملف ZIP، فانتقل إلى المجلد الداخلي.
| الحزمة | المجلد | يحتوي على |
|---|---|---|
| الحزمة الكاملة | learnio-lms | admin-dashboard, back-end, frontend, docker-compose.yml |
| موقع الطلاب | frontend | Dockerfile, package.json, .env.example |
| لوحة الإدارة | admin-dashboard | Dockerfile, package.json, .env.example |
| API | back-end | Dockerfile, package.json, .env.example |
ابدأ من جديد ببيانات تجريبية جديدة
هذا يحذف بياناتك
يُحذف كل ما أنشأته محليًا، وتُملأ البيانات التجريبية من جديد.
مع Docker، من المجلد learnio-lms:
learnio-lmsdocker compose down -v
docker compose upمن دون Docker، أوقف واجهة API، ثم:
back-endrm -f database.sqlite && yarn seedفي PowerShell:
back-endRemove-Item database.sqlite; yarn seedتشغيل yarn seed مجددًا على قاعدة بيانات تحتفظ بها ليس إعادة ضبط: تحتفظ الأدوار بالصلاحيات التي منحتها لها، وتحتفظ الإعدادات بالقيم التي حفظتها. وحدها قاعدة بيانات جديدة تعيد القيم الأصلية.