تكوين نشر Discourse الرأيوية لـ MKJ

مايكل،

الآن بعد أن استخدمته، أوافق على أن restic هو “الأفضل” للنسخ الاحتياطي، لكنني أتساءل ما إذا كنت قد استخدمت خيارًا متوافقًا مثل garage بدلاً من minio في ضوء الجدل الأخير حوله؟ أم أن الإجابة هي “لا يهم، الجميع يستخدم نفس الأوامر، لذا يمكنك استخدام أيهما تفضل”؟ هذه أدوات لا أزال أتعلمها الآن، لذا لا أعرف الفروقات التفصيلية، بل فقط أن التوجيه الحالي هو استخدام garage بدلاً من minio.

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

أوه، نعم، أنا واثق من أنني سأبدأ من المرآب اليوم. لم أقم بالنقل بعد فقط.

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

كما أود أن أشكر @raykholo على لفت انتباهي خارج القناة إلى أن تعليماتي حول تعطيل الصفحات الهائلة الشفافة كانت خاطئة بشكل صامت.

أيها المتابعون لهذا الأمر، يرجى استخدام هذا بدلاً من ذلك:

echo 'w /sys/kernel/mm/transparent_hugepage/enabled - - - - never
w /sys/kernel/mm/transparent_hugepage/defrag  - - - - never' > /etc/tmpfiles.d/thp.conf
systemd-tmpfiles --create

هذه الإعدادات لا يمكن تكوينها عبر sysctl، وإذا كنت قد أنشأت سابقاً ملف /etc/sysctl.d/10-huge-pages.conf وفقاً لتعليماتي السابقة، يمكنك حذفه.

لم أتحقق من ذلك بشكل صحيح عند كتابتي له، وفشلت في ملاحظة أنه لم يعمل بشكل صحيح منذ ذلك الحين. ملاحظة رائعة، وشكراً لك!

3 إعجابات

حسناً. لدي نظامان، وقد نظرتُ إليهما للتو، وأعتقد أن فرضيتي هي أنك على حق فيما يتعلق بإصدار أوبونتو 22، وأن تصحيحك كان مفيداً، لكنه غير ضروري لإصدار أوبونتو 24. وأثناء كتابة هذا، أدركت أن تصحيحك قد يكون فعالاً أيضاً في أوبونتو 24 حتى لو لم يكن ضرورياً. ما إصدار نظام التشغيل الذي تعمل عليه؟

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

أستخدم AlmaLinux، كما هو موضح في الأعلى. بمجرد أن حصلت Docker أخيراً على دعم فضاءات العناوين من النوع v2، استغليت أول فرصة للانتقال إلى نظام تشغيل مشتق من Red Hat.

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

نحن سعداء جداً بوجودك هنا! هل ترغب في تشغيل خادم Minecraft الخاص بك؟ فقط انقر على زر “ابدأ” أدناه — إنه سهل.

ربما أكون أجيب على سؤالي أنا، إليك بعض الملاحظات من محاولة استخدام Garage مع دليل التشغيل الخاص بك:


1. Garage لا يدعم “وسوم الأذونات” على الملفات (هذا هو الفارق الحقيقي في Garage)

تتيح لك Amazon وضع وسم “عام” أو “خاص” على كل ملف بشكل فردي. Garage لا ينفذ ذلك.

يحاول Discourse استخدامه بشكل افتراضي. الجزء الخفي: عندما قال Discourse “احفظ هذا الملف، وعلّمه كعام”، قبل Garage الطلب وتجاهل الوسم بصمت. لذا بدت التحميلات الأساسية جيدة، وكان سينكسر فقط في وقت لاحق، في المرة الأولى التي جعل فيها شخص ما التحميل خاصاً.

الحل: أخبر Discourse بالتوقف عن استخدام الوسوم (إعداد واحد). Cloudflare’s R2 لديه نفس الفارق ويحصل على نفس الحل. Garage يتعامل مع الأذونات بطريقته الخاصة، على مستوى الدلو، وهو كل ما نحتاجه.


2. Discourse يصر على تسمية الدلاء بطريقة محددة (ليس عيباً في Garage)

لن يقول Discourse “الخادم في garage، الدلو uploads.” إنه يصر على uploads.garage — اسم الدلو ملتصق في المقدمة، مثل نطاق فرعي. ولا توجد خيار لإيقاف ذلك.

لم يكن هناك شيء على شبكتنا يعرف ذلك الاسم، لذا لم يستطع Discourse الاتصال على الإطلاق — مات التثبيت في منتصف الطريق.

الحل: أعطيت Garage ذلك نمط التسمية وسجلت الأسماء. سطرين من الإعدادات.

هذا هو شذوذ معروف في Discourse، وليس في Garage — إنه السبب في أن تخزين Oracle على قائمة Discourse الرسمية “لن يعمل”.


3. الصور كانت بحاجة إلى عنوان ويب عام (لا علاقة له بـ Garage)

يكتب Discourse عنوان كل صورة في المنشور بشكل دائم. بدون إخباره بالعنوان العام مسبقاً، حفظ عناوين داخلية فقط خادمنا يمكنه الوصول إليها — لذا كل صورة ستكون مكسورة للزوار، إلى الأبد، ما لم نعيد بناء كل منشور.

الحل: حدد عنوان CDN قبل أول تحميل. كان سيكون متطابقاً على Amazon، R2، أي شيء.


ملاحظة: كل واحد من هذه كان صامتاً. لم يقل شيء “غير مدعوم”. واحد قبل الطلب وتجاهله، واحد بدا كخطأ في الشبكة، واحد بدا كانه يعمل بشكل جيد.

لذا، فقط بعض الأشياء الأولية التي يجب وضعها في الاعتبار لمستخدم جديد يحاول ذلك لأول مرة، و/أو شخص يحاول اتباع دليل Michael مع Garage.

إليك ملاحظات AI الكاملة من ما عشناه الآن بعد أن تم نشر المنتدى:


تشغيل Discourse على Garage الذاتي الاستضافة (S3) خلف نفق Cloudflare — ملاحظات

Garage ليس على جدول التوافق “تكوين مزود تخزين كائنات متوافق مع S3”، لذا إليك نقطة بيانات. الإعداد: Garage v2.3.0، Discourse ثنائي الحاويات، Debian 13،
عقدة واحدة، نفق Cloudflare بدلاً من nginx خارجي. تحذير مسبق: هذا هو
نشر صغير واحد بدون حركة مرور إنتاجية بعد، لذا تعامل معه كـ “يعمل” وليس “مختبراً
على نطاق منتديات Maker”.

  1. إنه يعمل. تم التحقق منه ضد مسارات الكود الخاصة بـ Discourse، وليس سطر الأوامر: UploadCreator,
    OptimizedImage، ListObjectsV2، HeadObject/GetObject مع رحلة ذهاب وإياب دقيقة بايتياً،
    متعدد الأجزاء، حذف، remove_upload، بالإضافة إلى BackupRestore::Backuper يكتب إلى دلو النسخ الاحتياطي
    و BackupStore#files / #download_file يقرأه مرة أخرى. تكوين دورة الحياة
    يعمل، لذا s3_configure_tombstone_policy يتخذ مفعولاً فعلياً بدلاً من أن يكون
    متجاهلاً بصمت. PutBucketCors يعمل، لذا CORS اليدوي جيد.

  2. يجب عليك تكوين العنونة بنمط المضيف الافتراضي، وسينكسر db:migrate إذا لم تفعل. Discourse يحول نقطة النهاية http://garage:3900 + دلو “uploads” إلى المضيف
    uploads.garage:3900، ولا توجد خيار نمط المسار في أي مكان في s3_helper.rb أو
    site_settings.yml. مطلوب نصفين: root_domain تحت [s3_api] في garage.toml،
    واسم DNS قابل للحل لكل دلو (alias شبكة Docker لكل دلو، لأن DNS Docker لا يدعم النطاقات البرية). العرض إذا فاتك هو خطأ Aws::Waiters حول
    getaddrinfo أثناء SiteIconManager.ensure_optimized! — يبدو كعطل في الشبكة، وليس
    في التخزين. كل دلو جديد يحتاج إلى اسم جديد.

  3. Garage لا ينفذ PutObjectAcl / GetObjectAcl، لذا اضبط s3_use_acls على false —
    نفس R2. هناك فخان هنا. أولاً، PutObject مع --acl public-read مقبول بصمت
    ويتم تجاهل الرأس، لذا تجارب التحميل الأساسية تمر وينكسر فقط لاحقاً على
    انتقال التحميل الآمن. ثانياً، DISCOURSE_S3_USE_ACLS ليس عالمياً مخفياً —
    وضعه في app.yml لا يفعل شيئاً. ظهر صحيحاً في أول تشغيل لي رغم كونه في
    البيئة. يجب أن يكون إعداد موقع، ويحتاج إلى إعادة التحقق بعد كل إعادة بناء
    لأن لا شيء يحذرك.

  4. إذا وضعت CDN في المقدمة، وجهه إلى نقطة نهاية WEB الخاصة بـ Garage (:3902)، وليس API S3
    (:3900). القراءات المجهولة تعمل فقط على نقطة النهاية الويب؛ API S3 يرفض بشكل صحيح 403
    الطلبات غير المصادق عليها، لذا CDN موجّه إلى :3900 يفشل على كل صورة بينما
    بيانات اعتمادك صالحة تماماً. تحتاج أيضاً إلى garage bucket website --allow على
    دلو التحميلات، و root_domain تحت [s3_web]. فعّله على التحميلات فقط — دلو النسخ الاحتياطي يجب أن يكون غير قابل للقراءة المجهولة أبداً.

  5. ListObjectVersions يعيد NotImplemented على Garage. لا يهم: البحث في
    s3_helper.rb و file_store/s3_store.rb عن list_object_versions / object_versions
    يعيد صفر ضربات. Discourse لا يستخدم إصدارات كائنات S3؛ انتهاء صلاحية tombstone هو
    قواعد دورة الحياة بالإضافة إلى بادئة.

  6. الاختبار مع aws-cli أو mc لا يثبت التوافق. كلاهما يستخدم نمط العنونة بالمسار
    ضد نقطة نهاية مخصصة؛ Discourse يستخدم فقط نمط المضيف الافتراضي. مروري CLI
    جاء 15/16 وبدو كإشارة خضراء، ثم فشل التثبيت الحقيقي
    فوراً على فرق العنونة. نفس المتجر، نفس بيانات الاعتماد، نفس
    العمليات. إذا كنت تقم بتقييم خلفية S3 غير مثبتة، قم بتشغيل Discourse حقيقي —
    حاوية واحدة مرمية تكفي، وفعله قبل وجود أي محتوى هو
    النقطة كلها، لأن S3 → محلي هو باب أحادي الاتجاه.

  7. على نفق Cloudflare تحديداً: قسم external-nginx-for-SSL لا ينطبق
    (TLS ينتهي على الحافة، بدون certbot، بدون 80/443 وارد)، لكن تكوين مخرج real-IP
    لا يزال أساسياً وربما أكثر. استخدم real_ip_header CF-Connecting-IP
    بدلاً من X-Forwarded-For — عندما يكون النفق هو مسار الدخول الوحيد فهو قيمة مجموعة حافة واحدة غير غامضة. تحقق منه عن طريق النشر من عنوان IP عام معروف والتحقق
    مما سجله nginx؛ بدونه يسجل Discourse عنوان Docker للمربط ل
    كل طلب ويحد من معدل الإنترنت بأكمله كعميل واحد. ما تفقده مقابل
    نهج external-nginx هو صفحة الصيانة أثناء إعادة البناء — cloudflared
    لا يمكنه تقديم واحدة.

  8. تصحيح بسيط لشيء شائع (مختلط) به، بما في ذلك من قبل: DISCOURSE_S3_CDN_URL
    ليس مخبوزاً بشكل غير قابل للعكس في العناوين المخزنة. upload.url يخزن عنوان S3 الخام مع
    المضيف الداخلي، لكن Discourse يستبدل مضيف CDN في وقت العرض عبر
    Discourse.store.cdn_url / UrlHelper.cook_url. تعيينه متأخراً قابل للاسترداد — التكلفة هي rake posts:rebake، لأن posts.cooked يخزن HTML من وقت الطهي. لا يزال
    تعيينه قبل أول تحميل؛ فقط لا ترتعب إذا لم تفعل.

  9. ملاحظتان تشغيليتان غير مرتبطتين بـ Garage. ./launcher يصدو سطر docker run الكامل
    بما في ذلك DISCOURSE_S3_SECRET_ACCESS_KEY كنص عادي، لذا سجلات التمهيد تحمل أسراراً — يستحق تدوير المفاتيح بعد تثبيت ضوضائي. و Garage عقدة واحدة
    لا يزال يتطلب layout assign + layout apply قبل أن يخزن أي شيء، مع
    replication_factor = 1 يعني لا تكرار على الإطلاق، لذا مهمة النسخ الاحتياطي الخاصة بك هي المتانة الوحيدة التي لديك.

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

النسخ الاحتياطي لـ Discourse مع الصور المصغرة ولكن دون الصور، جنبًا إلى جنب مع النسخ الاحتياطي على مستوى المضيف لملفات الرفع، والنسخ الاحتياطي باستخدام restic على المضيف، يعني أن تلك القيود،据我所知، غير ذات صلة.