متغيرات البيئة
ما يفعله كل إعداد في ملفي .env الخاصين بواجهة API ولوحة التحكم، وأيها تحتاج إليه.
لحزمة الحزمة الكاملة
أين توجد الإعدادات
| الملف | يقرؤه | يحتوي على أسرار |
|---|---|---|
back-end/.env | واجهة API، مع yarn dev وداخل Docker Compose | نعم. لا تضفه إلى المستودع أبدًا. |
dashboard/.env | لوحة التحكم، وقت البناء | لا. كل القيم عامة. |
.env بجوار docker-compose.yml | Docker Compose، للحزمة الكاملة | لا |
أنشئ ملف كل تطبيق من .env.example الموجود بجواره، والذي يشرح كل متغير: cp .env.example .env. تعمل الأمثلة كما هي للتشغيل المحلي، باستثناء عنواني واجهة API في لوحة التحكم، اللذين تملؤهما لترك البيانات التجريبية.
أين توجد الإعدادات
ملف واحد، .env في مجلد لوحة التحكم، يُقرأ عند بناء لوحة التحكم. كل قيمة فيه عامة، لذا لا يحتوي أبدًا على سر. اتركه لتعمل على البيانات التجريبية؛ وأنشئه من .env.example عندما تربط واجهة API: cp .env.example .env.
أين توجد الإعدادات
ملف واحد، .env في مجلد واجهة API، تقرؤه واجهة API مع yarn dev، وتقرؤه الحاوية عندما تمرّره بـ --env-file .env. يحتوي على أسرار: لا تضفه إلى المستودع أبدًا. أنشئه من .env.example، الذي يشرح كل متغير ويعمل كما هو للتشغيل المحلي: cp .env.example .env.
أساسيات واجهة API
تتحقق واجهة API من JWT_SECRET ومن CORS_ORIGIN في الإنتاج قبل أن تبدأ. إذا كان أحدهما مفقودًا أو غير صالح، تتوقف بسطر واحد يذكر ما يجب إصلاحه. المتغيرات المضبوطة مسبقًا في البيئة لها الأولوية على الملف.
| المتغير | وظيفته |
|---|---|
NODE_ENV | development محليًا، وهو ينشئ الجداول ويحدّثها عند البدء. production على خادم مباشر، وهو يشغّل عمليات الترحيل عند البدء ولا يعيد كتابة المخطط أبدًا. |
PORT | منفذ واجهة API، 8000. |
DB_TYPE | sqlite (وهو ما يضبطه .env.example) أو mysql. |
SQLITE_DATABASE | مسار ملف SQLite، ./database.sqlite، نسبةً إلى المجلد الذي يُشغَّل فيه الأمر. |
JWT_SECRET | يوقّع كل جلسة تسجيل دخول. مطلوب. قيمة المثال مقبولة خارج الإنتاج فقط. |
JWT_EXPIRATION | مدة صلاحية تسجيل الدخول، وهي 7d افتراضيًا. |
CORS_ORIGIN | عنوان لوحة التحكم، مع فصل العناوين بفواصل إذا كانت متعددة. إذا لم يُضبط، يعود إلى http://localhost:3030، ولا يعود أبدًا إلى *؛ وهو مطلوب في الإنتاج. |
FRONTEND_URL | اختياري. عنوان لوحة التحكم للمقبسين المباشرين (أحداث تسجيل الدخول وجرس الإشعارات). إذا لم يُضبط، تقبل المقابس العناوين نفسها الموجودة في CORS_ORIGIN. |
TRUST_PROXY | اختياري. مدى ثقة واجهة API بـ X-Forwarded-For عند عدّ محاولات تسجيل الدخول لكل زائر. عدم ضبطه أو auto يقرؤه فقط من خادم وكيل على عنوان خاص؛ وfalse لا يقرؤه أبدًا؛ والرقم يثق بذلك العدد من الخوادم الوكيلة بالضبط. |
ولّد JWT_SECRET خاصًا بك بالأمر:
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"أي بيانات اعتماد للتخزين أو للذكاء الاصطناعي أدناه لا تزال تحمل قيمتها نفسها في .env.example تُعدّ غير مضبوطة، لذا تُبلغ الميزة التي تخصها بأنها متوقفة بدلًا من أن تفشل عند أول استدعاء لها.
استخدم MySQL بدلًا من SQLite
أنشئ قاعدة بيانات فارغة، ثم اضبط برنامج التشغيل والاتصال في back-end/.env:
DB_TYPE=mysql
DB_HOST=your-mysql-host
DB_PORT=3306
DB_USERNAME=your-mysql-username
DB_PASSWORD=your-mysql-password
DB_DATABASE=your-database-nameثم شغّل yarn seed للبيانات التجريبية، أو yarn db:sync للجداول من دون بيانات. لا تنشئ واجهة API قيد التشغيل الجداول وتحدّثها بنفسها إلا عندما يكون NODE_ENV=development، لذا مع NODE_ENV=production يُشغَّل أحد هذين الأمرين قبل التشغيل الأول (yarn db:sync:prod أو yarn seed:prod بعد yarn build)، ثم yarn db:sync:prod مرة أخرى بعد كل تحديث يغيّر المخطط. وهو يحافظ على بياناتك.
يأتي القالب بملف ترحيل لـ SQLite فقط. يحتوي back-end/src/database/migrations/mysql/README.md على الأمر الوحيد الذي يولّد ملف ترحيل MySQL، إذا أردت أن تعمل عمليات ترحيل بدء التشغيل في واجهة API على MySQL أيضًا.
لوحة التحكم
كل قيمة NEXT_PUBLIC_* تُضمَّن في JavaScript الذي يحمّله المتصفح، ويستطيع أي شخص يفتح الصفحة قراءتها. لا تضع أبدًا سرًا في هذا الملف، وأعد التشغيل أو أعد البناء بعد تغيير أي قيمة.
| المتغير | وظيفته |
|---|---|
PORT | المنفذ الذي يرتبط به yarn dev وyarn start، وهو 3030. إذا لم يُضبط، يبقى 3030. |
NEXT_PUBLIC_API_BASE_URL | عنوان واجهة API متضمنًا /api، مثل http://localhost:8000/api. ضبطه هو ما يوقف البيانات التجريبية؛ وإذا كان فارغًا أو مفقودًا، تعمل لوحة التحكم على بياناتها التجريبية. |
NEXT_PUBLIC_WEBSOCKET_BASE_URL | عنوان واجهة API من دون /api، للإشعارات المباشرة وتحديثات الصلاحيات. اختياري: إذا كان فارغًا يُؤخذ من NEXT_PUBLIC_API_BASE_URL. |
NEXT_PUBLIC_MEDIA_HOSTNAME | المضيف العام لحاوية الوسائط الخاصة بك، أي مضيف R2_PUBLIC_URL، من دون https://. يُعاد تحجيم الصور القادمة منه وضغطها. اتركه فارغًا إلى أن تكون لديك حاوية. |
NEXT_PUBLIC_DEMO_MODE | false. يجب أن يطابق DEMO_MODE في ملف .env الخاص بواجهة API؛ وtrue مخصص للعرض التجريبي العام فقط. |
BUILD_STANDALONE | true يجعل yarn build ينتج خادمًا مستقلًا بذاته، وهو ما يضبطه Dockerfile. اتركه غير مضبوط في غير ذلك. |
لا مكان هنا لأي مفتاح لمزوّد ذكاء اصطناعي. المفاتيح توجد في ملف .env الخاص بواجهة API فقط.
خيارات Docker Compose
لا يلزم ضبط أي شيء للتشغيل المحلي. لتغيير شيء ما، ضعه في ملف .env بجوار docker-compose.yml وشغّل docker compose up --build مرة أخرى: تُضمّن لوحة التحكم هذه القيم.
| المتغير | وظيفته |
|---|---|
DASHBOARD_PORT, API_PORT | المنافذ على جهازك: 3030 و8000 افتراضيًا. اضبط أحدها عندما يستخدم برنامج آخر ذلك المنفذ بالفعل، مثل DASHBOARD_PORT=3040. تتبعها العناوين أدناه وCORS_ORIGIN وFRONTEND_URL. |
DASHBOARD_URL, API_URL | المكان الذي يصل منه المتصفح إلى كل تطبيق. اضبط الاثنين عند تقديم الحزمة على نطاقاتك الخاصة؛ إذ تُبنى منهما قيم CORS_ORIGIN وFRONTEND_URL في واجهة API وعناوين واجهة API في لوحة التحكم. |
MEDIA_HOSTNAME | المضيف العام لمخزنك، مع متغيرات R2_* في back-end/.env. |
SEED_DEMO_DATA | false يبدأ بجداول فارغة بدلًا من البيانات التجريبية. |
تقرأ حاوية واجهة API أيضًا back-end/.env عند وجوده، لذا تُضبط مفاتيح التخزين والذكاء الاصطناعي و MCP في مكان واحد لكل من yarn dev و Docker. يتقدّم ملف compose في القيم التي تختلف داخل الحاوية: NODE_ENV=production، والمنفذ، و SQLite على /data/database.sqlite، وDEMO_MODE=false، وCORS_ORIGIN وFRONTEND_URL. من دون JWT_SECRET خاص بك، تولّد واجهة API سرًا وتحفظه في وحدة تخزين البيانات. توجد البيانات في وحدة التخزين kinora-data.
صورة Docker الخاصة بواجهة API
تبدأ الصورة في وضع الإنتاج على SQLite في /data/database.sqlite، والمنفذ 8000، مع DEMO_MODE=false وSEED_DEMO_DATA=false، وتسمح باستدعاءات المتصفح من http://localhost:3030 (CORS_ORIGIN وFRONTEND_URL). غيّر أيًا منها بـ -e في docker run، أو مرّر ملفك بـ --env-file .env.
- على وحدة تخزين جديدة تنشئ الحاوية الجداول، ولا تضيف البيانات التجريبية إلا مع
SEED_DEMO_DATA=true. وتُترك قاعدة البيانات الموجودة كما هي. - من دون
JWT_SECRET، أو مع قيمة المثال، تولّد سرًا وتحفظه في/data/.jwt-secret، فتبقى جلسات تسجيل الدخول بعد إعادة التشغيل. - مع
DB_TYPE=mysqlلا تنشئ شيئًا: شغّلnode dist/database/sync-schema.jsأوnode dist/database/seeder.jsفي الحاوية مرة واحدة بنفسك.
تخزين الوسائط
تُرفع الصور الشخصية وصور التقدم وأغلفة المجموعات ومرفقات الرسائل إلى حاوية Cloudflare R2، أو أي حاوية متوافقة مع S3. اضبط المتغيرات الخمسة في back-end/.env وأعطِ لوحة التحكم المضيف العام للحاوية عبر NEXT_PUBLIC_MEDIA_HOSTNAME (ومع Docker Compose، MEDIA_HOSTNAME).
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من دون حاوية، كل ما يكتبه الزرع هو مسار /assets/images/… تقدّمه لوحة التحكم من مجلدها public/assets، لذا تُعرض كل شاشة من دون رفع أي شيء. يتوقف فقط رفع الملفات الجديدة: يُرجع الرفع 400 إلى أن تُضبط الحاوية. أبقِ public/assets في لوحة التحكم ما دام أي صف لا يزال يشير إليه.
الحد الأقصى للملف 150 MB. ترسل أداة الرفع في لوحة التحكم الملفات الكبيرة على أجزاء يصل كل منها إلى 16 MB عبر POST /api/helpers/upload-chunk، تلقائيًا.
البريد الإلكتروني
لا يأتي القالب بناقل بريد، لذا لا تُرسَل أي رسالة بالبريد الإلكتروني أبدًا. يجيب زر "resend verification email" في شاشة الأعضاء من دون إرسال أي شيء، وصفحتا نسيان كلمة المرور وإعادة تعيينها واجهتان فقط: لا يُرسَل أي رابط لإعادة التعيين، ولا يوجد في واجهة API أي مسار خلفهما. اربط مزوّد البريد الخاص بك، وأضف مسارات إعادة التعيين، قبل الإطلاق إذا كان أعضاؤك يحتاجون إلى أي منهما.
المساعد الذكي
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
تفعيل المساعد الذكي: مفاتيح المزوّدين والنماذج التي يقدمها كل منهم.
خادم MCP
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
المفتاح الذي يرسله وكيل البرمجة للوصول إلى أدوات المساعد.
وضع العرض التجريبي
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
تشغيل عرض تجريبي عام: مفتاح وضع العرض التجريبي، وحصة رسائل الزوار، وحد الحسابات.
الإطلاق
قبل النشر على أي مكان عام:
- اضبط
NODE_ENV=productionوJWT_SECRETعشوائيًا وطويلًا خاصًا بك فيback-end/.env. - اضبط
CORS_ORIGINعلى عنوان لوحة التحكم الخاصة بك، وFRONTEND_URLعلى العنوان نفسه. - أبقِ
DEMO_MODE=falseفي واجهة API وNEXT_PUBLIC_DEMO_MODE=falseفي لوحة التحكم. - على قاعدة بيانات فارغة، شغّل
yarn build، ثمyarn db:sync:prodمرة واحدة (أوyarn seed:prodللبيانات التجريبية)، ثمyarn start:prod. - وجّه فحص السلامة لدى مستضيفك إلى
GET /api/health. لا يحتاج إلى رمز ولا يخضع لتحديد المعدل. - ابنِ لوحة التحكم مع توجيه
NEXT_PUBLIC_API_BASE_URLوNEXT_PUBLIC_WEBSOCKET_BASE_URLإلى واجهة API المنشورة. - غيّر كلمات المرور المزروعة، أو ابدأ من جداول فارغة.
ليس لقاعدة بيانات فيها أعضاء حقيقيون
يبني yarn setup:fresh، ويحذف كل الجداول ويعيد الزرع، في كل مرة يُشغَّل فيها. استخدمه لإعداد بيئة من الصفر، ولا تستخدمه أبدًا كأمر بناء أو تشغيل لمنتج مباشر.
لحذف شيفرة العرض التجريبي بالكامل، شغّل yarn remove:demo في التطبيقين، على شجرة نظيفة: لا يمكن التراجع عنه من دون نظام إدارة الإصدارات. يحذف yarn remove:mock في لوحة التحكم البيانات التجريبية.