انتقل إلى المقال
Aniq-UI

Ticketoryشغّل تيكيتوري محليًا

شغّل تيكيتوري محليًا

شغّل حزمتك على جهازك باستخدام Docker.

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

قبل أن تبدأ: ثبّت Docker Desktop وافتحه، أو Docker Engine مع Compose.

اطّلع على المتطلبات
  1. نزّل قالبك

    افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بحزمتك.

    النتيجة المتوقعة: يوجد في مجلد التنزيلات ملف باسم يشبه ticketory-full-stack-….zip.

  2. فك الضغط وافتح المجلد

    افتح طرفية في المكان الذي فيه ملف 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.

    تواجه مشكلة؟
  3. شغّل التطبيقات

    ابنِ واجهة API والموقع العام ولوحة المنظّم وشغّلها. لا شيء يحتاج إلى ضبط قبل ذلك. يبني أول تشغيل ثلاث صور ويملأ قاعدة البيانات بالمنظّمين التجريبيين وفعالياتهم، وهذا يستغرق بضع دقائق؛ أما التشغيلات التالية فتستغرق ثوانيَ.

    الطرفيةفي ticketory-full-stack
    docker 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 مرة أخرى وافتح التطبيق على منفذه الجديد.

    المنفذ مستخدم بالفعل

    النتيجة المتوقعة: تبقى الخدمات الثلاث قيد التشغيل ويتوقف السجل عن التمرير. اترك هذه الطرفية مفتوحة.

    تواجه مشكلة؟
  4. افتح الموقع العام

    افتح localhost:3030محلي. النسخة الإنجليزية على /en والعربية على /ar. يستطيع أي شخص الشراء من دون حساب؛ ولرؤية تذاكر الحاضر وطلباته وفعالياته المحفوظة، سجّل الدخول بالبريد attendee@example.test وكلمة المرور DemoOnly!2026.

    النتيجة المتوقعة: يفتح الموقع على صفحته الرئيسية مع الفعاليات التجريبية وصورها.

    تواجه مشكلة؟
  5. سجّل الدخول إلى لوحة المنظّم

    افتح 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-stack
docker compose down

أعد التشغيل بالأمر نفسه في الخطوة 3. من دون --build يعيد استخدام الصور التي بنيتها مسبقًا.

الطرفيةفي ticketory-full-stack
docker compose up

حافظ على بياناتك

يحذف docker compose down -v وحدة تخزين البيانات أيضًا. في التشغيل التالي تُنشأ نسخة جديدة من المنظّمين التجريبيين، ويضيع كل ما أنشأته.

شغّل الموقع العام

هذه الحزمة هي الموقع العام وحده. يقرأ كل شيء من واجهة API الخاصة بتيكيتوري، لذلك شغّل الواجهة أولًا. ما لم تبنِه بعنوان آخر، يتوقع الموقع أن تكون واجهة API على http://localhost:8000. واجهة API حزمة منفصلة وليست ضمن هذا التنزيل.

  1. نزّل قالبك

    افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بموقع التذاكر.

  2. فك الضغط وافتح المجلد

    الطرفية
    unzip -q ticketory-website-*.zip
    cd ticketory-website
    ls

    النتيجة المتوقعة: يحتوي المجلد على Dockerfile وpackage.json.

    تواجه مشكلة؟
  3. ابنِ الصورة

    تُضمَّن قيم NEXT_PUBLIC_* داخل كود JavaScript الذي يحمّله المتصفح، لذلك فهي وسائط بناء. من دونها يستخدم الموقع واجهة API على http://localhost:8000/api، ويسمّي نفسه http://localhost:3030، ويرسل المنظّمين إلى اللوحة على http://localhost:3031. وإن كانت واجهة API في مكان آخر، فمرّر عنوانها.

    الطرفيةفي ticketory-website
    docker build -t ticketory-website .

    مع واجهة API ونطاقات خاصة بك:

    الطرفيةفي ticketory-website
    docker 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 .
    تواجه مشكلة؟
  4. شغّله

    داخل الحاوية يكون 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-website
    docker 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 حزمة منفصلة وليست ضمن هذا التنزيل.

  1. نزّل قالبك

    افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بلوحة المنظّم.

  2. فك الضغط وافتح المجلد

    الطرفية
    unzip -q ticketory-dashboard-*.zip
    cd ticketory-dashboard
    ls

    النتيجة المتوقعة: يحتوي المجلد على Dockerfile وpackage.json.

    تواجه مشكلة؟
  3. ابنِ الصورة

    من دون وسائط بناء تستخدم اللوحة واجهة API على http://localhost:8000/api. وإن كانت واجهة API في مكان آخر، فمرّر عنوانها، وعنوانها من دون /api للإشعارات المباشرة، والمضيف الذي يقدّم صورها، وعنوان الموقع لرابط «عرض الموقع».

    الطرفيةفي ticketory-dashboard
    docker build -t ticketory-dashboard .

    مع واجهة API خاصة بك:

    الطرفيةفي ticketory-dashboard
    docker 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 .
    تواجه مشكلة؟
  4. شغّلها وسجّل الدخول

    إذا كان المنفذ 3031 مشغولًا، فغيّر الرقم الذي على يسار -p، مثل -p 3041:3031، وافتح ذلك المنفذ بدلًا منه، وأضف http://localhost:3041 إلى CORS_ORIGIN في واجهة API، واضبطه على أنه FRONTEND_URL لها (العنوان الذي تتصل منه الإشعارات المباشرة)، ثم أعد تشغيل واجهة API.

    الطرفيةفي ticketory-dashboard
    docker run -p 3031:3031 ticketory-dashboard

    النتيجة المتوقعة: يفتح localhost:3031محلي نموذج تسجيل الدخول. سجّل الدخول بالبريد owner@example.test وكلمة المرور DemoOnly!2026، وهما مقبولان في واجهة API التي فيها بيانات تجريبية.

    تواجه مشكلة؟

شغّل واجهة API

هذه الحزمة هي واجهة NestJS API وحدها، على ملف SQLite محفوظ في وحدة تخزين Docker مع الملفات المرفوعة وملفات CSV المصدّرة. الموقع العام ولوحة المنظّم حزمتان منفصلتان وليستا ضمن هذا التنزيل.

  1. نزّل قالبك

    افتح صفحة «قوالبي» ونزّل ملف ZIP الخاص بواجهة API.

  2. فك الضغط وافتح المجلد

    الطرفية
    unzip -q ticketory-backend-*.zip
    cd ticketory-backend
    ls

    النتيجة المتوقعة: يحتوي المجلد على Dockerfile وdocker-entrypoint.sh وpackage.json.

    تواجه مشكلة؟
  3. ابنِ الصورة

    الطرفيةفي ticketory-backend
    docker build -t ticketory-api .
    تواجه مشكلة؟
  4. شغّلها مع البيانات التجريبية

    تبدأ وحدة التخزين الجديدة بجداول فارغة ومن دون حسابات إلا إذا طلبت المنظّمين التجريبيين، لذلك أبقِ -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-backend
    docker 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-backend
docker 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 خاص بك، أو مع قيمة المثال، تولّد الحاوية سرًا وتحفظه في وحدة التخزين، فتبقى جلسات الدخول بعد إعادة التشغيل.

التالي

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

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

حل المشكلات

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

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