انتقل إلى المقال

Kinoraشغّل Kinora محليًا

شغّل Kinora محليًا

شغّل حزمتك على جهازك باستخدام Docker.

لحزمة الحزمة الكاملة

قبل أن تبدأ: ثبّت Docker Desktop وافتحه، أو Docker Engine مع Compose.

اطّلع على المتطلبات
  1. نزّل قالبك

    افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بحزمتك.

    النتيجة المتوقعة: يوجد ملف باسم مثل kinora-fitness-full-stack-main-….zip في مجلد التنزيلات.

  2. فك الضغط وافتح المجلد

    فك ضغط ملف ZIP وافتح الطرفية في المجلد kinora-fitness-full-stack. على Windows، فك الضغط في File Explorer، ثم افتح الطرفية في المجلد.

    الطرفية
    unzip kinora-fitness-full-stack-*.zip
    cd kinora-fitness-full-stack

    النتيجة المتوقعة: يعرض المجلد back-end وdashboard وdocker-compose.yml.

    تواجه مشكلة؟
  3. شغّل التطبيقات

    ابنِ واجهة API ولوحة التحكم وشغّلهما. لا يلزم ضبط أي شيء أولًا. يبني التشغيل الأول صورتين ويملأ قاعدة البيانات بالبيانات التجريبية، ويستغرق ذلك بضع دقائق؛ أما التشغيلات اللاحقة فتستغرق ثوانيَ.

    الطرفيةفي kinora-fitness-full-stack
    docker compose up --build

    المنفذ مستخدم بالفعل؟

    إذا توقف التشغيل بالرسالة ports are not available ... address already in use، فهناك برنامج آخر يستخدم 3030 أو 8000. إما أن توقفه، أو تنشئ ملفًا باسم .env في المجلد kinora-fitness-full-stack يحتوي على المنفذ الذي تحتاجه، مثل DASHBOARD_PORT=3040 (وAPI_PORT لواجهة API). شغّل docker compose up --build مرة أخرى وافتح لوحة التحكم على منفذها الجديد.

    المنفذ مستخدم بالفعل

    النتيجة المتوقعة: تبقى الخدمتان قيد التشغيل ويتوقف السجل عن التمرير. اترك هذه الطرفية مفتوحة.

    تواجه مشكلة؟
  4. سجّل الدخول بصفتك المدرب

    افتح localhost:3030محلي. نموذج تسجيل الدخول معبّأ ببيانات المدرب الرئيسي: headcoach@example.com مع كلمة المرور Coach@123. الواجهة العربية على /ar.

    النتيجة المتوقعة: تُفتح نظرة المدرب العامة: قائمة العملاء، والعملاء الذين توقفوا، والمتابعات التي تنتظر ردًا، والعمل المسند لليوم.

    تواجه مشكلة؟
  5. سجّل الدخول بصفتك العضو

    سجّل الخروج، ثم افتح localhost:3030/en/auth/login?as=clientمحلي. النموذج معبّأ ببيانات العضو: member@example.com مع كلمة المرور Member@123.

    النتيجة المتوقعة: تُفتح النظرة العامة للعضو، مع الحلقات والسعرات والنوم ومعدل ضربات القلب وتمارين الأسبوع.

    تواجه مشكلة؟

جولة سريعة

هكذا يبدو العرض التجريبي عندما يعمل كل شيء.

الحسابالبريد الإلكترونيكلمة المرورما يراه
المدرب الرئيسيheadcoach@example.comCoach@123كل شاشات الطاقم، مع أكبر قائمة عملاء
عضوmember@example.comMember@123صفحات التدريب، تحت إشراف المدرب الرئيسي
مدرب شخصيtrainer@example.comTrainer@123قائمة عملائه الخاصة وكتالوجات المحتوى

توجد أحد عشر حسابًا آخر للطاقم على @staff.com بكلمة المرور staff123، بدور مدرب أو مدرب شخصي أو مدير النادي أو محرر أو مشاهد. ويوجد أعضاء آخرون على @example.com بكلمة المرور password123. هذه حسابات تجريبية محلية فقط: غيّر كلمات المرور قبل نشر أي شيء للعامة.

يملأ نموذج تسجيل الدخول نفسه بنفسه: /en/auth/login?as=coach (وهو الافتراضي أيضًا) للمدرب الرئيسي، و/en/auth/login?as=client للعضو.

أوقف التطبيقات وأعد تشغيلها

اضغط Ctrl+C في الطرفية لإيقاف التطبيقات، أو شغّل هذا الأمر من المجلد kinora-fitness-full-stack. تُحفظ بياناتك في وحدة التخزين kinora-data.

الطرفيةفي kinora-fitness-full-stack
docker compose down

أعد التشغيل بالأمر نفسه في الخطوة 3. من دون --build يعيد استخدام الصور التي بنيتها مسبقًا.

الطرفيةفي kinora-fitness-full-stack
docker compose up

حافظ على بياناتك

يحذف docker compose down -v أيضًا وحدة تخزين قاعدة البيانات. يزرع التشغيل التالي نسخة جديدة من البيانات التجريبية، ويضيع كل ما أنشأته.

شغّل لوحة التحكم

هذه الحزمة هي لوحة التحكم وحدها. من دون واجهة API تعمل على بيانات تجريبية مدمجة داخل المتصفح: يمكنك تسجيل الدخول، وتسجيل تمرين، وإنشاء عضو، وتعديل دور، وتُحفظ تغييراتك في المتصفح. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.

  1. نزّل قالبك

    افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بلوحة التحكم.

  2. فك الضغط وافتح المجلد

    الطرفية
    unzip kinora-fitness-dashboard-*.zip
    cd kinora-fitness-dashboard

    النتيجة المتوقعة: يحتوي المجلد على Dockerfile وpackage.json.

    تواجه مشكلة؟
  3. ابنِ الصورة

    قيم NEXT_PUBLIC_* تُضمَّن في JavaScript الذي يحمّله المتصفح، لذا فهي وسائط بناء. اتركها لتعمل على البيانات التجريبية؛ ولاستخدام واجهة API الخاصة بالقالب، مرّر عنوانها وعنوان WebSocket الخاص بها (الخادم نفسه من دون /api).

    الطرفيةفي kinora-fitness-dashboard
    docker build -t kinora-dashboard .

    مع واجهة API خاصة بك:

    الطرفيةفي kinora-fitness-dashboard
    docker build -t kinora-dashboard --build-arg NEXT_PUBLIC_API_BASE_URL=http://localhost:8000/api --build-arg NEXT_PUBLIC_WEBSOCKET_BASE_URL=http://localhost:8000 .
    تواجه مشكلة؟
  4. شغّلها وسجّل الدخول

    إذا كان المنفذ 3030 مشغولًا، غيّر الرقم على يسار -p، مثل -p 3040:3030، وافتح ذلك المنفذ بدلًا منه.

    الطرفيةفي kinora-fitness-dashboard
    docker run -p 3030:3030 kinora-dashboard

    النتيجة المتوقعة: يفتح localhost:3030محلي نموذج تسجيل الدخول معبّأً ببيانات المدرب الرئيسي. يشير تنبيه «بيانات تجريبية» في الأسفل إلى عدم ربط أي واجهة API. لا يُتحقق من كلمة المرور على البيانات التجريبية: member@example.com يسجّل الدخول بصفته العضو، وأي بريد إلكتروني لا تعرفه البيانات التجريبية يسجّل الدخول بصفته المدرب الرئيسي.

    تواجه مشكلة؟

شغّل واجهة API

هذه الحزمة هي واجهة API المبنية على NestJS وحدها، على ملف SQLite محفوظ في وحدة تخزين Docker. لوحة التحكم حزمة منفصلة وليست ضمن هذا التنزيل.

  1. نزّل قالبك

    افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بالخادم.

  2. فك الضغط وأنشئ ملف البيئة

    يعمل .env.example كما هو للتشغيل المحلي. نسخة .env هي المكان الذي تضع فيه مفاتيحك لاحقًا.

    الطرفية
    unzip kinora-fitness-backend-*.zip
    cd kinora-fitness-backend
    cp .env.example .env
    تواجه مشكلة؟
  3. ابنِ الصورة

    الطرفيةفي kinora-fitness-backend
    docker build -t kinora-api .
    تواجه مشكلة؟
  4. شغّلها مع البيانات التجريبية

    تحصل وحدة التخزين الجديدة على جداول فارغة ما لم تطلب البيانات التجريبية. تحتفظ وحدة التخزين بقاعدة البيانات بين التشغيلات. إذا كان المنفذ 8000 مشغولًا، غيّر الرقم على يسار -p، مثل -p 8010:8000، وستجيب واجهة API على http://localhost:8010/api بدلًا من ذلك.

    الطرفيةفي kinora-fitness-backend
    docker run -p 8000:8000 -v kinora-data:/data -e SEED_DEMO_DATA=true kinora-api

    النتيجة المتوقعة: يجيب localhost:8000/api/healthمحلي بـ {"status":"ok"}.

    تواجه مشكلة؟

لا تقرأ الحاوية ملف .env إلا عندما تضيف --env-file .env إلى docker run؛ وبهذه الطريقة تصل إليها مفاتيح التخزين والذكاء الاصطناعي و MCP. من دون JWT_SECRET خاص بك، أو مع القيمة الواردة في المثال، تولّد الحاوية سرًا وتحفظه في وحدة التخزين.

تسمح الصورة باستدعاءات المتصفح من http://localhost:3030. للوحة تحكم على عنوان آخر، مرّر -e CORS_ORIGIN= و-e FRONTEND_URL= مع ذلك العنوان.

التالي

توقفت عند خطوة؟

ابحث عن الحل قبل أن تبدأ من جديد.

حل المشكلات

تفضيلات ملفات تعريف الارتباط

نستخدم ملفات تعريف الارتباط لتعزيز تجربة التصفح الخاصة بك وتحليل حركة المرور على الموقع وتخصيص المحتوى. بالنقر على "قبول الكل"، فإنك توافق على استخدامنا لملفات تعريف الارتباط للتحليلات والإعلانات المخصصة.