كيفية إنشاء مستخدم جديد في SQL النقي

ما هي الجداول الدنيا المطلوبة التي تحتاج إلى إضافة صفوف فيها لإنشاء مستخدم، ليظهر بعد ذلك كنشط في Discourse؟

لقد قمت للتو بإدراج صف واحد في جدول user_emails:

insert into user_emails (user_id, email, "primary", created_at, updated_at) values (2,'user@email.com',true, now(), now());

ومن غير المستغرب أن المستخدم لم يظهر في واجهة المستخدم الرسومية (GUI)، ولكن ما هي الخطوات الدنيا المطلوبة؟ هل أحتاج إلى إضافة صفوف إلى جداول أخرى، أو هل هناك حاجة لإعادة تشغيل النظام؟

أتوقع الآن أن يقول شخص ما إن هذه ليست الطريقة الصحيحة للقيام بالأمر، وأنا أفهم ذلك، لكن بالنسبة لي قد يكون هذا الخيار مناسبًا كما سأوضح أدناه (قد تكون بعض افتراضاتي غير صحيحة، لكن هذا هو فهمي):

  • جميع سكريبتات الاستيراد التي تستورد من منتديات أخرى تعتمد على قاعدة بيانات تتطلب القدرة على الاتصال بالمنتدى الآخر من خلال مثيل Discourse. لكن القدرة على الوصول إلى المنتدى الآخر (jforum) من مثيل Discourse المباشر ستكون صعبة إن لم تكن مستحيلة. وبالمثل، فإن محاولة تثبيت بيئة تطوير Discourse حيث resides المنتدى القديم (خادم قديم جدًا) أمر غير ممكن أيضًا.
  • لا أفهم Ruby on Rails، لذا لا يمكنني تعديل السكريبتات الحالية، لكنني أفهم SQL.
  • يمكنني استخدام واجهة برمجة التطبيقات (API) (لدي 5000 مستخدم فقط)، لكنني أرغب في استخدام طريقة أو إضافة (plugin) تسمح بالاحتفاظ بتجزئة كلمة المرور باستخدام MD5 بدلاً من إجبار جميع المستخدمين على إعادة تعيين كلمات المرور، لذا لا أعتقد أن هذا ممكن عبر الـ API.
  • يوجد سكريبت استيراد لـ jforum، لذا يمكنني استخدامه لمعرفة متطلبات SQL لاستخراج البيانات من jforum دون مشكلة، ثم وضعها في ملفات CSV لتحميلها إلى قاعدة البيانات.
  • قد توفر أدوات الاستيراد الضخم طريقة لإدخال SQL مباشرة في Discourse، لكنني أجد صعوبة في رؤية كود SQL المطلوب.
  • يبدو أن إدخال المستخدمين هو المفتاح، وبعد ذلك يجب أن لا يكون إضافة الفئات والمواضيع والمنشورات أمرًا صعبًا.

صحيح!

لو كنت تفهم، لما كنت تسأل. :wink:

الاحتمال كبير جدًا أن تنتهي بقاعدة بيانات تالفة. وعندها لن يتمكن أحد من مساعدتك.

قم بتصدير قاعدة بياناتك واستعد على خادم Discourse المحلي (أو أي مكان يمكنه الاتصال به—لقد قمت باستيرادات أكبر باستخدام قاعدة بيانات عن بعد عبر اتصال الإنترنت المنزلي)، ثم شغّل السكربت الموجود.

سيكون من الأسهل بكثير استخدام Ruby الذي لا تفهمه بدلاً من فهمه جيدًا بما يكفي لمعرفة كيفية كتابة SQL. لقد تعلمت Ruby بعد فترة طويلة من كتابة أول مستورد لي.

هذا قليلًا مهين!
إذا كان سكريبت الاستيراد الجماعي يشغّل SQL (كما أعتقد أنه يفعل)، فإن توثيق SQL المطلوب لإنشاء مستخدم لا يشكل خطرًا أكبر من محاولة استخدام سكريبت الاستيراد الجماعي. وبما أن لدي حاليًا تثبيتًا قياسيًا لـ Discourse، فلن يكون الأمر بالغ الأهمية حتى لو تعطل. أتوقع أن لدي سنوات أكثر في التطوير مما لديك.

ما لا أملك خبرة كبيرة فيه هو جميع مهام الإدارة، ومحاولة تثبيت خادم Discourse محليًا لأول مرة فتحت لي صندوقًا من المشاكل. وإذا لم أستطع الاتصال بخادم JForum MySQL الخاص بي من خادم Discourse، فسيكون عليّ تثبيت MySQL أيضًا ونقل قاعدة البيانات. سكريبت JForum الحالي غير مدرج في شجرة المصدر الرئيسية، وأنا أعمل على إصدار قديم جدًا من JForum، لذا لا أتوقع أن يعمل.

لم أقصد الإساءة. أظن أنك فوّتَ رمز :wink:؟

أراهن أنك محق!

في بعض الأحيان، النصيحة المجانية من شخص عمل بدوام كامل مع Discourse لأكثر من ثلاث سنوات، وقام بالعديد من عمليات الاستيراد، وكتب عدة أدوات استيراد من الصفر، تستحق ما تدفعه مقابلها.

ماذا عن إعداد نفق SSH؟

ربما غير متسقة، لكن ليست تالفة.

لكن يمكنك إنشاء المستخدمين باستخدام واجهة برمجة التطبيقات ثم إدراج تجزئات md5 في حقل مخصص باستخدام SQL. ستحصل على أفضل ما في العالمين.

أوه! هذه فكرة رائعة جدًا.

هذه هي النصيحة المجانية التي كنت تبحث عنها!

نعم، كانت هذه الفكرة قد خطرت ببالي، ولكن بما أنني لا أفهم تمامًا كيفية عمل تجزئة MD5، لم يكن واضحًا ما إذا كانت هذه الإمكانية متاحة. حسنًا، سأجرب ذلك.

كل ما عليك فعله هو إضافة حقل مخصص:

  • user_id: واضح
  • name: “import_pass”
  • value: تجزئة MD5

ثم قم بتثبيت إضافة migratepassword.

شكرًا لك، لدي بعض الأسئلة آمل أن تتمكن من مساعدتي فيها.

التثبيت

قم بتشغيل الأمر bundle exec rake plugin:install repo=http://github.com/[Communiteq](https://www.communiteq.com) (سابقًا DiscourseHosting)/discourse-migratepassword في مجلد discourse الخاص بك
أعد تشغيل Discourse
  1. لقد قمت بتثبيته، لكن كيف يمكنني إعادة تشغيل Discourse؟

  2. كيف يمكنني إضافة الحقل المخصص؟ هل يمكنك تزويدي بجملة SQL، أم يمكن القيام بذلك عبر الـ API باستخدام الجزء "user_fields[1]": "string"؟ أنا حاليًا قادر برمجيًا على إنشاء مستخدم عبر الـ API، لكنني أتجاهل هذا الحقل حاليًا.

  3. إذا كان لديك الإضافة المثبتة، فهل تكون قيمة كلمة المرور الممررة كجزء من استدعاء إنشاء المستخدم عبر الـ API غير ذات صلة؟

  1. لا، سيتم تطبيقه على ملخص MD5 في الحقل المخصص.

يمكن العثور بسهولة على إجابات السؤالين الآخرين في هذا المنتدى. إذا كنت ترغب في توفير الوقت، يمكننا تنفيذ عملية الاستيراد و/أو الاستضافة لك كخدمة مدفوعة.

لقد بحثت عن الإجابات في كلا الحالتين ولم أتمكن من العثور عليها. في الحالة الأولى، من المُربك أن بعض التثبيتات تتم عبر تعديل ملف YAML ثم إعادة تشغيل Docker، بينما يبدو أن البعض الآخر، مثل هذا، يتم تثبيته داخل حاوية Docker. ليس واضحًا ما يعنيه إعادة التشغيل في هذه الحالة.

لا أستطيع العثور على أي كود SQL نقي في هذا المنتدى.

من المفاجئ وجود هذا الدفع القوي لبيع الخدمات المدفوعة لاستخدام هذا البرنامج مفتوح المصدر، لم أرَ شيئًا كهذا عندما أطرح أسئلتي على Stack Overflow.

أحب أن أفكر بشكل إبداعي، وأبتكر، وأساهم. لكنني أيضًا أحتاج إلى كسب رزقي، وهذا يعني أنني بحاجة إلى رسم خط فاصل في مكان ما، وأحاول رسمه حيث أشعر أنني أقوم بعمل روتيني بدلاً من الابتكار والمساهمة والتفكير الإبداعي.

البحث عن استعلام SQL لحقل مخصص للمستخدم بالنسبة لي يعتبر عملًا روتينيًا، وبما أنك مطور خبير، فأنا أتوقع أنك قادر على استنتاج ذلك أيضًا :smiley:

بالطبع، يمكنني المحاولة وحل الأمر، لكن لا ضرر من السؤال بما أنه ليس

يمكن العثور عليه بسهولة في هذا المنتدى

أما بالنسبة للسؤال الآخر، فلا يزال غير واضح بالنسبة لي.

لا أتوقع منك أن تقوم بعملي نيابةً عني، ولكن من ناحية أخرى، أجد عمومًا أنه محبط كيف تفترض الوثائق الكثير من المستخدمين.

حسناً، السؤال 2: مثال لإضافة حقل مخصص باسم import_pass لمعرف المستخدم 5 (يمكن رؤية معرف المستخدم في جدول user_emails أو معرف id من جدول users)

insert into user_custom_fields (user_id, name, value, created_at, updated_at) values (5,‘import_pass’,‘2aee1c40222c7754d4534e61452612cc’, now(), now());

حسنًا، لقد وجدته
./launcher restart app
لكنه لا يبدو أنه يعيد التشغيل، يمكنني الدخول إلى التطبيق والاتصال بقاعدة البيانات، لكن لا يمكنني الاتصال بالموقع الإلكتروني. ربما سأقوم بإعادة البناء والبدء من جديد.

لذا قمت بتشغيل ./launcher rebuild app وعاد النظام للعمل مرة أخرى.

ظننت أن هذا الأمر سيعيد إنشاء قاعدة البيانات، لكنه لم يفعل، وأعتقد أن السبب هو أن قاعدة البيانات الفعلية تُحفظ خارج Docker، بينما يعيد أمر rebuild بناء تطبيق Docker فقط. كما أرى أن إضافة dataexplorer التي أضفتها (بتعديل ملف yaml) لا تزال موجودة. لكن هل إضافة passwordmigration موجودة أيضًا أم يتم حذفها بواسطة rebuild؟ بالتأكيد لا يوجد شيء في قسم الإضافات في صفحة الإدارة.

حسنًا، جربت تثبيت passwordmigration ثم شغلت أمر restart مرة أخرى، وعاد الموقع إلى التوقف مرة أخرى. يبدو أن إضافة passwordmigration تتسبب في حدوث مشكلة ما.

لذا قمت بإعادة البناء مرة أخرى، وعاد الموقع للعمل (لكن إضافة passwordmigration مفقودة الآن). إذا قمت بتشغيل ./launcher restart app دون تثبيت passwordmigration أولاً، فإن إعادة التشغيل تتم بنجاح، مما يشير إلى أن هناك مشكلة محددة تتعلق بـ passwordmigration في إعداداتي.

في المرة الأخيرة التي جربتها، كان ملحق passwordmigration غير متوافق مع تشغيل عملية استيراد، لذا ستحتاج إلى تثبيته بعد الانتهاء من الاستيراد.

قد يكون السبب في تعطيل عملية إعادة البناء، لكن هذا أمر مفاجئ بعض الشيء، حيث يستخدمه ريتشارد في استضافته. أنصحك بتثبيته في ملف app.yml تمامًا كما فعلت مع مستكشف البيانات بعد الانتهاء من الاستيراد.

استخدم الأمر rm -rf لمسح مجلدات postgres في /var/discourse/shared/standalone إذا كنت ترغب في الحصول على قاعدة بيانات جديدة. ربما يمكنك الاطلاع على https://meta.discourse.org/t/advanced-troubleshooting-with-docker/15927

يجب أن يكون تعطيله أثناء الاستيراد كافياً

غريب، قمت بحذف قاعدة البيانات وشغلت ./discourse-setup، فحصلت على تثبيت جديد تمامًا، وكان كل شيء على ما يرام.
ثم قمت بتثبيت إضافة migrationpassword عبر أمر rake وأعدت تشغيل الخادم، لكن الموقع فشل مرة أخرى بإرجاع خطأ 502!
كانت إضافة DataExplorer لا تزال موجودة، لذا قمت بإزالتها، وأعدت البناء، فكل شيء سار على ما يرام، ثم قمت بإعادة تثبيت migrationpassword وفشل مرة أخرى بإرجاع خطأ 502.

هذا أمر محير للغاية، لأنه يعمل بوضوح لدى الآخرين لكنه لا يعمل على التثبيت البسيط الخاص بي.

سأحاول التثبيت عن طريق تعديل ملف app.yml في الخطوة التالية.

({الشتاء) لكنني أخيرًا جربت تثبيت migratepassword عن طريق تعديل app.yml وإعادة البناء، وقد نجح الأمر!
لكن خيار bundle exec rake plugin:install repo=http://github.com/[Communiteq](https://www.communiteq.com) (سابقًا DiscourseHosting)/discourse-migratepassword لا يعمل في تثبيتي البسيط، ربما يحتاج هذا إلى التحقق منه أو إزالته في ملف README.md في GitHub - communiteq/discourse-migratepassword: Support migrated password hashes · GitHub