المتطلبات
ما يجب تثبيته قبل تشغيل حزمتك، مع Docker أو بدونه، وأي الخدمات اختيارية.
لحزمة الحزمة الكاملة
ما تحتويه كل حزمة
| الحزمة | التطبيقات في التنزيل | يعمل بمفرده |
|---|---|---|
| الحزمة الكاملة | واجهة API وموقع الإقامات ولوحة تحكم الحجوزات | نعم، الثلاثة معًا |
| موقع الإقامات | موقع الإقامات | لا: يحتاج إلى تشغيل واجهة Hollina API |
| لوحة تحكم الحجوزات | لوحة تحكم الحجوزات | لا: يحتاج إلى تشغيل واجهة Hollina API |
| واجهة API (Backend API) | API | نعم، يقدّم واجهة API فقط |
لا تتضمن حزمة التطبيق الواحد التطبيقين الآخرين. يقرأ الموقع ولوحة التحكم كل شيء من واجهة Hollina API، وكود واجهة API موجود فقط في حزمتي الحزمة الكاملة وواجهة API الخلفية.
باستخدام Docker
- Docker Desktop على macOS أو Windows، أو Docker Engine مع إضافة Compose على Linux، مع Docker Compose 2.24 أو أحدث، وهو ما يتضمنه كل Docker Desktop حاليًا؛ ويطبع
docker compose versionإصدارك. تبدأ الحزمة الكاملة بأمرdocker composeواحد، ويقرأdocker-compose.ymlالملفback-end/.envفقط عند وجوده، وهو إعداد ترفضه إصدارات Compose الأقدم. - اتصال بالإنترنت للبناء الأول، الذي ينزّل الصور الأساسية والاعتماديات.
- لا شيء آخر: يجلب Docker معه Node.js، وقاعدة البيانات ملف SQLite داخل وحدة تخزين Docker.
باستخدام Docker
- Docker Desktop على macOS أو Windows، أو Docker Engine على Linux. لتطبيقك ملف
Dockerfileخاص به؛ ولا حاجة إلى Compose. - اتصال بالإنترنت للبناء الأول، الذي ينزّل الصورة الأساسية والاعتماديات.
من دون Docker
- Node.js 22 أو أحدث، وهو الإصدار الذي يعلنه كل تطبيق في
engines. تعمل صور Docker على Node.js 24. تحقق من إصدارك بالأمرnode -v. - Yarn 4 عبر Corepack. شغّل
corepack enableمرة واحدة؛ يثبّت كل تطبيق إصدار Yarn الخاص به فيpackageManagerويشحنyarn.lockالخاص به، فيثبّتyarnالشجرة نفسها التي اختُبر بها القالب. إذا لم يكن في Node.js لديك Corepack (Node.js 25 وما بعده لا تضمه)، فثبّته أولًا بالأمرnpm install -g corepack. - لا حاجة إلى حزم عامة.
قاعدة البيانات
لا حاجة إلى خادم قاعدة بيانات. تستخدم واجهة API قاعدة SQLite افتراضيًا، وينشئ yarn seed الملف لك؛ ويستخدم Docker قاعدة SQLite أيضًا. الانتقال إلى MySQL مدعوم بتغيير في الإعدادات، لا بتغيير في الكود.
المنافذ
يعمل كل تطبيق على منفذ محلي ثابت. تأكد من أن لا شيء آخر يستخدمها، أو، مع Docker، انقل أحدها باستخدام SITE_PORT أو ADMIN_PORT أو API_PORT في ملف .env بجوار docker-compose.yml.
| التطبيق | المنفذ |
|---|---|
| API | 8000 |
| موقع الإقامات | 3030 |
| لوحة تحكم الحجوزات | 3031 |
المنفذ
يعمل الموقع على المنفذ 3030 ويتوقع واجهة API على 8000. تأكد من أن لا شيء آخر يستخدمهما.
المنفذ
تعمل لوحة التحكم على المنفذ 3031 وتتوقع واجهة API على 8000. تأكد من أن لا شيء آخر يستخدمهما.
المنفذ
تعمل واجهة API على المنفذ 8000، وتقبل افتراضيًا الموقع من 3030 ولوحة التحكم من 3031. تأكد من أن لا شيء آخر يستخدم المنفذ 8000.
واجهة API للربط
تطبيقك لا بيانات له بنفسه. يحتاج إلى واجهة Hollina API قيد التشغيل ومملوءة بالبيانات، وتضبط عنوانها في .env الخاص به أو تمرره كمعامل بناء. تُباع واجهة API كحزمة مستقلة هي واجهة API الخلفية، وهي جزء من الحزمة الكاملة.
الخدمات الاختيارية
لا شيء من هذه مطلوب لتشغيل نشاط الحجز محليًا. تُفعَّل كل واحدة بمتغيراتها في .env الخاص بواجهة API؛ والمتغير المتروك معلّقًا يُبقي ميزته متوقفة.
| الخدمة | من دونها |
|---|---|
| حساب Stripe، للدفع بالبطاقة | ما دام أي من المعالجين غير مضبوط، تذهب حجوزات البطاقة إلى المحاكي المرفق الذي يسوّيها دون الاتصال بأحد. مع PayPal وحده لا تُعرض البطاقة. |
| حساب PayPal للأعمال، للدفع عبر PayPal | ما دام أي من المعالجين غير مضبوط، تذهب حجوزات PayPal إلى المحاكي أيضًا. مع Stripe وحده لا يُعرض PayPal. الدفع عند الوصول لا يحتاج إلى حساب: هو مفتاح تبديل في لوحة التحكم. |
| Cloudflare R2 أو مخزن آخر متوافق مع S3 | تُخزَّن الملفات المرفوعة على قرص واجهة API نفسها (مع Docker، في وحدة تخزين البيانات)، وتخدم واجهة API الصور الأولية بنفسها. |
| مفتاح Google Gemini | يقول المساعد الذكي إنه غير متصل بعد، ولا يُحاسَب أي شيء. وكل شيء آخر يعمل. |
| مفتاح لخادم MCP | يرفض POST /api/mcp كل طلب. |
لا توجد خدمة بريد لإعدادها: واجهة API لا ترسل بريدًا إلكترونيًا. يرى الضيف ما حدث في الصفحة التي هو فيها، ويُخطَر الفريق المضيف في إشعارات لوحة التحكم.
الخرائط
ترسم صفحة الإقامة خريطة المنطقة التقريبية بنمط Positron من OpenFreeMap، وهو يحتاج إلى اتصال بالإنترنت وبلا مفتاح أو حساب. ولا يعد بأي وقت تشغيل، ويوجّه NEXT_PUBLIC_MAP_STYLE_LIGHT وNEXT_PUBLIC_MAP_STYLE_DARK الخريطة إلى نمط MapLibre آخر.