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

Velraمتغيرات البيئة

متغيرات البيئة

ما يفعله كل إعداد في ملفات .env الخاصة بواجهة API والواجهتين الأماميتين، وأيها تحتاج إليه.

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

أين توجد الإعدادات

الملفيقرؤهيحتوي على أسرار
back-end/.envواجهة API، مع yarn dev وداخل Docker Composeنعم. لا تضفه إلى المستودع أبدًا.
storefront/.envالموقع العام، وقت البناءلا. كل القيم عامة.
admin-dashboard/.envلوحة تحكم الوكالة، وقت البناءلا. كل القيم عامة.
.env بجوار docker-compose.ymlDocker Compose، للحزمة الكاملةلا

أنشئ ملف كل تطبيق من .env.example الموجود بجانبه، وهو يشرح كل متغير: cp .env.example .env. تعمل الأمثلة كما هي للتشغيل المحلي، ولا يحتاج تشغيل Docker Compose إلى أي ملف.

أين توجد الإعدادات

ملف واحد هو .env في مجلد الموقع، يُقرأ عند بناء الموقع. كل قيمة فيه عامة، فلا يحوي سرًا أبدًا. أنشئه من .env.example الذي يشير إلى واجهة API على http://localhost:8000: cp .env.example .env. مع Docker مرّر القيم نفسها بـ --build-arg.

أين توجد الإعدادات

ملف واحد هو .env في مجلد لوحة التحكم، يُقرأ عند بناء لوحة التحكم. كل قيمة فيه عامة، فلا يحوي سرًا أبدًا: مفاتيح المزودين في .env الخاص بواجهة API. أنشئه من .env.example الذي يشير إلى واجهة API على http://localhost:8000: cp .env.example .env. مع Docker مرّر القيم نفسها بـ --build-arg.

أين توجد الإعدادات

ملف واحد هو .env في مجلد واجهة API، تقرؤه واجهة API عند yarn dev، وتقرؤه الحاوية عندما تضيف --env-file .env -e NODE_ENV=production إلى docker run. يحوي أسرارًا: لا تضفه إلى المستودع أبدًا. أنشئه من .env.example الذي يشرح كل متغير ويعمل كما هو للتشغيل المحلي: cp .env.example .env.

تضبط صورة Docker قيمها الافتراضية بنفسها، لذلك يعمل docker run بدون ملف: SQLite في /data/database.sqlite، والملفات المرفوعة في /data/uploads، وCORS_ORIGIN للواجهتين الأماميتين المحليتين، وFRONTEND_URL=http://localhost:3031 وPUBLIC_MEDIA_URL=http://localhost:8000/media وSEED_DEMO_DATA=false. غيّر أيًّا منها بـ -e.

أساسيات واجهة API

تتحقق واجهة API من JWT_SECRET، ومن CORS_ORIGIN في الإنتاج، قبل أن تبدأ. إذا كان أحدهما ناقصًا أو غير صالح، تتوقف وتطبع سطرًا واحدًا يوضح ما يجب إصلاحه.

المتغيروظيفته
NODE_ENVdevelopment محليًا، وهو ينشئ الجداول ويحدّثها عند بدء التشغيل. وproduction على خادم مباشر، وهو لا يلمس الجداول أبدًا.
PORTمنفذ واجهة API، وهو 8000. تشير إليه الواجهتان الأماميتان.
DB_TYPEsqlite (كما في .env.example) أو mysql. إذا لم يُضبط فالمقصود MySQL، لذلك أبقِ السطر.
SQLITE_DATABASEمسار ملف SQLite، وهو ./database.sqlite افتراضيًا.
JWT_SECRETيوقّع كل جلسة تسجيل دخول. مطلوب. قيمة المثال مقبولة خارج الإنتاج فقط.
JWT_EXPIRATIONمدة صلاحية تسجيل الدخول، 7d افتراضيًا. تعيدها استجابة تسجيل الدخول باسم expires_in.
CORS_ORIGINعنوانا الموقع ولوحة التحكم، مفصولان بفاصلة. إذا لم يُضبط فلا يُسمح إلا بـ http://localhost:3030 وhttp://localhost:3031، وليس بكل الأصول أبدًا؛ مطلوب في الإنتاج.
FRONTEND_URLعنوان لوحة التحكم، وتتصل منه إشعاراتها المباشرة، وهو http://localhost:3031 عند عدم الضبط.
TRUST_PROXYاختياري. عدد الخوادم الوكيلة العكسية أمام واجهة API، حتى تحسب الحدود الخاصة بكل عنوان الزائرَ الحقيقي.
RATE_LIMIT_LOGINاختياري. عدد محاولات الدخول الفاشلة التي يمكن لعنوان واحد القيام بها خلال 15 دقيقة قبل 429، وهو 10 افتراضيًا.
SEED_DEMO_DATAتقرؤه صورة Docker فقط، على وحدة تخزين لا تحوي قاعدة بيانات بعد: true تنشئها مع الوكالة التجريبية، وfalse بالجداول فقط.

ولّد JWT_SECRET خاصًا بك بالأمر:

الطرفية
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"

كل ميزة اختيارية أدناه تبقى متوقفة ما دامت أسطرها في .env.example معلّقة كتعليقات.

استخدم MySQL بدلًا من SQLite

أنشئ قاعدة بيانات فارغة، ثم اضبط المشغّل والاتصال في ملف .env الخاص بواجهة API:

ملف .env الخاص بواجهة API
DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=
DB_DATABASE=velra

ثم شغّل yarn seed للوكالة التجريبية، أو yarn db:sync للجداول بلا بيانات. لا تنشئ واجهة API العاملة الجداول ولا تحدّثها بنفسها إلا عندما يكون NODE_ENV=development، لذلك مع NODE_ENV=production يجب تشغيل أحد هذين الأمرين قبل التشغيل الأول (yarn seed:prod أو yarn db:sync:prod بعد yarn build).

الصور والملفات المرفوعة

تقدّم واجهة API الصور الأولية بنفسها، من public/media/velra، على /media/velra/…. أما الملفات المرفوعة من لوحة التحكم (صور العقارات، وصور الغرف للاستوديو، والمعاينات المؤثثة، وصور الملفات الشخصية) فتُخزَّن على قرص واجهة API تحت MEDIA_UPLOAD_DIR وتُقدَّم على /media/uploads/…، ما لم تُضبط حاوية تخزين.

ملف .env الخاص بواجهة API
PUBLIC_MEDIA_URL=http://localhost:8000/media
MEDIA_UPLOAD_DIR=./public/media/uploads

PUBLIC_MEDIA_URL هو العنوان الذي يُوصَل إلى /media منه من المتصفح. يُبنى منه عنوان كل صورة، وتنقل واجهة API المخزَّن منها إليه عند بدئها، لذلك ينقل تحريك واجهة API كل الصور معها. على الخادم وجّه MEDIA_UPLOAD_DIR إلى تخزين دائم؛ ومع Docker يكون في وحدة البيانات.

لإرسال الملفات المرفوعة إلى Cloudflare R2 أو أي حاوية متوافقة مع S3، اضبط المتغيرات الخمسة كلها. أعطِ الواجهتين الأماميتين المضيف العام للحاوية عبر NEXT_PUBLIC_MEDIA_HOSTNAME (مع Docker Compose هو MEDIA_HOSTNAME) ليغيّر Next.js أحجام تلك الصور.

ملف .env الخاص بواجهة API
R2_ACCESS_KEY_ID=your-r2-access-key-id
R2_SECRET_ACCESS_KEY=your-r2-secret-access-key
R2_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
R2_BUCKET_NAME=your-bucket-name
R2_PUBLIC_URL=https://your-public-url.r2.dev

تُعاد ترميز الصور عند الرفع بعرض لا يتجاوز 1920 بكسل، مع نسخة أصغر لبطاقات العقارات. تُقبل مقاطع الفيديو بصيغة MP4 أو WebM أو MOV أو M4V، حتى 150 ميغابايت.

الموقع العام ولوحة تحكم الوكالة

كل قيمة NEXT_PUBLIC_* تُضمَّن في كود JavaScript الذي يحمّله المتصفح، ويستطيع أي شخص يفتح الصفحة قراءتها. لا تضع أي سر في هذه الملفات أبدًا، وأعد البناء بعد تغيير أي قيمة.

المتغيرالتطبيقوظيفته
NEXT_PUBLIC_API_BASE_URLكلاهماعنوان واجهة API مع /api، وهو http://localhost:8000/api افتراضيًا.
NEXT_PUBLIC_SITE_URLكلاهماالعنوان العام للموقع، وهو http://localhost:3030 افتراضيًا. في الموقع تُبنى منه الروابط الأساسية، وبدائل اللغات، وبطاقات المشاركة، وrobots.txt، وخريطة الموقع؛ وفي لوحة التحكم رابط «عرض الموقع» ومعاينة العقار.
NEXT_PUBLIC_MEDIA_HOSTNAMEكلاهمااختياري. مضيفات https التي تقدّم الصور، مفصولة بفواصل: المضيف العام لحاوية التخزين، مثل pub-1234.r2.dev، أو نطاق واجهة API، أو كلاهما. تُغيَّر أحجام الصور عليها بواسطة Next.js؛ وتُحمَّل أي صورة أخرى كما هي. مضيفات فقط، بدون https://. يقرأ التطبيقان القائمة نفسها، فقيمة واحدة تخدمهما. اتركه فارغًا ما دامت واجهة API تعمل على localhost.
NEXT_PUBLIC_WEBSOCKET_BASE_URLلوحة التحكمعنوان واجهة API من دون /api، للإشعارات المباشرة.
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARKلوحة التحكمأنماط بلاطات الخريطة اختيارية. إذا لم تُضبط، يرسم المظهران نمط Positron من OpenFreeMap، وهو لا يحتاج إلى مفتاح.
NEXT_PUBLIC_PLACE_SEARCH_URLلوحة التحكمبحث الأماكن في تبويب «الموقع» بمحرر العقار، وهو https://photon.komoot.io/api في .env.example. يعمل أي مرمّز جغرافي يردّ بالشكل نفسه.
API_INTERNAL_URLالموقعاختياري، للخادم فقط، ويُقرأ وقت التشغيل وليس وقت البناء. هو المكان الذي يصل منه خادم الموقع نفسه إلى واجهة API عندما لا يعمل عنوان المتصفح من داخله، كما في Docker (http://api:8000/api في Docker Compose). اتركه بلا ضبط في غير ذلك.
BUILD_STANDALONEكلاهماالقيمة true تجعل yarn build يُخرج خادمًا مستقلًا بذاته، وهي القيمة التي تضبطها ملفات Dockerfile. اتركه غير مضبوط في غير ذلك.

أوسمة التسويق في الموقع هي أيضًا قيم NEXT_PUBLIC_*: Google Tag Manager وGA4 وMeta وTikTok وSnapchat وPinterest، ويُفعَّل كل منها بمعرّف واحد.

خيارات Docker Compose

لا تحتاج إلى ضبط أي شيء للتشغيل المحلي. لتغيير شيء، ضعه في ملف .env بجوار docker-compose.yml وشغّل docker compose up --build مرة أخرى: تُضمِّن الواجهات الأمامية هذه القيم.

المتغيرالقيمة الافتراضيةوظيفته
SITE_PORT3030منفذ الموقع على جهازك.
ADMIN_PORT3031منفذ لوحة التحكم على جهازك.
API_PORT8000منفذ واجهة API على جهازك.
SITE_URL, ADMIN_URL, API_URLالعناوين المحلية على هذه المنافذالعنوان الذي يصل منه المتصفح إلى كل تطبيق. اضبط الثلاثة عند تشغيل التطبيقات على نطاقاتك الخاصة.
MEDIA_HOSTNAMEفارغمضيفات https التي تقدّم الصور، مفصولة بفواصل: المضيف العام لحاوية التخزين (مع متغيرات R2_* في back-end/.env)، أو نطاق واجهة API نفسه، أو كلاهما.
SEED_DEMO_DATAtrueتبدأ false بجداول فارغة وبلا حسابات بدل الوكالة التجريبية. ولا يهم إلا على وحدة تخزين جديدة.
NEXT_PUBLIC_GTM_ID, NEXT_PUBLIC_GA4_MEASUREMENT_ID, NEXT_PUBLIC_META_PIXEL_ID, NEXT_PUBLIC_TIKTOK_PIXEL_ID, NEXT_PUBLIC_SNAPCHAT_PIXEL_ID, NEXT_PUBLIC_PINTEREST_TAG_IDفارغوسوم التسويق في الموقع، وكلها اختيارية.
NEXT_PUBLIC_ANALYTICS_CURRENCY, NEXT_PUBLIC_ANALYTICS_DEBUGAED, falseالعملة المرسلة مع كل سعر يُتتبَّع، وتسجيل كل حدث في وحدة تحكم المتصفح.
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARK, NEXT_PUBLIC_PLACE_SEARCH_URLفارغبلاطات خريطة لوحة التحكم وبحث الأماكن؛ وإذا تُرك فارغًا استُخدم OpenFreeMap وPhoton.

غيّر المنفذ عندما يستخدمه برنامج آخر، مثل ADMIN_PORT=3041. تُبنى كل من CORS_ORIGIN وFRONTEND_URL وPUBLIC_MEDIA_URL في واجهة API، وعنوانا واجهة API والموقع في الواجهتين الأماميتين، من المنافذ والعناوين الثلاثة، فتتبعها تلقائيًا.

تقرأ حاوية واجهة API الملف back-end/.env أيضًا عند وجوده، لذلك تُضبط المفاتيح الاختيارية في مكان واحد لـ yarn dev ولـ Docker معًا. ويتغلب ملف compose في القيم التي تختلف داخل الحاوية: مسار قاعدة البيانات، ومجلد الملفات المرفوعة، والمنفذ، وNODE_ENV=production والعناوين أعلاه. وقاعدة البيانات والملفات المرفوعة في وحدة التخزين velra-data.

ميزات الذكاء الاصطناعي

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

تشغيل المساعد الذكي واستوديو التأثيث بالذكاء الاصطناعي: مفاتيح المزودين ونموذج الصور.

خادم MCP

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

السماح لوكلاء البرمجة وعملاء MCP الآخرين باستخدام أدوات المساعد: المفتاح ونقطة النهاية.

وضع العرض التجريبي

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

مفتاح التبديل لعرض تجريبي عام، ولماذا يبقى معطلًا لوكالة حقيقية.

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

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

حل المشكلات

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

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