شغّل نشاط الحجز محليًا
شغّل حزمتك على جهازك باستخدام Docker.
لحزمة الحزمة الكاملة
قبل أن تبدأ: ثبّت Docker Desktop وافتحه، أو Docker Engine مع Compose.
اطّلع على المتطلباتنزّل قالبك
افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بحزمتك.
النتيجة المتوقعة: يوجد في مجلد التنزيلات ملف اسمه مثل
hollina-vacation-rental-full-stack-….zip.فك الضغط وافتح المجلد
افتح طرفية في المكان الذي يوجد فيه ملف ZIP، وفك ضغطه، وادخل إلى المجلد
hollina-vacation-rental-full-stack. على Windows يمكنك فك الضغط من File Explorer بدلًا من ذلك، ثم فتح طرفية في المجلد.الطرفيةunzip -q hollina-vacation-rental-full-stack-*.zip cd hollina-vacation-rental-full-stackالنتيجة المتوقعة: يعرض المجلد
تواجه مشكلة؟admin-dashboardوback-endوstorefrontوdocker-compose.yml، إلى جانبREADME.mdوQUICKSTART.mdوLICENSE.md.شغّل التطبيقات
ابنِ واجهة API وموقع الإقامات ولوحة تحكم الحجوزات وشغّلها. لا شيء يلزم ضبطه أولًا. أول تشغيل يبني ثلاث صور ويملأ قاعدة البيانات بالشركة التجريبية، وهذا يستغرق بضع دقائق؛ والتشغيلات التالية تستغرق ثوانيَ.
الطرفيةفيhollina-vacation-rental-full-stackdocker compose up --buildالمنفذ مستخدم بالفعل؟
إذا توقف التشغيل برسالة
المنفذ مستخدم بالفعلports are not availableأوaddress already in useأوport is already allocatedفهناك برنامج آخر يستخدم 3030 أو 3031 أو 8000. أوقفه، أو أنشئ ملفًا باسم.envفي المجلدhollina-vacation-rental-full-stack، بجوارdocker-compose.yml، فيه المنفذ الذي تحتاجه، مثلADMIN_PORT=3041(وSITE_PORTللموقع وAPI_PORTلواجهة API). شغّلdocker compose up --buildمرة أخرى وافتح التطبيق على منفذه الجديد.النتيجة المتوقعة: تبقى الخدمات الثلاث قيد التشغيل ويتوقف السجل عن التمرير. اترك هذه الطرفية مفتوحة.
تواجه مشكلة؟افتح موقع الإقامات
افتح localhost:3030محلي. الإنجليزية على
/enوالعربية على/ar. لا حسابات في الموقع: تُحفظ الإقامات في متصفح الزائر، ويجد الضيف حجزه من جديد بمرجعه والبريد الإلكتروني الذي استُخدم فيه. وبدون مفاتيح دفع يقبل المحاكي المرفق كل حجز بالبطاقة أو PayPal، فيعمل إتمام الطلب كله؛ ورقم البطاقة الذي ينتهي بـ0يُرفض ليُظهر مسار الفشل.النتيجة المتوقعة: يفتح الموقع على صفحته الرئيسية مع الإقامات التجريبية وصورها والوجهات.
تواجه مشكلة؟سجّل الدخول إلى لوحة تحكم الحجوزات
افتح localhost:3031محلي. سجّل الدخول بـ
admin@hollina.exampleوكلمة المرورAdmin@123. للمدير اكتبmanager@hollina.exampleمعManager@123. غيّر كلمتي المرور قبل أن يصبح التطبيق متاحًا من الإنترنت.النتيجة المتوقعة: تفتح لوحة التحكم على نظرتها العامة، مع إشغال هذا الشهر وإيراداته، ووصول اليوم ومغادرته، وأحدث الحجوزات.
تواجه مشكلة؟
جولة سريعة
كيف تبدو الشركة التجريبية بعد تشغيل كل شيء.
| الحساب | البريد الإلكتروني | كلمة المرور |
|---|---|---|
| المدير العام (Super Admin): كل الصفحات والصلاحيات | admin@hollina.example | Admin@123 |
| المدير: النظرة العامة والتقويم والحجوزات والإقامات والاستفسارات والتقييمات والمساعد الذكي؛ بدون المشرفين والأدوار وإعدادات الشركة | manager@hollina.example | Manager@123 |
تضيف البيانات الأولية 14 إقامة (12 منشورة ومسودتان) مع 42 صورة، و6 وجهات، و18 مرفقًا، و60 حجزًا على امتداد السنة، و8 نطاقات محظورة، و12 سؤالًا من الضيوف، و24 تقييمًا، و6 أسئلة للصفحة الرئيسية، فتفتح كل شاشة وهي ممتلئة. تُحفظ التواريخ كإزاحات عن يوم تعبئة البيانات، فتجد قاعدة بيانات جديدة وصولًا اليوم دائمًا. هذه حسابات تجريبية محلية فقط.
أوقف التطبيقات وأعد تشغيلها
اضغط Ctrl+C في الطرفية لإيقاف التطبيقات، أو شغّل هذا من المجلد hollina-vacation-rental-full-stack. بياناتك، أي قاعدة البيانات والملفات المرفوعة، محفوظة في وحدة التخزين hollina-data.
hollina-vacation-rental-full-stackdocker compose downأعد التشغيل بالأمر نفسه في الخطوة 3. من دون --build يعيد استخدام الصور التي بنيتها مسبقًا.
hollina-vacation-rental-full-stackdocker compose upحافظ على بياناتك
الأمر docker compose down -v يحذف وحدة تخزين البيانات أيضًا. التشغيل التالي يملأ نسخة جديدة من الشركة التجريبية، ويختفي كل ما أنشأته.
شغّل موقع الإقامات
هذه الحزمة هي موقع الإقامات وحده. يقرأ كل شيء من واجهة Hollina API، لذلك شغّل واجهة API أولًا. ما لم تبنِه بعنوان آخر، يتوقع الموقع أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست في هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip -q hollina-website-*.zip cd hollina-websiteالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوpackage.json.ابنِ الصورة
قيم
NEXT_PUBLIC_*تُدمج في JavaScript الذي يحمّله المتصفح، لذلك هي معاملات بناء. بدونها يستخدم الموقع واجهة API علىhttp://localhost:8000/apiويسمّي نفسهhttp://localhost:3030. أما لواجهة API في مكان آخر فمرّر عنوانها.الطرفيةفيhollina-websitedocker build -t hollina-website .مع واجهة API ونطاق خاصين بك:
الطرفيةفيhollina-websitedocker build -t hollina-website --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-company.com/api --build-arg NEXT_PUBLIC_SITE_URL=https://www.your-company.com --build-arg NEXT_PUBLIC_MEDIA_HOSTNAME=media.your-company.com .تواجه مشكلة؟شغّله
داخل الحاوية يكون
localhostهو الحاوية نفسها، لذلك يخبرAPI_INTERNAL_URLخادم الموقع أين يجد واجهة API على جهازك، لعناوين الصفحات، والعرض الأول للصفحة الرئيسية وصفحات الإقامات، وخريطة الموقع. يجعل--add-hostالاسمhost.docker.internalيعمل على Linux؛ وهو موجود أصلًا في Docker Desktop. إذا كان المنفذ3030مشغولًا فغيّر الرقم الذي على يسار-p، مثل-p 3041:3030، وافتح ذلك المنفذ بدلًا منه، وأضفhttp://localhost:3041إلىCORS_ORIGINفي واجهة API.الطرفيةفيhollina-websitedocker run -p 3030:3030 -e API_INTERNAL_URL=http://host.docker.internal:8000/api --add-host=host.docker.internal:host-gateway hollina-websiteالنتيجة المتوقعة: يفتح localhost:3030محلي الموقع مع الإقامات القادمة من واجهة API لديك. الإنجليزية على
تواجه مشكلة؟/enوالعربية على/ar.
شغّل لوحة تحكم الحجوزات
هذه الحزمة هي لوحة تحكم الحجوزات وحدها. كل شاشة تقرأ من واجهة Hollina API، لذلك شغّل واجهة API أولًا. ما لم تبنِها بعنوان آخر، تتوقع لوحة التحكم أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست في هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip -q hollina-booking-dashboard-*.zip cd hollina-booking-dashboardالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوpackage.json.ابنِ الصورة
بدون معاملات بناء تستخدم لوحة التحكم واجهة API على
http://localhost:8000/api. لواجهة API في مكان آخر مرّر عنوانها، وعنوانها بدون/apiللإشعارات المباشرة، وعنوان الموقع لرابط «العودة إلى الموقع» ولرابط «عرض الإقامة» في محرر الإقامة.الطرفيةفيhollina-booking-dashboarddocker build -t hollina-dashboard .مع واجهة API خاصة بك:
الطرفيةفيhollina-booking-dashboarddocker build -t hollina-dashboard --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_MEDIA_HOSTNAME=api.your-domain.com --build-arg NEXT_PUBLIC_SITE_URL=https://your-domain.com .تواجه مشكلة؟شغّلها وسجّل الدخول
إذا كان المنفذ
3031مشغولًا فغيّر الرقم الذي على يسار-p، مثل-p 3041:3031، وافتح ذلك المنفذ بدلًا منه، وأضفhttp://localhost:3041إلىCORS_ORIGINفي واجهة API (واضبطFRONTEND_URLعليه، وهو العنوان الذي تتصل منه الإشعارات المباشرة).الطرفيةفيhollina-booking-dashboarddocker run -p 3031:3031 hollina-dashboardالنتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بـ
تواجه مشكلة؟admin@hollina.exampleوكلمة المرورAdmin@123، وتقبلهما واجهة API المعبأة بالبيانات.
شغّل واجهة API
هذه الحزمة هي واجهة NestJS API وحدها، على ملف SQLite محفوظ في وحدة تخزين Docker مع الملفات المرفوعة. موقع الإقامات ولوحة تحكم الحجوزات حزمتان منفصلتان وليستا في هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip -q hollina-backend-*.zip cd hollina-backendالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوdocker-entrypoint.shوpackage.json.شغّلها مع الشركة التجريبية
تحصل وحدة التخزين الجديدة على جداول فارغة وبلا حسابات ما لم تطلب الشركة التجريبية، لذلك أبقِ
-e SEED_DEMO_DATA=trueفي أول تشغيل. تحفظ وحدة التخزينhollina-api-dataقاعدة البيانات والملفات المرفوعة بين التشغيلات. إذا كان المنفذ8000مشغولًا فغيّر الرقم الذي على يسار-p، مثل-p 8010:8000، وأضف-e PUBLIC_MEDIA_URL=http://localhost:8010/mediaلتستخدمه عناوين الصور أيضًا. وعندها يجب أن تشير واجهتاك الأماميتان إلىhttp://localhost:8010/api.الطرفيةفيhollina-backenddocker run -p 8000:8000 -v hollina-api-data:/data -e SEED_DEMO_DATA=true hollina-apiالنتيجة المتوقعة: يجيب localhost:8000/
تواجه مشكلة؟api/ healthمحلي بـ "status":"ok"و"database":"up".
تقبل الحاوية الموقع على http://localhost:3030 ولوحة التحكم على http://localhost:3031. على عناوين أخرى اضبط بـ -e كلًا من CORS_ORIGIN (العنوانان، مفصولان بفاصلة) وFRONTEND_URL (لوحة التحكم) وSITE_URL (الموقع، حيث تعيد معالجة الدفع الضيف). بدون مفاتيح دفع يسوّي المحاكي المرفق كل حجز بالبطاقة أو PayPal.
لتعطي الحاوية مفاتيحك الخاصة (Stripe وPayPal وR2 والذكاء الاصطناعي وMCP)، أنشئ .env من .env.example بالأمر cp .env.example .env، واملأه، وأضف --env-file .env -e NODE_ENV=production إلى docker run:
hollina-backenddocker run -p 8000:8000 -v hollina-api-data:/data -e SEED_DEMO_DATA=true --env-file .env -e NODE_ENV=production hollina-apiالقيمة المعطاة بـ -e تتغلب على الاسم نفسه في الملف، لذلك تعمل الحاوية في وضع الإنتاج مهما كان في .env، وتنقل المسارات النسبية في الملف (SQLITE_DATABASE وMEDIA_UPLOAD_DIR) إلى وحدة التخزين. بدون JWT_SECRET خاص بك، أو مع القيمة الموجودة في المثال، تولّد الحاوية سرًا وتحفظه في وحدة التخزين، فتبقى تسجيلات الدخول صالحة بعد إعادة التشغيل.