لكن إعداداتي لا تظهر في واجهة المسؤول، لذا أعتقد أن هذا قد لا يكون قديمًا، بل هو مجرد مسألة الحصول على مزيج الإعدادات الصحيح.
رأيت هذا…
… لكن منطقة المسؤول لا تسمح لي بترك “دلو تحميل s3” فارغًا، لذا لم أكن متأكدًا مما إذا كان ذلك ذا صلة. بدا ذلك أيضًا فقط إذا كنت تستخدم AWS S3 أيضًا. حاولت إنشاء مجلد في مساحة DO الخاصة بي واستخدام اسم هذا المجلد. حاولت استخدام اسم مختلف لمجلد لم يكن موجودًا، في حال احتاج إلى إنشائه بنفسه. لم ينجح أي من ذلك.
رأيت هذا…
… لكنني بعيد عن كوني خبيرًا، لذا تجنبت ذلك.
في هذه المرحلة، لقد نفدت أفكاري لمحاولة ولست متأكدًا مما إذا كنت قريبًا وأحتاج فقط إلى تكوين الإعداد الصحيح أو إذا كنت أفتقد شيئًا تمامًا ولست قريبًا على الإطلاق.
لا، ليست كذلك. بينما يمكنك تكوين نقاط نهاية S3 في واجهة المستخدم، فقد اختبرنا وصادقنا فقط باستخدام استنساخات S3، مثل العرض الذي تقدمه Digital Ocean، عند تكوينها في ملف app.yml.
لا أرى قسمًا في app.yml لإعدادات DISCOURSE_S3. هل أقوم فقط بإنشاء سطر لكل منها؟ أم أن هذا ما تفعله أوامر sudo؟
لست متأكدًا تمامًا من مكان تشغيل أو وضع أوامر sudo هذه. لست متأكدًا مما إذا كان هذا عنصرًا لمرة واحدة في سطر الأوامر لإضافته أو ما إذا كان شيئًا يجب وضعه في app.yml بحيث يتم حسابه دائمًا.
هل تذهب أوامر sudo إلى منطقة app.yml أم فقط أسطر إعداد DISCOURSE_S3؟
هل أترك هذا فارغًا مع DO Spaces؟ DISCOURSE_S3_REGION:
هل يجب أن يكون لدي شبكة توصيل محتوى (CDN)؟ لدينا حركة مرور منخفضة جدًا. مجموعة صغيرة. أحاول حقًا الحد من الأجزاء المتحركة إن أمكن.
هل هناك أي حل لهذه المشكلة؟ لقد واجهت نفس الخطأ عند محاولة استخدام Oracle Cloud Storage.
لقد اتبعت الويكي عن طريق التعيين في app.yml. لقد حاولت استخدام s3cmd يدويًا للتأكد من صحة الاتصال. ولكن عند تحميل صورة في منشور، واجهت نفس رسالة الخطأ.
ثم حصلت على رسالة الخطأ بالضبط في أداة s3cmd كما يظهر في Discourse:
Please wait, attempting to list all buckets...
ERROR: Test failed: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'objectstorage.ap-singapore-1.oci.oraclecloud.com'. (_ssl.c:1007)
إذًا، ربما تكون المشكلة من هذا:\n\n- شهادة SSL مُصدرة إلى: *.compat.objectstorage.ap-singapore-1.oraclecloud.com\n- النطاق الأخير مختلف عن شهادة SSL: objectstorage.ap-singapore-1.oci.oraclecloud.com\n\nهل هناك أي طريقة لحل هذه المشكلة؟ شكرًا لك!
بعد عدة محاولات، ما زلت أتلقى نفس رسالة الخطأ. لقد تحققت يدويًا من الشهادة واسم المضيف، واستخدمت التنسيق الصحيح للحصول على الشهادة الصحيحة بالعين، ولكن لم يحالفني الحظ.
نقطة النهاية الخاصة بي: ..compat.objectstorage.oraclecloud.com
الاسم الشائع للشهادة: *.compat.objectstorage..oraclecloud.com
يمكنني الاتصال بأداة s3cmd. ولكن لا يمكنني إعداد تحميل S3 لـ discourse بنفس التكوين.
هذه فكرة سيئة لأنها ستقوض العديد من الحمايات التي توفرها شهادات X509.
هل يمكنك إظهار ما هي إعداداتك غير السرية هنا؟ يرجى ملاحظة أن Oracle Cloud غير مدعوم، ولكننا سنلقي نظرة سريعة لمعرفة ما إذا كان هناك أي شيء خاطئ بشكل واضح.
حسنًا، لقد أضفت binding.pry إلى بداية ssl_socket_connect وما أراه عند محاولة استخدام هذه الإعدادات هو:
→ DISCOURSE_USE_S3=true DISCOURSE_S3_REGION=ap-singapore-1 DISCOURSE_S3_ENDPOINT=https://axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com DISCOURSE_S3_ACCESS_KEY_ID=foo DISCOURSE_S3_SECRET_ACCESS_KEY=bar DISCOURSE_S3_BUCKET=bucketname bin/rails c
Loading development environment (Rails 7.0.7)
[1] pry(main)> s3 = S3Helper.build_from_config; s3.list
From: /home/michael/.rvm/gems/ruby-3.2.2@discourse/gems/net-protocol-0.2.2/lib/net/protocol.rb:42 Net::Protocol#ssl_socket_connect:
40: def ssl_socket_connect(s, timeout)
41: binding.pry
=> 42: if timeout
43: while true
44: raise Net::OpenTimeout if timeout <= 0
45: start = Process.clock_gettime Process::CLOCK_MONOTONIC
46: # to_io is required because SSLSocket doesn't have wait_readable yet
47: case s.connect_nonblock(exception: false)
48: when :wait_readable; s.to_io.wait_readable(timeout)
49: when :wait_writable; s.to_io.wait_writable(timeout)
50: else; break
51: end
52: timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
53: end
54: else
55: s.connect
56: end
57: end
[1] pry(#<Net::HTTP>> s.hostname
=> "bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com"
إذًا، اسم المضيف الفعلي الذي يتم الاتصال به هو bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com، والذي لا يتطابق مع *.compat.objectstorage.ap-singapore-1.oraclecloud.com، لذا فإن الخطأ صحيح.
استخدم الوصول المستند إلى المسار في تطبيقك. لا يتم دعم الوصول بنمط المضيف الافتراضي (الوصول إلى حاوية كـ {bucketnamespace}.compat.objectstorage.{region}.oraclecloud.com [sic]).
على العكس من ذلك، يدعم Discourse فقط الوصول بنمط المضيف الافتراضي ({bucketname}.{namespace}.compat.objectstorage.{region}.oraclecloud.com).
لقد أزلنا الإعداد الذي ربما كان سيجعله يعمل منذ فترة لأنه لم يكن مدعومًا بشكل جيد (انظر رسالة الالتزام).
جعل هذا يعمل لن يكون بسيطًا وسيتطلب تطويرًا واختبارًا معقدًا لإضافة هذا الدعم.
لقد واجهت هذه المشكلة وقمت بحلها. كان حلي هو أن خادم البريد الخاص بي لم يكن موثقًا بشهادة SSL عند إعداده، لكن موفر النطاق الخاص بي قدم لي خادم بريد موثقًا بشهادة SSL، لذا قمت باستبدالهما.