انتقل إلى المقال
Aniq-UI

Food Studioشغّل المطعم محليًا

شغّل المطعم محليًا

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

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

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

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

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

    النتيجة المتوقعة: يظهر في مجلد التنزيلات ملف باسم مثل food-studio-full-stack-main-….zip.

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

    فك ضغط ملف ZIP وافتح طرفية داخل المجلد food-studio-full-stack. على Windows، فك الضغط في مستكشف الملفات، ثم افتح طرفية داخل المجلد.

    الطرفية
    unzip food-studio-full-stack-*.zip
    cd food-studio-full-stack

    النتيجة المتوقعة: يحتوي المجلد على admin-dashboard وback-end وstorefront وdocker-compose.yml.

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

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

    الطرفيةفي food-studio-full-stack
    docker compose up --build

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

    إذا توقف التشغيل مع الرسالة address already in use أو port is already allocated، فهناك برنامج آخر يستخدم 3030 أو 3031 أو 8000. إما أن توقفه، أو تنشئ ملفًا باسم .env في المجلد food-studio-full-stack، بجوار docker-compose.yml، وفيه المنفذ الذي تحتاج إليه، مثل ADMIN_PORT=3041 (وSITE_PORT للموقع، وAPI_PORT لواجهة API). شغّل docker compose up --build مرة أخرى وافتح التطبيق على منفذه الجديد.

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

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

    تواجه مشكلة؟
  4. افتح موقع الطلبات

    افتح localhost:3030محلي. لتسجيل الدخول كعميل تجريبي، استخدم sam@foodstudio.example مع كلمة المرور FoodDemo2026!. النسخة العربية على /ar.

    النتيجة المتوقعة: يفتح الموقع على صفحته الرئيسية مع القائمة التجريبية وصورها.

    تواجه مشكلة؟
  5. سجّل الدخول إلى لوحة تحكم الفريق

    افتح localhost:3031محلي. سجّل الدخول بـ owner@foodstudio.example وكلمة المرور FoodDemo2026!. لحساب المدير أو المطبخ، اكتب manager@foodstudio.example أو kitchen@foodstudio.example بكلمة المرور نفسها. غيّر كلمات المرور هذه قبل أن يصبح المطعم متاحًا على الإنترنت.

    النتيجة المتوقعة: تفتح لوحة التحكم على صفحة النظرة العامة، مع طلبات اليوم وقائمة انتظار المطبخ.

    تواجه مشكلة؟

جولة سريعة

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

الحسابيسجّل الدخول علىالبريد الإلكترونيكلمة المرور
المالك: كل شيء، بما في ذلك الفريق والأدوارلوحة تحكم الفريقowner@foodstudio.exampleFoodDemo2026!
المدير: كل شيء ما عدا الفريق والأدوارلوحة تحكم الفريقmanager@foodstudio.exampleFoodDemo2026!
المطبخ: طلبات المطبخ المركزي (Central)، من دون أسعارلوحة تحكم الفريقkitchen@foodstudio.exampleFoodDemo2026!
عميل، مع نقاط مكافآت من طلبات سابقةموقع الطلباتsam@foodstudio.exampleFoodDemo2026!

تضيف تعبئة البيانات أيضًا مديرَين آخرين (rami.manager@foodstudio.example وnina.manager@foodstudio.example) وحساب مطبخ لكل واحد من المطابخ الثلاثة الأخرى (riverside.kitchen@ وuptown.kitchen@ وharbor.kitchen@، وكلها على foodstudio.example)، بكلمة المرور نفسها. هذه حسابات تجريبية محلية فقط.

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

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

الطرفيةفي food-studio-full-stack
docker compose down

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

الطرفيةفي food-studio-full-stack
docker compose up

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

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

شغّل موقع الطلبات

هذه الحزمة هي موقع الطلبات وحده. يقرأ كل شيء من واجهة API الخاصة بالقالب، لذلك شغّل واجهة API أولًا. ما لم تبنِه بعنوان آخر، يتوقع الموقع أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.

  1. نزّل قالبك

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

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

    الطرفية
    unzip food-studio-website-*.zip
    cd food-studio-website

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

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

    تُضمَّن قيم NEXT_PUBLIC_* داخل كود JavaScript الذي يحمّله المتصفح، لذلك فهي وسائط بناء. من دونها يستخدم الموقع واجهة API على http://localhost:8000/api. إذا كانت واجهة API في مكان آخر، مرّر عنوانها.

    الطرفيةفي food-studio-website
    docker build -t foodstudio-site .

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

    الطرفيةفي food-studio-website
    docker build -t foodstudio-site --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_MEDIA_HOSTNAME=media.your-domain.com .
    تواجه مشكلة؟
  4. شغّله

    إذا كان المنفذ 3030 مشغولًا، غيّر الرقم الموجود على يسار -p، مثل -p 3041:3030، وافتح ذلك المنفذ بدلًا منه، وأضف العنوان الجديد إلى CORS_ORIGIN في واجهة API.

    الطرفيةفي food-studio-website
    docker run -p 3030:3030 foodstudio-site

    النتيجة المتوقعة: يفتح localhost:3030محلي الموقع مع القائمة القادمة من واجهة API الخاصة بك. الإنجليزية على /en، والعربية على /ar.

    تواجه مشكلة؟

شغّل لوحة تحكم الفريق

هذه الحزمة هي لوحة تحكم الفريق وحدها. كل شاشة تقرأ من واجهة API الخاصة بالقالب، لذلك شغّل واجهة API أولًا. ما لم تبنِها بعنوان آخر، تتوقع لوحة التحكم أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.

  1. نزّل قالبك

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

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

    الطرفية
    unzip food-studio-staff-dashboard-*.zip
    cd food-studio-staff-dashboard

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

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

    من دون وسائط بناء تستخدم لوحة التحكم واجهة API على http://localhost:8000/api. إذا كانت واجهة API في مكان آخر، مرّر عنوانها، وعنوانها من دون /api للإشعارات المباشرة، وعنوان الموقع لرابط «عرض المتجر».

    الطرفيةفي food-studio-staff-dashboard
    docker build -t foodstudio-admin .

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

    الطرفيةفي food-studio-staff-dashboard
    docker build -t foodstudio-admin --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_WEBSOCKET_BASE_URL=https://api.your-domain.com --build-arg NEXT_PUBLIC_STOREFRONT_URL=https://your-domain.com .
    تواجه مشكلة؟
  4. شغّلها وسجّل الدخول

    إذا كان المنفذ 3031 مشغولًا، غيّر الرقم الموجود على يسار -p، مثل -p 3041:3031، وافتح ذلك المنفذ بدلًا منه، وأضف العنوان الجديد إلى CORS_ORIGIN في واجهة API.

    الطرفيةفي food-studio-staff-dashboard
    docker run -p 3031:3031 foodstudio-admin

    النتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بحساب المالك owner@foodstudio.example وكلمة المرور FoodDemo2026!، وهو حساب تقبله واجهة API بعد تعبئة بياناتها.

    تواجه مشكلة؟

شغّل واجهة API

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

  1. نزّل قالبك

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

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

    الطرفية
    unzip food-studio-backend-*.zip
    cd food-studio-backend

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

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

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

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

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

    النتيجة المتوقعة: يجيب localhost:8000/api/healthمحلي بـ {"success":true,"data":{"status":"ok","database":"up"},"message":""}.

    تواجه مشكلة؟

تقبل الحاوية الموقع على http://localhost:3030 ولوحة التحكم على http://localhost:3031. على عناوين أخرى، اضبط CORS_ORIGIN وFRONTEND_URL وSTOREFRONT_URL باستخدام -e.

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

لا تتضمن الصورة نموذج إزالة الخلفية إلا إذا طلبته. لتضمينه، ابنِ الصورة بالأمر:

الطرفيةفي food-studio-backend
docker build --build-arg FETCH_BG_MODEL=true -t foodstudio-api .

التالي

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

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

حل المشكلات

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

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