تكوين موفر تخزين كائنات متوافق مع S3 للتحميلات

اضطررت إلى إيقاف هذا مؤقتًا في الوقت الحالي، حيث بدا أنه سيعمل ولكن بعد ذلك هناك شيء غريب يحدث مع R2 فيما يتعلق بترميز المحتوى مع الأصول إما عند التحميل وعدم تعيين الرأس أو شيء آخر. سيواجه خطأ “رمز غير صالح أو غير متوقع” نظرًا لأصل gz لشيء مثل browser-detect-7af298cd000a967d2bdc01b04807eda2924a388584ea38ad84919b726283c2ed.gz.js. يبدو أن rake s3:upload_assets يعمل ولكن الملفات لا تتم قراءتها بشكل صحيح من جانب المتصفح.

لا أفهم حقًا لماذا مع AWS S3 يكون الأمر جيدًا باستخدام عنوان URL للخادم المحلي للأصول (فهي غير موجودة في حاوية S3 الحالية لدينا للتحميلات) ولكن بالنسبة لاستخدام R2 فإنه يريد استخدام DISCOURSE_S3_CDN_URL للأصول فقط. إذا كان بإمكاني فرض الأصول من عنوان URL للخادم، فربما يعمل كل هذا.

تعديل: الدردشة على CF، يبدو أن هذه هي المشكلة، ومنذ اليوم سبب عدم إمكانية استخدام R2 مع Discourse دون بعض التغييرات. يمكنني كتابة نص برمجي في خطوة ما بعد الربط لإزالة أصول gz ولكنني أشعر أنني بالفعل “خارج المسار” بما فيه الكفاية ليوم واحد:

الملفات التي تضغطها (gzip) لا تتم معالجتها حاليًا بشكل صحيح بواسطة R2. يجب عليك تحميل الملفات غير المضغوطة. لدى Cloudflare ضغط شفاف، فهي تختار الهوية أو gzip أو Brotli بناءً على ما يمكن للعميل التعامل معه. هذا يختلف عن S3.

إعجابَين (2)

عمل رائع! وهذه رسالة واضحة من cloudflare حول سبب عدم عملها. شكراً جزيلاً. سأقوم بنسخ ذلك إلى OP قريباً.

إعجابَين (2)

شكراً مرة أخرى! لقد قمت بتحديث OP:

3 إعجابات

شكراً لك على إعداد هذا الدليل! لقد حققت بعض النجاح في استخدام Minio.

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

  minio:
    image: minio/minio
    command: server --console-address :9001 /data
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./data/minio:/data
    environment:
      MINIO_DOMAIN: minio.mydomain.com
    networks:
      default:
        aliases:
          - assets.minio.mydomain.com

في هذه الحالة، ستقوم بتعيين DISCOURSE_S3_ENDPOINT=http://minio.mydomain.com:9000 و DISCOURSE_S3_CDN_URL=//assets.minio.mydomain.com:9000، وتعيين ملف /etc/hosts/ المحلي الخاص بك للإشارة إلى اسم النطاق الفرعي إلى localhost.

هذا يعمل بشكل جيد في الغالب، ولكني لاحظت أن Discourse غير قادر على تنزيل الملفات من عنوان لا يحتوي على المنفذ 80 أو 443، لذلك سيتم تحميل صورة بنجاح، ولكن عندما يحاول تنزيلها لتغيير حجمها، فسيفشل.

كنت أفكر أنه قد يكون من الجيد ذكر ذلك في قسم Minio أو في الملخص، وأن DISCOURSE_S3_CDN_URL يجب أن يكون على المنفذ 80 أو 443.

4 إعجابات

مرحباً @Falco - هل يشير هذا إلى الطريقة التي يعمل بها رأس Content-Encoding: gzip مع شبكة توصيل المحتوى (CDN) الخاصة بـ Spaces؟ يبدو هذا مشابهاً لـ Cloudflare R2، حيث يتم جعل موقع الأصول هو نفسه شبكة توصيل المحتوى (CDN) الخاصة بالتحميلات، لذا يتوقف gzip عن العمل؟ إليك ما يحدث مع R2 اليوم.

قد يكون من المفيد النظر في تبديل لهذا السلوك، أي تقديم الأصول من المصدر بدلاً من استخدام DISCOURSE_S3_CDN_URL دائماً؟ سأكون سعيداً بالبحث لمعرفة كيفية القيام بذلك، إذا كان سيتم اعتباره كتغيير محتمل في التكوين.

3 إعجابات

هذا ما يجب أن يحدث إذا حذفت تكوين DISCOURSE_S3_CDN_URL ولكن نظرًا لأنه حالة زاوية غريبة، وخطأ محتمل مكلف، فإنه ليس تكوينًا شائعًا.

3 إعجابات

نعم، يمكنني فهم ذلك. إدخال قيمة منطقية جديدة للإعداد العام S3_ORIGIN_ASSETS (أو S3_BROKEN_PROXY_FUDGE :slight_smile:) في هذا المكان تقريبًا، يشبه كيف تسمح نصوص الاختبار غير المضغوطة بتخزين Digital Ocean Spaces و Cloudflare R2 وشبكة توصيل المحتوى (CDN) بالعمل مع Discourse فورًا، وهي ميزة إضافية لطيفة لا تتطلب الكثير من الجهد؟ ربما للنظر فيها في المستقبل على أي حال. :heart_eyes_cat:

4 إعجابات

أوه، رأيت في ملاحظات الإصدار 3.0.beta أن هناك شيئًا ما تمت إضافته. سأجربه، إلا إذا أسأت فهم الغرض منه؟ قد يسمح باستخدام Cloudflare R2 و Digital Ocean Spaces مع شبكات توصيل المحتوى الخاصة بهم للقيام بتلك الأشياء الغريبة مع gzip.

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

لا، هذا غير ذي صلة.

3 إعجابات

أتاحت لي الإعدادات تحديد الموقع المحلي كنقطة انطلاق، للتغلب على الحاجة إلى وجود أصول JavaScript في موقع S3 (في هذه الحالة Cloudflare أو Digital Ocean Spaces مع تمكين CDN). شكرًا لـ @david على التغيير، حتى لو لم يكن هذا هو المقصود.

4 إعجابات

هل تدخل عنوان URL للموقع لـ CDN الخاص بالأصول؟ ذكي!

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

مرحباً يا رفاق، هل يعرف أحد ما إذا كان هذا قد يتعلق بـ Discourse؟

هذا هو ملف XML للملفات التي حاولنا تحميلها إلى مساحة تخزين S3 الخاصة بنا التي كانت تعمل سابقًا مع Discourse:

<Error>
<Code>InvalidArgument</Code>
<Message>
Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.
</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>ID</RequestId>
<HostId>
ID
</HostId>
</Error>
إعجاب واحد (1)

هل تستخدم AWS؟ أم شيئًا آخر؟

هل هذا المستودع مهيأ بتشفير من جانب الخادم؟

قد يكون أن مكتبة ما تم تحديثها وتتصرف بشكل مختلف.

إعجابَين (2)

شكرًا، لقد تحققت مرة أخرى ويبدو أنه يعمل مع التكوين التلقائي ولكنه لا يدير مفاتيحي الخاصة من إدارة S3.

هل تعرف ما إذا كان ذلك ممكنًا ضمن Discourse؟

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

تم تقسيم 3 مشاركات إلى موضوع جديد: لماذا يتم تشغيل UpdatePostUploadsSecureStatus حتى عند تعطيل التحميلات الآمنة؟

يبدو أنه تم إصلاح هذا مؤخرًا.
في سجل التغييرات بتاريخ 16-3-2023 يسرد إصلاحًا للأخطاء المتعلقة بالتعامل مع ملفات gzip.

نحن نقوم بتشغيل منتدى discourse الخاص بنا على discourse.aosus.org مع R2 حاليًا (لم نقم بتشغيل migrate_to_s3 بعد)، ويبدو أن كل شيء على ما يرام! لا توجد مشاكل ملحوظة حتى الآن.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-east-1" # اسم مستعار لـ auto
  #DISCOURSE_S3_INSTALL_CORS_RULE: true # يجب أن يكون مدعومًا
  DISCOURSE_S3_ENDPOINT: S3_API_URL
  DISCOURSE_S3_ACCESS_KEY_ID: xxx
  DISCOURSE_S3_SECRET_ACCESS_KEY: xxxx
  DISCOURSE_S3_CDN_URL: your cdn url
  DISCOURSE_S3_BUCKET: BUCKET_NAME

هل هناك طريقة لتحديد مضيفين منفصلين للنسخ الاحتياطي؟ سيكون من الرائع إذا كان من الممكن ترك R2 لأغراض CDN فقط.

إعجابَين (2)

لا يوجد. يبدو من غير المرجح أن يتغير هذا.

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

تم تقسيم 23 مشاركة إلى موضوع جديد: مشاكل في تكوين تخزين الكائنات

من الغريب أن الإعدادات الموجودة في متغيرات البيئة لا تنعكس في واجهة المسؤول. هل يحدث تجاوز؟ هل ستقوم إعدادات S3 الجديدة في واجهة المسؤول بتجاوز تلك الموجودة في البيئة؟

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

نعم. تتجاوز متغيرات البيئة القيم الموجودة في قاعدة البيانات ويتم إخفاؤها عن واجهة المستخدم.

4 إعجابات