شغّل Kinora محليًا
ثبّت كل تطبيق وشغّله باستخدام Node.js و Yarn، بطرفية مستقلة لكل تطبيق.
لحزمة الحزمة الكاملة
قبل أن تبدأ: ثبّت Node.js 22.9 أو أحدث (22 لحزمة Backend وحدها) وشغّل corepack enable مرة واحدة. لا حاجة إلى خادم قاعدة بيانات.
افتح كل طرفية في المكان الذي تتوقعه الأوامر أدناه: داخل kinora-fitness-full-stack للحزمة الكاملة، أو بجوار مجلد التطبيق لحزمة التطبيق الواحد.
| التطبيق | المجلد | العنوان |
|---|---|---|
| API | back-end | localhost:8000محلي |
| لوحة التحكم | dashboard | localhost:3030محلي |
شغّل واجهة API أولًا: مع الخطوات أدناه تقرأ لوحة التحكم كل بياناتها منها.
شغّل واجهة API
ثبّت واضبط الإعداد
يعمل
.env.exampleكما هو للتطوير المحلي.تواجه مشكلة؟الطرفيةcorepack enable cd back-end yarn install cp .env.example .envأنشئ قاعدة البيانات
ينشئ
yarn seedالملفdatabase.sqliteوجداوله والبيانات التجريبية. تشغيله مرة أخرى يضيف ما ينقص فقط.الطرفيةفيback-endyarn seedشغّل الخادم
الطرفيةفيback-endyarn devالنتيجة المتوقعة: يجيب localhost:8000/api/healthمحلي بـ
تواجه مشكلة؟{"status":"ok"}.
شغّل واجهة API
ثبّت واضبط الإعداد
يعمل
.env.exampleكما هو للتطوير المحلي.تواجه مشكلة؟الطرفيةcorepack enable cd kinora-fitness-backend yarn install cp .env.example .envأنشئ قاعدة البيانات
ينشئ
yarn seedالملفdatabase.sqliteوجداوله والبيانات التجريبية. تشغيله مرة أخرى يضيف ما ينقص فقط.الطرفيةفيkinora-fitness-backendyarn seedشغّل الخادم
الطرفيةفيkinora-fitness-backendyarn devالنتيجة المتوقعة: يجيب localhost:8000/api/healthمحلي بـ
تواجه مشكلة؟{"status":"ok"}. وقد طبع أمر الزرع الحسابات التي تسجّل الدخول بها.
شغّل لوحة التحكم
في طرفية ثانية:
ثبّت واضبط الإعداد
الطرفيةcd dashboard yarn install cp .env.example .envوجّهها إلى واجهة API
افتح
dashboard/.envواملأ سطري واجهة API، وهما فارغان في المثال. إذا تُركا فارغين، تعمل لوحة التحكم على بياناتها التجريبية المدمجة بدلًا من واجهة API.dashboard/.envNEXT_PUBLIC_API_BASE_URL=http://localhost:8000/api NEXT_PUBLIC_WEBSOCKET_BASE_URL=http://localhost:8000شغّلها وسجّل الدخول
الطرفيةفيdashboardyarn devالنتيجة المتوقعة: يفتح localhost:3030محلي نموذج تسجيل الدخول معبّأً ببيانات المدرب الرئيسي:
تواجه مشكلة؟headcoach@example.comمع كلمة المرورCoach@123. يملأ/en/auth/login?as=clientبيانات العضو:member@example.comمعMember@123. الواجهة العربية على/ar.
شغّل لوحة التحكم
واجهة API ليست جزءًا من هذه الحزمة. لا تنشئ ملف .env بعد: من دونه تعمل لوحة التحكم على بياناتها التجريبية المدمجة.
شغّلها وسجّل الدخول
الطرفيةفيkinora-fitness-dashboardyarn devالنتيجة المتوقعة: يفتح localhost:3030محلي نموذج تسجيل الدخول مع تنبيه «بيانات تجريبية». لا يُتحقق من كلمة المرور (مع أن النموذج يطلب 6 أحرف على الأقل)، وتُحفظ تغييراتك في المتصفح.
عندما تكون واجهة API الخاصة بالقالب قيد التشغيل، أنشئ .env من .env.example واضبط NEXT_PUBLIC_API_BASE_URL على عنوانها. هذا ما يوقف البيانات التجريبية.
بناء الإنتاج
المجلدات نفسها، تُبنى مرة واحدة ثم تُشغَّل. اضبط أولًا back-end/.env للإنتاج. مع NODE_ENV=production لا تعيد واجهة API كتابة المخطط من تلقاء نفسها أبدًا: بل تشغّل عمليات الترحيل عند بدء تشغيلها. وترفض البدء ما دام JWT_SECRET فارغًا أو لا يزال بقيمة المثال، أو ما دام CORS_ORIGIN فارغًا.
NODE_ENV=production
JWT_SECRET=<a long random string>
CORS_ORIGIN=http://localhost:3030
FRONTEND_URL=http://localhost:3030ولّد السر بالأمر node -e "console.log(require('crypto').randomBytes(48).toString('hex'))". ثم ابنِ واجهة API، وأنشئ جداولها مرة واحدة، وشغّلها. ينشئ yarn db:sync:prod جداول فارغة؛ ويضيف yarn seed:prod بدلًا منه، أو بعده، البيانات التجريبية وحساباتها.
back-endyarn build
yarn db:sync:prod
yarn start:prodثم لوحة التحكم، على 3030:
dashboardyarn build
yarn startتُضمّن لوحة التحكم ملف .env الخاص بها وقت البناء، لذا شغّل yarn build مرة أخرى بعد تغييره. قبل النشر في أي مكان عام، اقرأ قائمة التحقق للإنتاج.
بناء الإنتاج
تُبنى مرة واحدة ثم تُشغَّل. اضبط أولًا .env للإنتاج. مع NODE_ENV=production لا تعيد واجهة API كتابة المخطط من تلقاء نفسها أبدًا: بل تشغّل عمليات الترحيل عند بدء تشغيلها. وترفض البدء ما دام JWT_SECRET فارغًا أو لا يزال بقيمة المثال، أو ما دام CORS_ORIGIN فارغًا.
NODE_ENV=production
JWT_SECRET=<a long random string>
CORS_ORIGIN=https://app.your-domain.comولّد السر بالأمر node -e "console.log(require('crypto').randomBytes(48).toString('hex'))". يسرد CORS_ORIGIN عناوين لوحات التحكم التي تستدعي واجهة API، مفصولة بفواصل. ثم ابنِ، وأنشئ الجداول مرة واحدة، وشغّل. ينشئ yarn db:sync:prod جداول فارغة؛ ويضيف yarn seed:prod بدلًا منه، أو بعده، البيانات التجريبية وحساباتها.
kinora-fitness-backendyarn build
yarn db:sync:prod
yarn start:prodبناء الإنتاج
تُبنى مرة واحدة، ثم تُشغَّل على 3030. من دون .env تعمل نسخة الإنتاج على البيانات التجريبية تمامًا كما يفعل yarn dev.
kinora-fitness-dashboardyarn build
yarn startتُضمّن لوحة التحكم ملف .env الخاص بها وقت البناء، لذا شغّل yarn build مرة أخرى بعد تغييره.
ابدأ من جديد ببيانات تجريبية جديدة
أوقف واجهة API، ثم احذف ملف قاعدة البيانات وازرعها مرة أخرى، في مجلد واجهة API. هذا يحذف كل ما أنشأته.
rm -f database.sqlite* && yarn seedفي PowerShell:
Remove-Item database.sqlite*; yarn seed