شغّل تيكيتوري محليًا
ثبّت كل تطبيق وشغّله باستخدام Node.js و Yarn، بطرفية مستقلة لكل تطبيق.
لحزمة الحزمة الكاملة
قبل أن تبدأ: ثبّت Node.js 22 أو أحدث وشغّل corepack enable مرة واحدة (على Node.js 25 وما بعده، التي لا تضم Corepack، شغّل npm install -g corepack أولًا). لا حاجة إلى خادم قاعدة بيانات.
افتح كل طرفية في المكان الذي تتوقعه الأوامر أدناه: داخل ticketory-full-stack للحزمة الكاملة، أو بجانب مجلد التطبيق لحزمة التطبيق الواحد.
| التطبيق | المجلد | العنوان |
|---|---|---|
| API | back-end | localhost:8000محلي |
| الموقع العام | storefront | localhost:3030محلي |
| لوحة المنظّم | admin-dashboard | localhost:3031محلي |
شغّل واجهة API أولًا: تقرأ الواجهتان الأماميتان كل بياناتهما منها.
شغّل واجهة API
ثبّت واضبط الإعداد
يعمل
.env.exampleكما هو للتطوير المحلي: SQLite على المنفذ8000.الطرفيةcorepack enable cd back-end yarn install cp .env.example .envتواجه مشكلة؟أنشئ قاعدة البيانات
يتحقق
yarn seedمن وجود كل صورة تجريبية فيpublic/media، ثم ينشئdatabase.sqliteوجداوله وأربعة منظّمين تجريبيين، لكل منهم مساحة عمل: 29 صلاحية، وأدوار المالك والمدير والمالية وتسجيل الدخول، و9 أماكن، و36 فعالية (22 منها على الموقع)، و1,145 طلبًا، و14 حساب موظف، وحاضرًا لديه ثمانية طلبات. وينتهي بطباعة بيانات دخول المالك والحاضر. تتبع التواريخ اليوم الذي تشغّل فيه الأمر. تشغيله مرة أخرى لا يضيف صفوفًا ولا يعيد ضبط أي كلمة مرور، لكنه يعيد الأدوار الأربعة الجاهزة إلى صلاحياتها الافتراضية.الطرفيةفيback-endyarn seedشغّل الخادم
الطرفيةفيback-endyarn devالنتيجة المتوقعة: يجيب localhost:8000/
تواجه مشكلة؟api/ healthمحلي بـ "status":"ok"و"database":"up".
شغّل واجهة API
ثبّت واضبط الإعداد
يعمل
.env.exampleكما هو للتطوير المحلي: SQLite على المنفذ8000.الطرفيةcorepack enable cd ticketory-backend yarn install cp .env.example .envتواجه مشكلة؟أنشئ قاعدة البيانات
يتحقق
yarn seedمن وجود كل صورة تجريبية فيpublic/media، ثم ينشئdatabase.sqliteوجداوله وأربعة منظّمين تجريبيين، لكل منهم مساحة عمل: 29 صلاحية، وأدوار المالك والمدير والمالية وتسجيل الدخول، و9 أماكن، و36 فعالية (22 منها على الموقع)، و1,145 طلبًا، و14 حساب موظف، وحاضرًا لديه ثمانية طلبات. وينتهي بطباعة بيانات دخول المالك والحاضر. تتبع التواريخ اليوم الذي تشغّل فيه الأمر. تشغيله مرة أخرى لا يضيف صفوفًا ولا يعيد ضبط أي كلمة مرور، لكنه يعيد الأدوار الأربعة الجاهزة إلى صلاحياتها الافتراضية.الطرفيةفيticketory-backendyarn seedشغّل الخادم
الطرفيةفيticketory-backendyarn devالنتيجة المتوقعة: يجيب localhost:8000/
تواجه مشكلة؟api/ healthمحلي بـ "status":"ok"و"database":"up".
شغّل الموقع العام
في طرفية ثانية:
ثبّت واضبط الإعداد
يوجّه ملف
.envالمنسوخ الموقعَ إلى واجهة API على المنفذ8000.الطرفيةcd storefront yarn install cp .env.example .envشغّله
الطرفيةفيstorefrontyarn devالنتيجة المتوقعة: يفتح localhost:3030محلي الموقع بالإنجليزية مع الفعاليات التجريبية؛ والنسخة العربية على
تواجه مشكلة؟/ar.
شغّل الموقع العام
واجهة API ليست جزءًا من هذه الحزمة. شغّلها أولًا؛ يتوقعها ملف .env المنسوخ على http://localhost:8000/api.
ثبّت واضبط الإعداد
إذا كانت واجهة API تعمل في مكان آخر، اضبط
NEXT_PUBLIC_API_BASE_URLفي.envعلى عنوانها، مع/api.الطرفيةcorepack enable cd ticketory-website yarn install cp .env.example .envتواجه مشكلة؟شغّله
الطرفيةفيticketory-websiteyarn devالنتيجة المتوقعة: يفتح localhost:3030محلي الموقع بالفعاليات القادمة من واجهة API لديك؛ والنسخة العربية على
تواجه مشكلة؟/ar.
شغّل لوحة المنظّم
في طرفية ثالثة:
ثبّت واضبط الإعداد
يوجّه ملف
.envالمنسوخ لوحة التحكم إلى واجهة API وإشعاراتها المباشرة على المنفذ8000.الطرفيةcd admin-dashboard yarn install cp .env.example .envشغّلها وسجّل الدخول
ينسخ
yarn devأولًا عامل مكتبة الخرائط إلىpublic/maplibre/، ثم يشغّل لوحة التحكم.الطرفيةفيadmin-dashboardyarn devالنتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بالبريد
تواجه مشكلة؟owner@example.testوكلمة المرورDemoOnly!2026.
شغّل لوحة المنظّم
واجهة API ليست جزءًا من هذه الحزمة. شغّلها أولًا؛ يتوقعها ملف .env المنسوخ على http://localhost:8000/api.
ثبّت واضبط الإعداد
إذا كانت واجهة API تعمل في مكان آخر، اضبط
NEXT_PUBLIC_API_BASE_URL(مع/api) وNEXT_PUBLIC_WEBSOCKET_BASE_URL(من دونه) في.envعلى عنوانها.الطرفيةcorepack enable cd ticketory-dashboard yarn install cp .env.example .envتواجه مشكلة؟شغّلها وسجّل الدخول
الطرفيةفيticketory-dashboardyarn devالنتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بالبريد
تواجه مشكلة؟owner@example.testوكلمة المرورDemoOnly!2026، وهما مقبولان في واجهة API التي فيها بيانات تجريبية.
منافذ أخرى
من دون Docker تكون المنافذ ثابتة داخل الملفات. يمرّر سكربتا dev وstart للموقع في package.json الخيار -p 3030، ويمرّر سكربتا اللوحة الخيار -p 3031: غيّر الرقم هناك لنقل أحدهما، ثم أضف العنوان الجديد إلى CORS_ORIGIN في .env الخاص بواجهة API، واضبط هناك STOREFRONT_URL إذا نقلت الموقع، أو FRONTEND_URL إذا نقلت اللوحة. ولنقل واجهة API اضبط PORT وPUBLIC_MEDIA_URL وPUBLIC_API_URL في .env الخاص بها على الرقم نفسه، واضبط NEXT_PUBLIC_API_BASE_URL في التطبيقين الأماميين (وكذلك NEXT_PUBLIC_WEBSOCKET_BASE_URL في اللوحة).
بناء الإنتاج
المجلدات نفسها، تُبنى مرة واحدة ثم تُشغَّل. اضبط أولًا .env الخاص بواجهة API للإنتاج: مع NODE_ENV=production لا تغيّر واجهة API الجداول عند التشغيل، وترفض البدء ما دام JWT_SECRET فارغًا أو ما زال قيمة المثال، أو ما دام CORS_ORIGIN فارغًا.
NODE_ENV=production
JWT_SECRET=paste-the-generated-secret-here
CORS_ORIGIN=http://localhost:3030,http://localhost:3031
FRONTEND_URL=http://localhost:3031
STOREFRONT_URL=http://localhost:3030
PUBLIC_API_URL=http://localhost:8000
PUBLIC_MEDIA_URL=http://localhost:8000/mediaولّد السر بالأمر node -e "console.log(require('crypto').randomBytes(48).toString('hex'))". ثم، داخل مجلد واجهة API، ابنها وأنشئ جداولها مرة واحدة وشغّلها. يضيف yarn seed:prod المنظّمين التجريبيين وحساباتهم؛ أما yarn db:sync:prod فينشئ بدلًا منه جداول فارغة بلا حسابات.
yarn build
yarn seed:prod
yarn start:prodبناء الإنتاج للواجهات الأمامية
في مجلد كل واجهة أمامية، ابنِ مرة واحدة ثم شغّل. يعمل الموقع على 3030 ولوحة التحكم على 3031.
yarn build
yarn startتدمج الواجهتان الأماميتان ملف .env عند البناء، لذلك شغّل yarn build مرة أخرى بعد تغييره. قبل النشر في أي مكان عام، اقرأ دليل النشر.
ابدأ من جديد ببيانات تجريبية جديدة
أوقف واجهة API، ثم احذف ملف قاعدة البيانات واملأه بالبيانات مرة أخرى، داخل مجلد واجهة API. هذا يحذف كل ما أنشأته.
rm -f database.sqlite* && yarn seedفي PowerShell:
Remove-Item database.sqlite*; yarn seed