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

Hollinaشغّل نشاط الحجز محليًا

شغّل نشاط الحجز محليًا

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

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

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

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

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

    النتيجة المتوقعة: يوجد في مجلد التنزيلات ملف اسمه مثل hollina-vacation-rental-full-stack-….zip.

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

    افتح طرفية في المكان الذي يوجد فيه ملف 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.

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

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

    الطرفيةفي hollina-vacation-rental-full-stack
    docker 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 مرة أخرى وافتح التطبيق على منفذه الجديد.

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

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

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

    افتح localhost:3030محلي. الإنجليزية على /en والعربية على /ar. لا حسابات في الموقع: تُحفظ الإقامات في متصفح الزائر، ويجد الضيف حجزه من جديد بمرجعه والبريد الإلكتروني الذي استُخدم فيه. وبدون مفاتيح دفع يقبل المحاكي المرفق كل حجز بالبطاقة أو PayPal، فيعمل إتمام الطلب كله؛ ورقم البطاقة الذي ينتهي بـ 0 يُرفض ليُظهر مسار الفشل.

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

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

    افتح localhost:3031محلي. سجّل الدخول بـ admin@hollina.example وكلمة المرور Admin@123. للمدير اكتب manager@hollina.example مع Manager@123. غيّر كلمتي المرور قبل أن يصبح التطبيق متاحًا من الإنترنت.

    النتيجة المتوقعة: تفتح لوحة التحكم على نظرتها العامة، مع إشغال هذا الشهر وإيراداته، ووصول اليوم ومغادرته، وأحدث الحجوزات.

    تواجه مشكلة؟

جولة سريعة

كيف تبدو الشركة التجريبية بعد تشغيل كل شيء.

الحسابالبريد الإلكترونيكلمة المرور
المدير العام (Super Admin): كل الصفحات والصلاحياتadmin@hollina.exampleAdmin@123
المدير: النظرة العامة والتقويم والحجوزات والإقامات والاستفسارات والتقييمات والمساعد الذكي؛ بدون المشرفين والأدوار وإعدادات الشركةmanager@hollina.exampleManager@123

تضيف البيانات الأولية 14 إقامة (12 منشورة ومسودتان) مع 42 صورة، و6 وجهات، و18 مرفقًا، و60 حجزًا على امتداد السنة، و8 نطاقات محظورة، و12 سؤالًا من الضيوف، و24 تقييمًا، و6 أسئلة للصفحة الرئيسية، فتفتح كل شاشة وهي ممتلئة. تُحفظ التواريخ كإزاحات عن يوم تعبئة البيانات، فتجد قاعدة بيانات جديدة وصولًا اليوم دائمًا. هذه حسابات تجريبية محلية فقط.

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

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

الطرفيةفي hollina-vacation-rental-full-stack
docker compose down

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

الطرفيةفي hollina-vacation-rental-full-stack
docker compose up

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

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

شغّل موقع الإقامات

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

  1. نزّل قالبك

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

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

    الطرفية
    unzip -q hollina-website-*.zip
    cd hollina-website

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

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

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

    الطرفيةفي hollina-website
    docker build -t hollina-website .

    مع واجهة API ونطاق خاصين بك:

    الطرفيةفي hollina-website
    docker 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 .
    تواجه مشكلة؟
  4. شغّله

    داخل الحاوية يكون 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-website
    docker 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 حزمة منفصلة وليست في هذا التنزيل.

  1. نزّل قالبك

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

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

    الطرفية
    unzip -q hollina-booking-dashboard-*.zip
    cd hollina-booking-dashboard

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

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

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

    الطرفيةفي hollina-booking-dashboard
    docker build -t hollina-dashboard .

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

    الطرفيةفي hollina-booking-dashboard
    docker 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 .
    تواجه مشكلة؟
  4. شغّلها وسجّل الدخول

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

    الطرفيةفي hollina-booking-dashboard
    docker run -p 3031:3031 hollina-dashboard

    النتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بـ admin@hollina.example وكلمة المرور Admin@123، وتقبلهما واجهة API المعبأة بالبيانات.

    تواجه مشكلة؟

شغّل واجهة API

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

  1. نزّل قالبك

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

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

    الطرفية
    unzip -q hollina-backend-*.zip
    cd hollina-backend

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

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

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

    تحصل وحدة التخزين الجديدة على جداول فارغة وبلا حسابات ما لم تطلب الشركة التجريبية، لذلك أبقِ -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-backend
    docker 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-backend
docker 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 خاص بك، أو مع القيمة الموجودة في المثال، تولّد الحاوية سرًا وتحفظه في وحدة التخزين، فتبقى تسجيلات الدخول صالحة بعد إعادة التشغيل.

التالي

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

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

حل المشكلات

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

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