نشر Discourse بدون Docker

بعض التفاصيل حول حلولي:

  1. إعداد Nginx:
    خلف وكيل عكسي (haproxy)، تحتاج إلى نسخ /var/discourse/config/nginx-config-sample.conf إلى /etc/nginx/sites-enabled/discourse.conf أو هدف مشابه، ثم استبدال listen <yourreverseproxyport> (إذا لزم الأمر)، و _ في server_name باسم المضيف الخاص بك (subdmain.example.com). لا شيء آخر يجب تغييره.
  2. الصفحات لا تُعرض (رسالة “Oops”) وتسجيل مسؤولي البريد الإلكتروني لا يعمل:
    كان Magick هو سبب عدم عرض الصفحات بعد صفحات تسجيل المسؤولين عند التشغيل الأول. اتبعت الملف المشار إليه في السجل: /var/www/discourse/lib/letter_avatar.rb:112 في السطر 112، كان هناك أمران magick لم يستجيبا بالفعل. استجاب convert، لذلك استبدلت magick في هذا السطر بـ convert. بعد هذه التصحيحات، تم تسجيل خطأ آخر. محاولة نفس الإجراء باستخدام الأمر المعطى من الملف، لم يعمل أمر magick، وفشل convert. ملاحظة: magick --version كان 7.x و convert --version أعطى 6.x. السبب هو أنني قمت أولاً بتثبيت imagemagick باستخدام apt، ثم magick 7 من المصدر. كانت هناك بعض التعارضات وأخبر magick أمر convert بأنه قديم. لذلك قمت بإعادة تشغيل برنامجي باستخدام magick 7 فقط. هذا حل المشكلة فورًا وتمكنت من رؤية الصفحات الجديدة التي طال انتظارها لأيام، وعمل البريد الإلكتروني أيضًا! Magick سحري حقًا.
  3. لا تزال مشكلة المحتوى المختلط قائمة، لكن الموقع يعمل بشكل جيد على الرغم من ذلك.
    ملاحظة: في puma.rb، يجب أن يكون السطر bind ENV.fetch("PUMA_BIND", "tcp://#{ENV['PUMA_BIND_ALL'] ? '' : '127.0.0.1:'}3000") كما يلي (تصحيح المنشور الأول.)
  4. تحرير “3.”، حول فرض https لـ discourse: لا أعرف لماذا بالضبط، لكن متصفحاتي لم تعد تعرض تحذيرات “المحتوى المختلط” (ربما بسبب تحديث ذاكرة التخزين المؤقت)، لذا كل شيء على ما يرام الآن. أحتاج فقط إلى إنهاء برنامجي.
3 إعجابات

تم التأكيد على أنه يعمل!!!
ImageMagick v7 يحل مشكلة Ooops!
على حد علمي، فإنه يعمل بشكل كامل.
سأقوم باختبار باقي الميزات وسأبلغكم في أقرب وقت ممكن.

إعجاب واحد (1)

ما فعلته للاختبار هو تعيين متغير البيئة PUMA_BIND عند تشغيل puma.

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

هل هناك أي تقدم في التصحيح؟ من جهتي، أعمل على magick.
على بعض الصور التي تبلغ حوالي 50 كيلو بايت، تظهر نافذة منبثقة في المتصفح:
timeout -k 40.0 20 magick gif:/tmp/RackMultipart20250927-23598-xrrp6e.gif -auto-orient -background white -interlace none -flatten -debug all -quality 90 jpg:/tmp/image20250927-23598-9ujq3d.jpg ولا يتم تحميل أي صورة.
إذا كان الحجم أكبر، لا توجد نافذة منبثقة ولكن عجلة التحميل تدور بشكل لا نهائي دون نتيجة. لم يتم تسجيل أي خطأ في /var/www/discourse/log.

نفس المشكلة بالنسبة لي :joy::sob:

الطريقة الوحيدة التي تمكنت بها من تشغيله كانت باستخدام imagemagick من مستودع brew.

ولكنه يفشل عندما تكون الصورة أكبر من 3 ميجابايت… ربما قمت بإعداد تكوين سياسة مقيد للغاية.

جربها!!!

أنا أختبر تثبيت docker ولكني أعتقد أو أنني غبي جدًا في نشر nginx و unicorn و redis و postgresql والباقي في حاوية واحدة فقط… هذا لا معنى له على الإطلاق. ولا توجد وثائق للبنية التحتية للتوزيعات الكبيرة… لقد عملت في مجال تكنولوجيا المعلومات لأكثر من 20 عامًا ولا أرى سوى مشاكل قادمة في المستقبل القريب باستخدام مثل هذه البنية التحتية.

بدون الحديث عن “docker آكل المساحة” (مثل Dormammu) :rofl::rofl:

هذه المشكلة اختفت مع الحل التالي الموصوف في النهاية:

التصحيح 1: bundle db:create المخرجات، وأيضًا في السجلات عند أول تشغيل:


OID غير معروف 21096: فشل في التعرف على نوع ‘embeddings’. سيتم التعامل معه كسلسلة نصية.
عامل pngquant: pngquant غير موجود؛ يرجى توفير ملف ثنائي مناسب أو تعطيل هذا العامل (وسيطة --no-pngquant أو :pngquant => false عبر الخيارات)
عامل oxipng: oxipng غير موجود؛ يرجى توفير ملف ثنائي مناسب أو تعطيل هذا العامل (وسيطة --no-oxipng أو :oxipng => false عبر الخيارات)
عامل jhead: jhead غير موجود، jpegtran غير موجود؛ يرجى توفير ملف ثنائي مناسب أو تعطيل هذا العامل (وسيطة --no-jhead أو :jhead => false عبر الخيارات)
عامل jpegoptim: jpegoptim غير موجود؛ يرجى توفير ملف ثنائي مناسب أو تعطيل هذا العامل (وسيطة --no-jpegoptim أو :jpegoptim => false عبر الخيارات)

التصحيح 2: بعض أوامر magick مع مخرجات الملفات:

لا يوجد معالج فك تشفير لهذا تنسيق الصورة

تم ذكر هذه المشكلة الأخيرة هنا.

الحل هنا (يقوم بتثبيت magick مع مكونات إضافية للتنسيقات):

t=$(mktemp) && \
wget 'https://dist.1-2.dev/imei.sh' -qO "$t" && \
bash "$t" && \
rm "$t"

بعد ذلك، يمكن أن يصل حجم التحميل الخاص بي إلى 518 كيلوبايت. ما فوق ذلك لا. هذا للصور فقط. جميع المستندات والصوت والفيديو الأخرى تعمل.

حل مؤقت للمشكلة المتبقية:
لقد بحثت في إعدادات المسؤول، discourse.conf، nginx/sites-enables/discourse.conf، في مجلد git. أخيرًا في لوحة المسؤول/المعلمات/الملفات قمت بتعطيل “تمكين تحسين وسائط Composer للصور”، ثم يعمل كل شيء بشكل جيد. يمكنني تحميل أي صورة.

نعم، IMEI هو نفس الحل تقريبًا مثل استخدام brew ولكني متأكد من أنه لن يستغرق حوالي 2 جيجابايت من مساحة القرص :rofl::rofl::sob::sob::sob::face_with_symbols_on_mouth::face_with_symbols_on_mouth::face_with_symbols_on_mouth:
سأتحقق من حلك لأقصى حجم للملفات عند التحميل.
أنا أيضًا أواجه صعوبة في إيجاد حل لإرسال رسائل البريد الإلكتروني “مجانًا” (أنا في مرحلة مبكرة ولا أريد التعاقد مع mailtrap/mailgun/etc…)

لماذا لا تقوم بتثبيت خادم بريد؟ لدي خادم خاص بي وقمت بكتابة نص لتثبيته. أخبرني إذا كنت مهتمًا.

بالتأكيد! أرسل لي التعليمات أو مستودع git! :grinning_face_with_smiling_eyes:

لقد توقفت عن استخدام خوادم البريد المستضافة ذاتيًا منذ سنوات عديدة…

عند تشغيل rake assets:precompile، ظهرت رسالة No such file or directory - brotli، قم بتثبيته باستخدام مدير الحزم.

إعجابَين (2)

لقد وجدت أنه يرمي هذا الخطأ:

bundler: failed to load command: puma (/home/mry/.rbenv/versions/3.4.6/bin/puma)
/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/lib/puma/cluster.rb:472:in 'Puma::Cluster#run': undefined method 'wait_readable' for nil (NoMethodError)

            if read.wait_readable([0, @next_check - Time.now].max)
                   ^^^^^^^^^^^^^^
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/lib/puma/launcher.rb:202:in 'Puma::Launcher#run'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/lib/puma/cli.rb:73:in 'Puma::CLI#run'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/bin/puma:10:in '<top (required)>'
        from /home/mry/.rbenv/versions/3.4.6/bin/puma:25:in 'Kernel#load'
        from /home/mry/.rbenv/versions/3.4.6/bin/puma:25:in '<top (required)>'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in 'Kernel.load'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in 'Bundler::CLI::Exec#kernel_load'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in 'Bundler::CLI::Exec#run'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in 'Bundler::CLI#exec'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in 'Bundler::Thor::Command#run'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in 'Bundler::Thor::Invocation#invoke_command'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in 'Bundler::Thor.dispatch'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in 'Bundler::CLI.dispatch'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in 'Bundler::Thor::Base::ClassMethods#start'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in 'Bundler::CLI.start'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/exe/bundle:28:in 'block in <top (required)>'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in 'Bundler.with_friendly_errors'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/exe/bundle:20:in '<top (required)>'
        from /home/mry/.rbenv/versions/3.4.6/bin/bundle:25:in 'Kernel#load'
        from /home/mry/.rbenv/versions/3.4.6/bin/bundle:25:in '<main>'

ثم يعيد Puma تشغيل نفسه. ماذا أفعل لمنع هذا؟

تم التحرير: يبدو أن هذه مشكلة تنتمي إلى Puma منذ Ruby 3.4.0. تم حلها عن طريق تعطيل YJIT.

ثم استخدم 3.3.7. هذه هي النسخة التي أستخدمها.

أنا كسول جدًا لإعادة تنزيل الأحجار الكريمة، فقط سأعطل YJIT مع الاستمرار في استخدام 3.4.6.