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

Ticketoryحل المشكلات

حل المشكلات

الأخطاء التي قد تقابلها أثناء تثبيت تيكيتوري، وسبب كل منها، وكيف تصلحه.

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

Docker لا يعمل

ما تراه
failed to connect to the docker API at unix:///…/docker.sock; check if the path is correct and if the daemon is running

تعرض إصدارات Docker الأقدم الرسالة "Cannot connect to the Docker daemon" بدلًا من ذلك. وفي الحالتين، محرك Docker غير مُشغَّل.

  1. افتح Docker Desktop

    شغّل Docker Desktop وانتظر حتى يُظهر أن المحرك يعمل. على Linux، شغّل الخدمة: sudo systemctl start docker.

  2. تحقق من أن Docker يستجيب

    الطرفية
    docker info

    النتيجة المتوقعة: يطبع قسم Server بدلًا من رسالة خطأ.

  3. شغّل أمر التشغيل مرة أخرى

    docker compose up --build للحزمة الكاملة، أو أمرَي docker build وdocker run الخاصين بك لتطبيق واحد.

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

ما تراه
ports are not available: exposing port TCP 0.0.0.0:3031 … bind: address already in use
Bind for 0.0.0.0:3031 failed: port is already allocated
Error: listen EADDRINUSE: address already in use :::3031

السطران الأولان يأتيان من Docker، والأخير من yarn dev. برنامج آخر يستمع بالفعل على 3030 أو 3031 أو 8000: غالبًا تشغيل سابق لتيكيتوري، أو خادم تطوير لمشروع آخر.

  1. اعرف ما الذي يشغل المنفذ

    على macOS أو Linux، مع المنفذ الوارد في الرسالة:

    الطرفية
    lsof -i :3031

    على Windows، في PowerShell:

    الطرفية
    netstat -ano | findstr :3031
  2. أوقفه

    أغلق ذلك البرنامج، أو أوقف التشغيل السابق: Ctrl+C في طرفيته، أو docker compose down في مجلده، أو docker stop لحاوية شغّلتها بالأمر docker run. ثم شغّل تيكيتوري مرة أخرى.

  3. أو شغّل تيكيتوري على منافذ أخرى

    مع الحزمة الكاملة في Docker، أنشئ ملفًا باسم .env في المجلد ticketory-full-stack بجانب docker-compose.yml، وضع فيه المنفذ الذي تحتاجه. ينقل SITE_PORT الموقع، وADMIN_PORT اللوحة، وAPI_PORT واجهة API؛ أما العناوين التي تستخدمها التطبيقات، ومنها CORS_ORIGIN، فتتبعها من تلقاء نفسها.

    ticketory-full-stack/.env
    ADMIN_PORT=3041

    ثم شغّل الأمر نفسه مرة أخرى. يكمل التشغيل الفاشل من حيث توقف. يذكر Docker منفذًا مشغولًا واحدًا في كل مرة: إذا توقف عند منفذ آخر فأضفه إلى .env أيضًا.

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

    النتيجة المتوقعة: يجيب التطبيق على منفذه الجديد، هنا localhost:3041محلي.

لتطبيق واحد شغّلته بـ docker run، غيّر الرقم الذي على يسار -p، مثل -p 3041:3031، وأضف العنوان الجديد إلى CORS_ORIGIN في واجهة API؛ واضبط STOREFRONT_URL لواجهة API إذا نقلت الموقع، أو FRONTEND_URL إذا نقلت اللوحة. من دون Docker تكون المنافذ ثابتة داخل الملفات: يمرّر سكربتا dev وstart للتطبيقين الأماميين في package.json الخيارين -p 3030 و-p 3031، وتقرأ واجهة API قيمة PORT من .env الخاص بها. انقل واجهة API مع PUBLIC_MEDIA_URL وPUBLIC_API_URL وNEXT_PUBLIC_API_BASE_URL في التطبيقين الأماميين (وكذلك NEXT_PUBLIC_WEBSOCKET_BASE_URL في اللوحة)؛ وأضف عنوان أي تطبيق أمامي منقول إلى CORS_ORIGIN أيضًا.

الإعدادات

فشل بناء Docker

ينزّل البناء الأول الصور الأساسية وكل الاعتماديات، ثم يبني الصور. وعندما يعترضه شيء، يتوقف بالرسالة "failed to solve" مع الخطوة التي فشلت.

  • لا اتصال أو انتهت المهلة: يحتاج البناء إلى الإنترنت. شغّل الأمر مرة أخرى بعد عودة الاتصال؛ الخطوات المكتملة محفوظة في ذاكرة التخزين المؤقت.
  • لا توجد مساحة كافية على الجهاز (No space left on device): حرّر مساحة في Docker Desktop، أو تحقق مما يستخدمه Docker بالأمر docker system df.
  • يفشل عند الخطوة نفسها في كل مرة: أعد البناء من دون ذاكرة التخزين المؤقت، ثم شغّل التطبيقات.
  • يرفض Compose الملف `docker-compose.yml` نفسه ويذكر `env_file`: إصدار Compose لديك أقدم من 2.24. حدّث Docker Desktop، أو إضافة Compose على Linux.
الطرفيةفي ticketory-full-stack
docker compose build --no-cache
docker compose up

لحزمة التطبيق الواحد، أضف --no-cache إلى أمر docker build الخاص بك.

أول تشغيل يبدو عالقًا يكون عادةً ما زال يملأ المنظّمين التجريبيين. لا يبدأ الموقع واللوحة إلا بعد أن تعلن واجهة API أنها سليمة.

يقول Yarn إن إصداره 1.22

ما تراه
This project's package.json defines "packageManager": "yarn@4…". However the current global version of Yarn is 1.22…

كل تطبيق يثبّت Yarn 4 عبر Corepack. تعني هذه الرسالة أن Corepack غير مفعّل بعد، فأجاب Yarn القديم المثبّت عامًّا بدلًا منه.

الطرفية
corepack enable

ثم شغّل yarn install مرة أخرى. إذا لم يكن في Node.js لديك Corepack (Node.js 25 وما بعده لا تضمه)، فثبّته أولًا بالأمر npm install -g corepack. لا يُستخدم npm ولا pnpm: كل تطبيق يأتي بملف yarn.lock خاص به.

يفشل التثبيت أو التشغيل على إصدار أقدم من Node.js

يعلن كل تطبيق أنه يحتاج Node.js 22 أو أحدث، وتعمل صور Docker على Node.js 24. يظهر إصدار Node.js الأقدم كتثبيت يفشل في بناء حزمة، أو كتطبيق يتوقف عند التشغيل.

الطرفية
node -v

إذا طبع إصدارًا أقل من 22، فثبّت Node.js 22 أو أحدث، وشغّل corepack enable مرة أخرى (على Node.js 25 وما بعده شغّل npm install -g corepack أولًا)، ثم احذف مجلد node_modules الخاص بالتطبيق وشغّل yarn install مرة أخرى. مع Docker لا ينطبق شيء من هذا: فالصور تأتي بـ Node.js الخاص بها.

تتوقف واجهة API قبل أن تبدأ

ما تراه
The API cannot start: JWT_SECRET is not set. Set it in back-end/.env to the output of: …
The API cannot start: JWT_SECRET is still the example value from .env.example, so anyone can sign a token for any account. …
The API cannot start: CORS_ORIGIN is not set. List the website and organiser dashboard origins, comma separated, …

تتحقق واجهة API من إعداداتها قبل أن تبدأ، وتطبع سطرًا واحدًا لكل مشكلة. الأسباب:

  • لا يوجد ملف `.env`، أو `JWT_SECRET` فارغ. أنشئ الملف في مجلد واجهة API بالأمر cp .env.example .env.
  • ما زال `JWT_SECRET` بقيمة المثال مع `NODE_ENV=production`. يستطيع أي شخص توقيع رمز باستخدام المثال العام، لذا يرفضه التشغيل في وضع الإنتاج. ولّد سرًا خاصًا بك.
  • `CORS_ORIGIN` فارغ مع `NODE_ENV=production`. اكتب عنوانَي الموقع ولوحة التحكم، مفصولين بفاصلة.

ولّد سرًا بالأمر:

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

مع Docker لا تحتاج إلى ذلك: الحاوية التي ليس لها JWT_SECRET خاص بها، أو التي تستخدم قيمة المثال، تولّد سرًا وتحفظه في وحدة تخزين البيانات.

الموقع بلا فعاليات ولا يستطيع أحد تسجيل الدخول

ما تراه
→ No database at /data/database.sqlite. Creating the tables, no data (set SEED_DEMO_DATA=true for the demo).

أُنشئت قاعدة البيانات بالجداول فقط. يحدث ذلك عندما تبدأ حاوية واجهة API على وحدة تخزين جديدة من دون SEED_DEMO_DATA=true، أو عندما تعمل الحزمة الكاملة مع SEED_DEMO_DATA=false في .env بجانب docker-compose.yml، أو من دون Docker عندما يعمل yarn db:sync بدلًا من yarn seed. لا توجد فعاليات ولا حساب في اللوحة لتسجيل الدخول به.

  • من دون Docker: شغّل yarn seed داخل مجلد واجهة API. يضيف المنظّمين التجريبيين وحساباتهم إلى الجداول الموجودة لديك.
  • الحزمة الكاملة في Docker: احذف SEED_DEMO_DATA=false من .env، ثم شغّل docker compose down -v وdocker compose up. تُنشأ وحدة تخزين البيانات من جديد مع البيانات التجريبية.
  • حاوية واجهة API: احذف الحاوية، واحذف وحدة التخزين الخاصة بها، وشغّلها مرة أخرى مع -e SEED_DEMO_DATA=true، كما في «ابدأ من جديد» أدناه.
  • لمساحة عملك الخاصة بدلًا من البيانات التجريبية: اضبط OWNER_EMAIL وOWNER_PASSWORD (10 أحرف على الأقل) وشغّل واجهة API مرة أخرى على قاعدة البيانات الفارغة تلك. يقول سجلها حينئذ Clean start: created the workspace؛ وقبل ضبطهما يذكر أي المتغيرات يجب ضبطها.

لا تعيد الحاوية تعبئة قاعدة بيانات موجودة أبدًا، أيًا كانت قيمة SEED_DEMO_DATA، لذلك لا يهم هذا المتغير إلا مع وحدة تخزين جديدة.

فشل تسجيل الدخول

  • تحقق من الحساب والتطبيق. يسجّل الموظفون الدخول إلى اللوحة على المنفذ 3031 (owner@example.test وmanager@example.test وfinance@example.test وcheckin@example.test)؛ أما الحاضر attendee@example.test فيسجّل الدخول على الموقع في المنفذ 3030، وليس في اللوحة أبدًا. كل حساب تجريبي يستخدم كلمة المرور DemoOnly!2026.
  • «البريد الإلكتروني أو كلمة المرور غير صحيحة» في اللوحة هي إجابة عن كلمة مرور خاطئة وعن بريد غير معروف وعن قاعدة بيانات بلا حسابات على حد سواء. افحص النقاط التالية بالترتيب.
  • قاعدة البيانات بلا حسابات عندما تُنشأ مع SEED_DEMO_DATA=false ومن دون متغيرات المالك. انظر «الموقع بلا فعاليات ولا يستطيع أحد تسجيل الدخول» أعلاه.
  • «محاولات تسجيل دخول كثيرة. حاول مرة أخرى بعد دقائق.» عشر محاولات دخول فاشلة من عنوان واحد خلال 15 دقيقة تقفل النموذج لذلك العنوان إلى أن يمضي على أقدم فشل 15 دقيقة. ويُحسب تسجيل الدخول في الموقع بالطريقة نفسها. انتظر، أو أعد تشغيل واجهة API: فالعدّاد محفوظ في ذاكرتها.
  • «خطأ في الشبكة. تحقّق من اتصالك وحاول مرة أخرى.» تعني أن اللوحة لا تصل إلى واجهة API: انظر مشكلة CORS أدناه.
  • غيّرت بيانات الدخول ولم تعد تملكها: ابدأ من جديد ببيانات تجريبية جديدة، أدناه.

فشل تسجيل الدخول

  • تحقق من الحساب والمسار. يسجّل الموظفون الدخول عبر POST /api/auth/login (المالك التجريبي هو owner@example.test)، والحضور عبر POST /api/customer-auth/login (attendee@example.test)؛ وكل حساب تجريبي يستخدم DemoOnly!2026. يردّ تسجيل الدخول الفاشل بـ 401 وبالرسالة نفسها سواء كان البريد أو كلمة المرور هو الخاطئ.
  • لا يعمل أي حساب إطلاقًا: أُنشئت قاعدة البيانات من دون البيانات التجريبية. شغّل yarn seed، أو شغّل الحاوية بـ -e SEED_DEMO_DATA=true على وحدة تخزين جديدة. وفي تثبيتك الخاص يكون المالك هو OWNER_EMAIL الذي أُعطي عند أول تشغيل.
  • الرد `429` يعني أن عنوانًا واحدًا فشل في 10 محاولات دخول خلال 15 دقيقة. يزول عندما يمضي 15 دقيقة على أقدم محاولة فاشلة، أو عند إعادة تشغيل واجهة API. يغيّر RATE_LIMIT_LOGIN هذا العدد.

فشل تسجيل الدخول

يسجّل تطبيقك الدخول عبر واجهة API الخاصة بتيكيتوري، لذلك يجب أن يكون الحساب موجودًا فيها. في واجهة API فيها بيانات تجريبية، يسجّل الموظفون الدخول إلى اللوحة بـ owner@example.test، ويسجّل الحضور الدخول إلى الموقع بـ attendee@example.test، وكلاهما بكلمة المرور DemoOnly!2026. إذا لم يعمل أي حساب، فإما أن واجهة API بدأت من دون بياناتها التجريبية (شغّل yarn seed في مجلدها، أو شغّل حاويتها على وحدة تخزين جديدة بـ -e SEED_DEMO_DATA=true)، وإما أن التطبيق لا يصل إلى واجهة API: انظر المشكلة التالية.

لا يصل رمز التسجيل أو بريد التذكرة أبدًا

ما دام RESEND_API_KEY وMAIL_FROM غير مضبوطين في .env الخاص بواجهة API، لا يُرسل أي بريد. يُكتب كل بريد (رمز التسجيل المكوّن من 6 أرقام، وإعادة ضبط كلمة المرور، والتذاكر، وأخبار الاسترداد، وتذكيرات الفعاليات) في سجل واجهة API بدلًا من إرساله، ويبدأ بهذا السطر:

ما تراه
Mail not sent (no provider configured). Message follows:
  • الحزمة الكاملة في Docker: شغّل docker compose logs api في مجلد الحزمة واقرأ الرمز من أحدث رسالة.
  • من دون Docker: اقرأه في الطرفية التي تشغّل yarn dev لواجهة API.
  • حاوية واجهة API: شغّل docker logs مع معرّف الحاوية (يعرضه docker ps).
  • لإرسال بريد حقيقي، اضبط المتغيرين بمفتاح Resend ومرسِل على نطاق وثّقته لدى Resend، ثم أعد تشغيل واجهة API.

تظهر في الصفحات «تعذر تحميل هذا المحتوى الآن»

ما تراه
We could not load this right now
Access to XMLHttpRequest at 'http://localhost:8000/api/…' from origin 'http://localhost:3041' has been blocked by CORS policy

يعرض الموقع السطر الأول، وتقول لوحة التحكم «خطأ في الشبكة»، عندما لا يستطيع المتصفح استخدام واجهة API. وتعرض وحدة تحكم المتصفح السطر الثاني عندما تعمل واجهة أمامية على عنوان لا تقبله واجهة API. لا تردّ واجهة API على المتصفحات إلا من العناوين الموجودة في CORS_ORIGIN، وقيمته الافتراضية http://localhost:3030 وhttp://localhost:3031. يُرفض موقع أو لوحة تحكم نُقلا إلى منفذ آخر، أو قُدّما على نطاقك، حتى يُدرجا فيه.

ملف .env الخاص بواجهة API
CORS_ORIGIN=http://localhost:3030,http://localhost:3041
FRONTEND_URL=http://localhost:3041
  • اكتب كل عنوان تمامًا كما يعرضه المتصفح، مع البروتوكول والمنفذ ومن دون شرطة مائلة في النهاية، مفصولة بفواصل. ثم أعد تشغيل واجهة API.
  • FRONTEND_URL هو عنوان لوحة التحكم، وتتصل منه إشعاراتها المباشرة. انقله مع لوحة التحكم.
  • لحاوية واجهة API، مرّر القيم نفسها باستخدام -e، مثل -e CORS_ORIGIN=http://localhost:3030,http://localhost:3041.
  • مع الحزمة الكاملة في Docker لا تعدّل هذه القيم: تضبطها SITE_PORT وADMIN_PORT وSITE_URL وADMIN_URL في ملف .env بجوار docker-compose.yml.
  • الواجهة الأمامية التي لا تصل إلى واجهة API إطلاقًا، لأنها متوقفة أو على عنوان آخر، تفشل بالطريقة نفسها من دون سطر CORS. تحقق من أن localhost:8000/api/healthمحلي يجيب، ومن أن NEXT_PUBLIC_API_BASE_URL في الواجهة الأمامية يشير إلى واجهة API تلك.

تبويب صفحة الفعالية يعرض اسم الموقع فقط في Docker

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

شغّل حاوية الموقع مع عنوان واجهة API كما يراه الخادم:

الطرفية
docker run -p 3030:3030 -e API_INTERNAL_URL=http://host.docker.internal:8000/api --add-host=host.docker.internal:host-gateway ticketory-website

تضبطه لك الحزمة الكاملة في Docker (http://api:8000/api). بدون Docker لا حاجة إليه.

صور الفعاليات لا تُحمَّل

تقدّم واجهة API الصور التجريبية على /media/ticketory/…، ويُبنى كل عنوان صورة من PUBLIC_MEDIA_URL الذي قيمته الافتراضية http://localhost:8000/media. تتعطل الصورة عندما لا يصل المتصفح إلى واجهة API بذلك العنوان.

  • تعمل واجهة API على منفذ أو نطاق آخر. اضبط PUBLIC_MEDIA_URL على العنوان العام لواجهة API متبوعًا بـ /media، مثل -e PUBLIC_MEDIA_URL=http://localhost:8010/media مع docker run -p 8010:8000. مع الحزمة الكاملة في Docker، يضبطه API_PORT وAPI_URL نيابة عنك.
  • انتقلت واجهة API بعد أول تشغيل. أعد تشغيلها بـ PUBLIC_MEDIA_URL الجديد: عند البدء توجّه كل صورة محفوظة إلى ذلك العنوان، ويقول سجلها "Pointed … stored media URLs at …".
  • الملفات المرفوعة إلى مخزن لا تظهر. يجب أن يكون R2_PUBLIC_URL العنوان العام للمخزن، ويجب أن يسمح المخزن بالقراءة العامة.
  • الصور تُحمَّل لكن بحجمها الكامل. لا يغيّر التطبيقان الأماميان حجم الصور إلا من مضيفي https الموجودين في NEXT_PUBLIC_MEDIA_HOSTNAME (ومع Docker Compose في MEDIA_HOSTNAME)، كل واحد مكتوب كمضيف فقط ومفصولين بفواصل، مثل api.your-domain.com,pub-1234.r2.dev. وأي صورة أخرى، كصورة من واجهة API على localhost، تُحمَّل كما هي. أعد بناء التطبيق الأمامي بعد تغييره.

صفحة الدفع تعرض الدفع الاختباري فقط، أو تعيدني إلى الخلف

ما تراه
Your reservation expired. Choose seats again.
  • يُعرض الدفع الاختباري فقط. ليس لدى واجهة API مفتاح Stripe أو PayPal حي بعد، لذلك تعرض محاكي الدفع الذي يعتبر الطلب مدفوعًا من دون تحويل أي مال. أضف مفاتيحك إلى .env الخاص بواجهة API وأعد تشغيلها؛ ويتقدم عليه الخيار PAYMENTS_SIMULATOR=on أو off هناك. التذاكر المجانية لا تعرض أي طريقة دفع: تُؤكَّد بالزر احصل على التذاكر.
  • «انتهى حجزك». تُحجز المقاعد المختارة طوال مدة الحجز في مساحة العمل، وهي عشر دقائق في البيانات التجريبية، بحسب ساعة الخادم. اختر المقاعد مرة أخرى لتبدأ حجزًا جديدًا.
  • تعيدك صفحة الدفع إلى الفعاليات. تبويب المتصفح هذا لا يحجز أي مقاعد: فُتحت صفحة الدفع في تبويب آخر (الحجز يخص التبويب الذي أنشأه)، أو أن واجهة API لم تعد تعرف الحجز. اختر المقاعد مرة أخرى.
  • دفعة Stripe أو PayPal تبقى على «نؤكّد دفعتك الآن». تسأل الصفحة واجهة API التي تسأل المزوّد إلى أن تُؤكَّد الدفعة. على الخادم، سجّل خطافات الويب على /api/webhooks/stripe و/api/webhooks/paypal حتى تصل التأكيدات فورًا، وتحقق من أن STOREFRONT_URL وPUBLIC_API_URL هما العنوانان اللذان يستخدمهما متصفح المشتري.

تغيير ملف .env للواجهة الأمامية لا يُحدث أي أثر

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

طريقة التشغيلبعد تغيير قيمة
yarn devأوقفه وشغّل yarn dev مجددًا.
yarn build وyarn startشغّل yarn build مجددًا، ثم yarn start.
Docker Composeشغّل docker compose up --build. اضبط القيمة في ملف .env بجوار docker-compose.yml، وليس في مجلد التطبيق.
docker build لتطبيق واحدابنِ الصورة مجددًا مع القيمة كوسيط --build-arg.

استوديو الأماكن أو المساعد يطلب مفتاحًا

ما تراه
Generation needs a Google Gemini key
The assistant needs an AI provider key

يرد المساعد عبر Google Gemini أو OpenAI أو DeepSeek، ويعمل بمفتاح أي واحد منها في .env الخاص بواجهة API: GOOGLE_API_KEY أو OPENAI_API_KEY أو DEEPSEEK_API_KEY، وهي الثلاثة التي يذكرها تنبيهه. أما استوديو الأماكن فينشئ عبر Google فقط، فيحتاج إلى GOOGLE_API_KEY أيًّا كان ما عداه. في .env.example الأسطر الثلاثة معلّقة، فيبدأ الملف المنسوخ نظيفًا وتبقى الميزتان مغلقتين ولا تُحتسب أي رسوم.

  • احذف # الذي أمام سطر كل مفتاح لديك، والصق مفتاحك الحقيقي مكان المثال، وأعد تشغيل واجهة API.
  • مع Docker Compose تقرأ واجهة API الملف back-end/.env أيضًا، لذلك يكفي docker compose up مرة أخرى؛ أما حاوية واجهة API المفردة فتحتاج --env-file .env -e NODE_ENV=production في docker run.
  • أعد تحميل صفحة لوحة التحكم بعد إعادة التشغيل.
  • النموذج الغائب من قائمة اختيار المساعد يتبع مزوّدًا لم يُضبط مفتاحه: فالقائمة تعرض فقط نماذج المزودين الذين لديهم مفتاح.

المساعد لا يستطيع الرد بالنموذج المختار

ما تراه
{provider} did not accept the API key, so {model} could not answer. Check that {variable} holds a valid {provider} key, then try again or pick a model from another provider.
The {provider} account behind this API key has no credit left, so {model} could not answer. Add credit or billing on that account, or pick a model from another provider.
{model} has no requests left on this API key right now. Pick a different model from the list above the chat, or try again in a few minutes.
{provider} has no room for {model} right now. Try again in a minute, or pick another model from the list above the chat.

يعرض المساعد إحدى هذه الرسائل بدل الرد عندما يرفض المزوّد الذي يقف خلف النموذج المختار الطلب، مع Google أو OpenAI أو DeepSeek مكان المزوّد، واسم النموذج، ومتغير المفتاح. لا يشغّل إلا النموذج الذي اخترته: لا ينتقل إلى نموذج آخر من تلقاء نفسه ولا يعيد المحاولة بنفسه، فأصلح السبب أو اختر نموذجًا آخر من القائمة أعلى المحادثة، ثم اضغط «حاول مرة أخرى».

تقول الرسالةالسببالحل
لم يقبل ... مفتاح APIرفض المزوّد المفتاح: مكتوب بخطأ، أو ملغى، أو منتهي الصلاحية، أو مفتاح من مزوّد آخر في ذلك المتغير.ضع مفتاحًا صالحًا من ذلك المزوّد في المتغير الذي تذكره الرسالة، في .env الخاص بواجهة API، وأعد تشغيل واجهة API وأعد تحميل الصفحة.
لم يتبقَّ رصيدحساب المزوّد المرتبط بالمفتاح بلا رصيد أو بلا دفع مفعّل.أضف رصيدًا أو فعّل الدفع في ذلك الحساب لدى المزوّد، أو اختر نموذجًا من مزوّد آخر.
لم يتبقَ ... أي طلباتاستُنفد حد الطلبات لمفتاحك على ذلك النموذج حاليًا.انتظر بضع دقائق، أو اختر نموذجًا آخر: فالحدود تُحتسب غالبًا لكل نموذج.
لا يتسع ... لطلباتالمزوّد مثقل بالطلبات في الوقت الحالي.حاول بعد دقيقة، أو اختر نموذجًا آخر.

في وضع العرض التجريبي يطلب المساعد مفتاح الزائر نفسه

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

ما يقوله مساعد العرض التجريبي العام عند نفاد رسائله المجانية، وكيف تمنح الزوار المزيد.

نموذج التواصل أو التسجيل مرفوض

ما تراه
Too many requests were sent from this connection. Please wait a few minutes and try again.
  • طلبات كثيرة. يستطيع كل عنوان إرسال خمسة نماذج تواصل، وبدء عشر عمليات تسجيل، وطلب خمس عمليات إعادة ضبط لكلمة المرور، خلال عشر دقائق. أثناء الاختبار انتظر، أو أعد تشغيل واجهة API: فالعدّادات محفوظة في ذاكرتها.
  • حقل لا تعرفه واجهة API. يرفض التسجيل جسم الطلب الذي فيه حقول غير معروفة بـ 400 ويسمّيها. يحدث هذا فقط لعميلك الخاص أو لنموذج غُيّر: أرسل الحقول التي يرسلها الموقع.
  • خلف وكيل عكسي قد يبدو كل زائر كأنه الوكيل ويتشاركون حدًا واحدًا: راجع المشكلة التالية.

يحصل كل زائر على «طلبات كثيرة» خلف وكيل

تسجيل الدخول والتسجيل ونموذج التواصل وعمليات مسح الباب محدودة لكل عنوان. خلف وسيط عكسي قد يبدو كل زائر بعنوان الوسيط الواحد فيتشاركون حصة واحدة. أخبر واجهة API بعدد الوسطاء الذين أمامها:

ملف .env الخاص بواجهة API
TRUST_PROXY=1

يغيّر RATE_LIMIT_LOGIN عدد محاولات الدخول الفاشلة المسموح بها. يستطيع كل جهاز مسح عند الباب إجراء 120 فحصًا في الدقيقة. العدّادات محفوظة في ذاكرة واجهة API، فتمسحها إعادة التشغيل.

MySQL يرفض البدء أو ملء البيانات

تنشئ واجهة API جداولها في قاعدة بيانات موجودة مسبقًا؛ ولا تنشئ قاعدة البيانات نفسها. أنشئ أولًا قاعدة بيانات فارغة، وضع اسمها في DB_DATABASE في ملف .env الخاص بواجهة API، ثم شغّل yarn seed (أو yarn db:sync للجداول من دون بيانات تجريبية).

  • تحقق من قيم الاتصال الخمس DB_*، ومن أن DB_TYPE=mysql.
  • مع NODE_ENV=production لا تنشئ واجهة API العاملة أي جداول، لذلك يجب تشغيل أحد هذين الأمرين قبل التشغيل الأول (yarn seed:prod أو yarn db:sync:prod بعد yarn build).
  • لا تنشئ صورة Docker قاعدة البيانات بنفسها إلا مع SQLite. مع MySQL، شغّل أمر تعبئة البيانات أو أمر إنشاء الجداول مرة واحدة بنفسك.

حاوية واجهة API لا تجد نقطة الدخول الخاصة بها

ما تراه
exec /usr/local/bin/docker-entrypoint.sh: no such file or directory

في السكربت نهايات أسطر بنمط Windows، وقد يضيفها محرر نصوص أو Git على Windows. يزيلها ملف Dockerfile المرفق مع واجهة API أثناء البناء، لذلك لا تظهر هذه المشكلة إلا مع صورة مبنية من Dockerfile معدَّل. أبقِ السطر sed -i 's/\r$//'، أو احفظ السكربت بنهايات أسطر LF، ثم أعد البناء من دون ذاكرة التخزين المؤقت.

يفشل أمر فك الضغط أو يبدو المجلد مختلفًا

ما تراه
caution: filename not matched:  ticketory-…zip

تعني تلك الرسالة أن في المجلد ملفَّي ZIP للحزمة نفسها، مثل تنزيل أقدم بجانب الجديد، وأن * في الأمر طابق الاثنين. احذف ملف ZIP الأقدم وشغّل الأمر مرة أخرى، أو اكتب اسم الملف كاملًا بدل *.

شغّل الأوامر التالية داخل المجلد الذي يُفك إليه ملف ZIP. إذا كان الأمر unzip غير موجود، ففك الضغط بمدير الملفات بدلًا منه؛ وبعض الأدوات تضيف مجلدًا إضافيًا باسم ملف ZIP، فانتقل إلى المجلد الداخلي.

الحزمةالمجلديحتوي على
الحزمة الكاملةticketory-full-stackadmin-dashboard, back-end, storefront, docker-compose.yml
موقع التذاكرticketory-websiteDockerfile, package.json, .env.example
لوحة المنظّمticketory-dashboardDockerfile, package.json, .env.example
واجهة API (Backend API)ticketory-backendDockerfile, docker-entrypoint.sh, package.json, .env.example

ابدأ من جديد ببيانات تجريبية جديدة

هذا يحذف بياناتك

يُحذف كل ما أنشأته محليًا، ويُملأ المنظّمون التجريبيون من جديد.

مع الحزمة الكاملة في Docker، من المجلد ticketory-full-stack:

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

مع حاوية واجهة API وحدها، أزل الحاوية أولًا (يعرضها docker ps -a، ويزيلها docker rm -f مع معرّفها)، ثم احذف وحدة التخزين ticketory-api-data وشغّلها مرة أخرى. تحفظ الحزمة الكاملة بياناتها في وحدة تخزين مختلفة هي ticketory-data، فلا يمسّها هذا أبدًا.

الطرفية
docker volume rm ticketory-api-data
docker run -p 8000:8000 -v ticketory-api-data:/data -e SEED_DEMO_DATA=true ticketory-api

من دون Docker، أوقف واجهة API، ثم في مجلدها:

الطرفية
rm -f database.sqlite* && yarn seed

في PowerShell:

الطرفية
Remove-Item database.sqlite*; yarn seed

تشغيل yarn seed مرة أخرى على قاعدة بيانات تريد الاحتفاظ بها ليس إعادة ضبط: لا يضيف صفوفًا ولا يعيد ضبط أي كلمة مرور، لكنه يعيد الأدوار الأربعة الجاهزة إلى صلاحياتها الافتراضية. يحذف yarn db:reset كل جدول، في SQLite وMySQL على حد سواء؛ شغّل yarn seed بعده.

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

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

حل المشكلات

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

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