شغّل تيكيتوري محليًا
شغّل حزمتك على جهازك باستخدام Docker.
لحزمة الحزمة الكاملة
قبل أن تبدأ: ثبّت Docker Desktop وافتحه، أو Docker Engine مع Compose.
اطّلع على المتطلباتنزّل قالبك
افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بحزمتك.
النتيجة المتوقعة: يوجد في مجلد التنزيلات ملف باسم يشبه
ticketory-full-stack-….zip.فك الضغط وافتح المجلد
افتح طرفية في المكان الذي فيه ملف ZIP، وفك ضغطه، وادخل إلى المجلد
ticketory-full-stack. على Windows يمكنك فك الضغط في مستكشف الملفات، ثم فتح طرفية داخل المجلد.الطرفيةunzip -q ticketory-full-stack-*.zip cd ticketory-full-stack lsالنتيجة المتوقعة: يعرض المجلد
تواجه مشكلة؟admin-dashboardوback-endوstorefrontوdocker-compose.yml، إلى جانبREADME.mdوQUICKSTART.mdوLICENSE.md.شغّل التطبيقات
ابنِ واجهة API والموقع العام ولوحة المنظّم وشغّلها. لا شيء يحتاج إلى ضبط قبل ذلك. يبني أول تشغيل ثلاث صور ويملأ قاعدة البيانات بالمنظّمين التجريبيين وفعالياتهم، وهذا يستغرق بضع دقائق؛ أما التشغيلات التالية فتستغرق ثوانيَ.
الطرفيةفيticketory-full-stackdocker compose up --buildالمنفذ مستخدم بالفعل؟
إذا توقف التشغيل برسالة
المنفذ مستخدم بالفعلports are not availableأوaddress already in useأوport is already allocated، فهناك برنامج آخر يستخدم 3030 أو 3031 أو 8000. أوقفه، أو أنشئ ملفًا باسم.envفي المجلدticketory-full-stackبجانبdocker-compose.yml، وضع فيه المنفذ الذي تحتاجه، مثلADMIN_PORT=3041(وSITE_PORTللموقع وAPI_PORTلواجهة API). شغّلdocker compose up --buildمرة أخرى وافتح التطبيق على منفذه الجديد.النتيجة المتوقعة: تبقى الخدمات الثلاث قيد التشغيل ويتوقف السجل عن التمرير. اترك هذه الطرفية مفتوحة.
تواجه مشكلة؟افتح الموقع العام
افتح localhost:3030محلي. النسخة الإنجليزية على
/enوالعربية على/ar. يستطيع أي شخص الشراء من دون حساب؛ ولرؤية تذاكر الحاضر وطلباته وفعالياته المحفوظة، سجّل الدخول بالبريدattendee@example.testوكلمة المرورDemoOnly!2026.النتيجة المتوقعة: يفتح الموقع على صفحته الرئيسية مع الفعاليات التجريبية وصورها.
تواجه مشكلة؟سجّل الدخول إلى لوحة المنظّم
افتح localhost:3031محلي. سجّل الدخول بالبريد
owner@example.testوكلمة المرورDemoOnly!2026. كل حساب تجريبي يستخدم كلمة المرور هذه؛ غيّرها قبل أن يصبح التطبيق متاحًا من الإنترنت.النتيجة المتوقعة: تفتح اللوحة على نظرة عامة فيها مبيعات التذاكر والباب المباشر والفعاليات القادمة.
تواجه مشكلة؟
جولة سريعة
شكل المنظّمين التجريبيين بعد تشغيل كل شيء.
| الحساب | البريد الإلكتروني | المكان |
|---|---|---|
| المالك: كل شيء، بما في ذلك الاستردادات والفريق والأدوار والإعدادات | owner@example.test | لوحة التحكم |
| المدير: الفعاليات والأماكن وتسجيل الدخول والتقارير والاستفسارات والاستوديو والمساعد؛ والطلبات للقراءة فقط | manager@example.test | لوحة التحكم |
| المالية: النظرة العامة والطلبات والاستردادات وإعادة إصدار التذاكر وإلغاؤها والتقارير | finance@example.test | لوحة التحكم |
| تسجيل الدخول: الباب فقط، للجلسات المسندة إليه | checkin@example.test | لوحة التحكم |
| الحاضر تيلور مورغان: ثمانية طلبات وأربع فعاليات محفوظة | attendee@example.test | الموقع |
كل حساب يسجّل الدخول بكلمة المرور DemoOnly!2026. هذه حسابات تجريبية محلية فقط.
تضيف البيانات التجريبية أربعة منظّمين، لكل منهم مساحة عمل خاصة يتنقل المالك بينها من الشريط العلوي للوحة: Northline Events وKiln & Co. وMill Street Talks وMeadow Days. لديهم معًا 9 أماكن و36 فعالية (22 منها على الموقع، 3 منها جارية الآن، و9 انتهت، وواحدة أُلغيت، و4 مسودات) و1,145 طلبًا و14 حساب موظف، فتفتح كل شاشة وهي ممتلئة.
أوقف التطبيقات وأعد تشغيلها
اضغط Ctrl+C في الطرفية لإيقاف التطبيقات، أو شغّل هذا الأمر من المجلد ticketory-full-stack. تبقى بياناتك، من قاعدة البيانات والملفات المرفوعة وملفات CSV المصدّرة، محفوظة في وحدة التخزين ticketory-data.
ticketory-full-stackdocker compose downأعد التشغيل بالأمر نفسه في الخطوة 3. من دون --build يعيد استخدام الصور التي بنيتها مسبقًا.
ticketory-full-stackdocker compose upحافظ على بياناتك
يحذف docker compose down -v وحدة تخزين البيانات أيضًا. في التشغيل التالي تُنشأ نسخة جديدة من المنظّمين التجريبيين، ويضيع كل ما أنشأته.
شغّل الموقع العام
هذه الحزمة هي الموقع العام وحده. يقرأ كل شيء من واجهة API الخاصة بتيكيتوري، لذلك شغّل الواجهة أولًا. ما لم تبنِه بعنوان آخر، يتوقع الموقع أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip -q ticketory-website-*.zip cd ticketory-website lsالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوpackage.json.ابنِ الصورة
تُضمَّن قيم
NEXT_PUBLIC_*داخل كود JavaScript الذي يحمّله المتصفح، لذلك فهي وسائط بناء. من دونها يستخدم الموقع واجهة API علىhttp://localhost:8000/api، ويسمّي نفسهhttp://localhost:3030، ويرسل المنظّمين إلى اللوحة علىhttp://localhost:3031. وإن كانت واجهة API في مكان آخر، فمرّر عنوانها.الطرفيةفيticketory-websitedocker build -t ticketory-website .مع واجهة API ونطاقات خاصة بك:
الطرفيةفيticketory-websitedocker build -t ticketory-website --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_SITE_URL=https://www.your-domain.com --build-arg NEXT_PUBLIC_DASHBOARD_URL=https://dashboard.your-domain.com .تواجه مشكلة؟شغّله
داخل الحاوية يكون
localhostهو الحاوية نفسها، لذلك يخبرAPI_INTERNAL_URLخادم الموقع بمكان واجهة API على حاسوبك، وذلك لعناوين صفحات الفعاليات، والعرض الأول للصفحة الرئيسية وصفحات الفعاليات والأماكن والمنظّمين، وخريطة الموقع. يجعل--add-hostالاسمhost.docker.internalيعمل على Linux؛ أما Docker Desktop فيحتوي عليه أصلًا. إذا كان المنفذ3030مشغولًا، فغيّر الرقم الذي على يسار-p، مثل-p 3040:3030، وافتح ذلك المنفذ بدلًا منه، وأضفhttp://localhost:3040إلىCORS_ORIGINفي واجهة API، واضبطه على أنهSTOREFRONT_URLلواجهة API.الطرفيةفيticketory-websitedocker run -p 3030:3030 -e API_INTERNAL_URL=http://host.docker.internal:8000/api --add-host=host.docker.internal:host-gateway ticketory-websiteالنتيجة المتوقعة: يفتح localhost:3030محلي الموقع بالفعاليات القادمة من واجهة API لديك. النسخة الإنجليزية على
تواجه مشكلة؟/enوالعربية على/ar.
لتجعل واجهة API تحدّث صفحات الفعاليات والأماكن والمنظّمين لحظة تغيّرها، أضف -e REVALIDATE_SECRET= متبوعًا بالقيمة نفسها لـ REVALIDATE_SECRET في .env الخاص بواجهة API. من دونه تتحدث هذه الصفحات من تلقاء نفسها خلال ساعة.
شغّل لوحة المنظّم
هذه الحزمة هي لوحة المنظّم وحدها. كل شاشة تقرأ من واجهة API الخاصة بتيكيتوري، لذلك شغّل الواجهة أولًا. ما لم تبنِها بعنوان آخر، تتوقع اللوحة أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip -q ticketory-dashboard-*.zip cd ticketory-dashboard lsالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوpackage.json.ابنِ الصورة
من دون وسائط بناء تستخدم اللوحة واجهة API على
http://localhost:8000/api. وإن كانت واجهة API في مكان آخر، فمرّر عنوانها، وعنوانها من دون/apiللإشعارات المباشرة، والمضيف الذي يقدّم صورها، وعنوان الموقع لرابط «عرض الموقع».الطرفيةفيticketory-dashboarddocker build -t ticketory-dashboard .مع واجهة API خاصة بك:
الطرفيةفيticketory-dashboarddocker build -t ticketory-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 .تواجه مشكلة؟شغّلها وسجّل الدخول
إذا كان المنفذ
3031مشغولًا، فغيّر الرقم الذي على يسار-p، مثل-p 3041:3031، وافتح ذلك المنفذ بدلًا منه، وأضفhttp://localhost:3041إلىCORS_ORIGINفي واجهة API، واضبطه على أنهFRONTEND_URLلها (العنوان الذي تتصل منه الإشعارات المباشرة)، ثم أعد تشغيل واجهة API.الطرفيةفيticketory-dashboarddocker run -p 3031:3031 ticketory-dashboardالنتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بالبريد
تواجه مشكلة؟owner@example.testوكلمة المرورDemoOnly!2026، وهما مقبولان في واجهة API التي فيها بيانات تجريبية.
شغّل واجهة API
هذه الحزمة هي واجهة NestJS API وحدها، على ملف SQLite محفوظ في وحدة تخزين Docker مع الملفات المرفوعة وملفات CSV المصدّرة. الموقع العام ولوحة المنظّم حزمتان منفصلتان وليستا ضمن هذا التنزيل.
فك الضغط وافتح المجلد
الطرفيةunzip -q ticketory-backend-*.zip cd ticketory-backend lsالنتيجة المتوقعة: يحتوي المجلد على
تواجه مشكلة؟Dockerfileوdocker-entrypoint.shوpackage.json.شغّلها مع البيانات التجريبية
تبدأ وحدة التخزين الجديدة بجداول فارغة ومن دون حسابات إلا إذا طلبت المنظّمين التجريبيين، لذلك أبقِ
-e SEED_DEMO_DATA=trueفي أول تشغيل. تحفظ وحدة التخزينticketory-api-dataقاعدة البيانات والملفات المرفوعة وملفات CSV المصدّرة بين التشغيلات. إذا كان المنفذ8000مشغولًا، فغيّر الرقم الذي على يسار-p، مثل-p 8010:8000، وأضف-e PUBLIC_MEDIA_URL=http://localhost:8010/mediaو-e PUBLIC_API_URL=http://localhost:8010لتستخدمها عناوين الصور وروابط تنزيل التذاكر أيضًا. وبعدها يجب أن تشير واجهتاك الأماميتان إلىhttp://localhost:8010/api.الطرفيةفيticketory-backenddocker run -p 8000:8000 -v ticketory-api-data:/data -e SEED_DEMO_DATA=true ticketory-apiالنتيجة المتوقعة: يجيب localhost:8000/
تواجه مشكلة؟api/ healthمحلي بـ "status":"ok"و"database":"up".
تقبل الحاوية الموقع على http://localhost:3030 واللوحة على http://localhost:3031. وعلى عناوين أخرى، اضبط بالخيار -e القيم CORS_ORIGIN (العنوانان معًا، مفصولان بفاصلة) وFRONTEND_URL (اللوحة) وSTOREFRONT_URL (الموقع).
لتعطي الحاوية مفاتيحك الخاصة (الدفع والبريد والذكاء الاصطناعي وR2 وMCP)، أنشئ .env من .env.example بالأمر cp .env.example .env، واملأه، وأضف --env-file .env -e NODE_ENV=production إلى docker run:
ticketory-backenddocker run -p 8000:8000 -v ticketory-api-data:/data -e SEED_DEMO_DATA=true --env-file .env -e NODE_ENV=production ticketory-apiالقيمة المعطاة بـ -e تتفوق على الاسم نفسه في الملف، فتعمل الحاوية في وضع الإنتاج مهما كتب .env، وتنقل المسارات النسبية في الملف (SQLITE_DATABASE وMEDIA_UPLOAD_DIR وEXPORT_DIR) إلى وحدة التخزين. من دون JWT_SECRET خاص بك، أو مع قيمة المثال، تولّد الحاوية سرًا وتحفظه في وحدة التخزين، فتبقى جلسات الدخول بعد إعادة التشغيل.