شغّل المطعم محليًا
شغّل حزمتك على جهازك باستخدام Docker.
لحزمة الحزمة الكاملة
قبل أن تبدأ: ثبّت Docker Desktop وافتحه، أو Docker Engine مع Compose.
اطّلع على المتطلباتنزّل قالبك
افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بحزمتك.
النتيجة المتوقعة: يظهر في مجلد التنزيلات ملف باسم مثل
food-studio-full-stack-main-….zip.فك الضغط وافتح المجلد
فك ضغط ملف 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.شغّل التطبيقات
ابنِ واجهة API وموقع الطلبات ولوحة تحكم الفريق وشغّلها. لا تحتاج إلى ضبط أي شيء مسبقًا. في التشغيل الأول تُبنى ثلاث صور وتُملأ قاعدة البيانات بالمطعم التجريبي، وهذا يستغرق بضع دقائق؛ أما مرات التشغيل اللاحقة فتستغرق ثواني.
الطرفيةفيfood-studio-full-stackdocker 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مرة أخرى وافتح التطبيق على منفذه الجديد.النتيجة المتوقعة: تبقى الخدمات الثلاث قيد التشغيل ويتوقف السجل عن التمرير. اترك هذه الطرفية مفتوحة.
تواجه مشكلة؟افتح موقع الطلبات
افتح localhost:3030محلي. لتسجيل الدخول كعميل تجريبي، استخدم
sam@foodstudio.exampleمع كلمة المرورFoodDemo2026!. النسخة العربية على/ar.النتيجة المتوقعة: يفتح الموقع على صفحته الرئيسية مع القائمة التجريبية وصورها.
تواجه مشكلة؟سجّل الدخول إلى لوحة تحكم الفريق
افتح localhost:3031محلي. سجّل الدخول بـ
owner@foodstudio.exampleوكلمة المرورFoodDemo2026!. لحساب المدير أو المطبخ، اكتبmanager@foodstudio.exampleأوkitchen@foodstudio.exampleبكلمة المرور نفسها. غيّر كلمات المرور هذه قبل أن يصبح المطعم متاحًا على الإنترنت.النتيجة المتوقعة: تفتح لوحة التحكم على صفحة النظرة العامة، مع طلبات اليوم وقائمة انتظار المطبخ.
تواجه مشكلة؟
جولة سريعة
هكذا يبدو المطعم التجريبي عندما يعمل كل شيء.

| الحساب | يسجّل الدخول على | البريد الإلكتروني | كلمة المرور |
|---|---|---|---|
| المالك: كل شيء، بما في ذلك الفريق والأدوار | لوحة تحكم الفريق | owner@foodstudio.example | FoodDemo2026! |
| المدير: كل شيء ما عدا الفريق والأدوار | لوحة تحكم الفريق | manager@foodstudio.example | FoodDemo2026! |
| المطبخ: طلبات المطبخ المركزي (Central)، من دون أسعار | لوحة تحكم الفريق | kitchen@foodstudio.example | FoodDemo2026! |
| عميل، مع نقاط مكافآت من طلبات سابقة | موقع الطلبات | sam@foodstudio.example | FoodDemo2026! |
تضيف تعبئة البيانات أيضًا مديرَين آخرين (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-stackdocker compose downأعد التشغيل بالأمر نفسه في الخطوة 3. من دون --build يعيد استخدام الصور التي بنيتها مسبقًا.
food-studio-full-stackdocker compose upحافظ على بياناتك
يحذف docker compose down -v وحدة تخزين البيانات أيضًا. في التشغيل التالي تُنشأ نسخة جديدة من المطعم التجريبي، ويضيع كل ما أنشأته.
شغّل موقع الطلبات
هذه الحزمة هي موقع الطلبات وحده. يقرأ كل شيء من واجهة API الخاصة بالقالب، لذلك شغّل واجهة API أولًا. ما لم تبنِه بعنوان آخر، يتوقع الموقع أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip food-studio-website-*.zip cd food-studio-websiteالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوpackage.json.ابنِ الصورة
تُضمَّن قيم
NEXT_PUBLIC_*داخل كود JavaScript الذي يحمّله المتصفح، لذلك فهي وسائط بناء. من دونها يستخدم الموقع واجهة API علىhttp://localhost:8000/api. إذا كانت واجهة API في مكان آخر، مرّر عنوانها.الطرفيةفيfood-studio-websitedocker build -t foodstudio-site .مع واجهة API خاصة بك:
تواجه مشكلة؟الطرفيةفيfood-studio-websitedocker 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 .شغّله
إذا كان المنفذ
3030مشغولًا، غيّر الرقم الموجود على يسار-p، مثل-p 3041:3030، وافتح ذلك المنفذ بدلًا منه، وأضف العنوان الجديد إلىCORS_ORIGINفي واجهة API.الطرفيةفيfood-studio-websitedocker run -p 3030:3030 foodstudio-siteالنتيجة المتوقعة: يفتح localhost:3030محلي الموقع مع القائمة القادمة من واجهة API الخاصة بك. الإنجليزية على
تواجه مشكلة؟/en، والعربية على/ar.
شغّل لوحة تحكم الفريق
هذه الحزمة هي لوحة تحكم الفريق وحدها. كل شاشة تقرأ من واجهة API الخاصة بالقالب، لذلك شغّل واجهة API أولًا. ما لم تبنِها بعنوان آخر، تتوقع لوحة التحكم أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip food-studio-staff-dashboard-*.zip cd food-studio-staff-dashboardالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوpackage.json.ابنِ الصورة
من دون وسائط بناء تستخدم لوحة التحكم واجهة API على
http://localhost:8000/api. إذا كانت واجهة API في مكان آخر، مرّر عنوانها، وعنوانها من دون/apiللإشعارات المباشرة، وعنوان الموقع لرابط «عرض المتجر».الطرفيةفيfood-studio-staff-dashboarddocker build -t foodstudio-admin .مع واجهة API خاصة بك:
تواجه مشكلة؟الطرفيةفيfood-studio-staff-dashboarddocker 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 .شغّلها وسجّل الدخول
إذا كان المنفذ
3031مشغولًا، غيّر الرقم الموجود على يسار-p، مثل-p 3041:3031، وافتح ذلك المنفذ بدلًا منه، وأضف العنوان الجديد إلىCORS_ORIGINفي واجهة API.الطرفيةفيfood-studio-staff-dashboarddocker run -p 3031:3031 foodstudio-adminالنتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بحساب المالك
تواجه مشكلة؟owner@foodstudio.exampleوكلمة المرورFoodDemo2026!، وهو حساب تقبله واجهة API بعد تعبئة بياناتها.
شغّل واجهة API
هذه الحزمة هي واجهة API المبنية على NestJS وحدها، على ملف SQLite محفوظ في وحدة تخزين Docker مع الملفات المرفوعة. موقع الطلبات ولوحة تحكم الفريق حزمتان منفصلتان وليستا ضمن هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip food-studio-backend-*.zip cd food-studio-backendالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوpackage.jsonو.env.example.شغّلها مع المطعم التجريبي
وحدة التخزين الجديدة تحصل على جداول فارغة ومن دون حسابات ما لم تطلب المطعم التجريبي، لذلك أبقِ
-e SEED_DEMO_DATA=trueفي التشغيل الأول. تحفظ وحدة التخزين قاعدة البيانات والملفات المرفوعة بين مرات التشغيل. إذا كان المنفذ8000مشغولًا، غيّر الرقم الموجود على يسار-p، مثل-p 8010:8000، وأضف-e PUBLIC_MEDIA_URL=http://localhost:8010/mediaحتى تستخدمه عناوين الصور أيضًا. وعندها يجب أن توجّه الواجهات الأمامية إلىhttp://localhost:8010/api.الطرفيةفيfood-studio-backenddocker 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-backenddocker build --build-arg FETCH_BG_MODEL=true -t foodstudio-api .