تحديد روابط DISCOURSE_S3_CDN_URL للأصول في عنوان URL الخاص بـ S3 CDN

I had this problem before and decided that I was crazy, confused, or the database on the site was suspect, but this is on a brand new site. Also, I was on Digital Ocean spaces, so I thought it might be a problem somehow.

I’m trying again to figure out how to keep images on AWS S3 like I think the Big Boys do.

Here’s what I have in the env section:

  DISCOURSE_S3_ACCESS_KEY_ID: 'key'
  DISCOURSE_S3_SECRET_ACCESS_KEY: 'lock'
  DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_S3_BUCKET: 'lc-xyz'
  DISCOURSE_S3_BUCKET_NAME: 'lc-xyz'
  DISCOURSE_S3_BACKUP_BUCKET: 'lc-xyz/backups'
  DISCOURSE_S3_UPLOAD_BUCKET: 'lc-xyz/uploads'
  DISCOURSE_S3_CDN_URL: 'https://lc-rbx.s3.amazonaws.com'

When I include the s3 cdn url the site breaks because all of the links to the assets are on S3 like https://lc-xyz.s3.amazonaws.com/assets/plugin-third-party-01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b.br.js.

Because if you define s3 cdn url Discourse looks for the assets on the s3_cdn_url.

I did a rebuild, but the assets are still missing. I can do a

rake s3:upload_assets

Is there an after_bundling_assets stanza that I could add that to? (I know about after_db_migrate and after_bundle_exec, but don’t know if those would work.)

Do assets get produced some other time? (It would seem like when themes get modified assets would change.)

If I also had a “push CDN like normal”, would that keep this from happening?

Is there some best practice that I’m missing?

You can use after_assets_precompile as the hook for that rake task.

Aha! Thanks very much for that. Where does the list of those things live?

I’m still confused why this is necessary, especially since you seemed confused before. (Or maybe I should be happy that I can push all this stuff to S3, now that I know how to do it–And I think that it was you who said that one could use CloudFlare’s free CDN to front an AWS bucket.)

أحاول ذلك مرة أخرى. لدي عمليات تحميل تُرسل إلى S3. هذا يعمل.

لقد قمت بتكوين Cloudflare لتكون شبكة توصيل المحتوى (CDN) للموقع. إذا أدخلت https://lc-XXX.literatehosting.com/uploads في إعداد الموقع s3_cdn_url، فإن التحميلات الجديدة تذهب إلى مجموعة S3، ويتم ربط الصورة بعنوان URL الخاص بـ CDN، وهذا يعمل.

لكن إذا حاولت تعيين s3_cdn_url باستخدام متغير بيئة (ENV) في app.yml (أو عدلت config/discourse.conf يدويًا وأعدت تشغيل sv restart unicorn)، فإن جميع الأصول يتم تحميلها من S3 (حيث لا توجد). قد يكون هذا مقبولًا، ولكن إذا حاولت تشغيل rake s3:upload_assets، فإنه يشتكي من أن S3 غير مُهيأ.

لقد صادفت هذا أثناء حل مشكلة في أسماء الإعدادات المتضاربة.

أعتقد (وأرجو ذلك، لأن هذا يعني أنني فهمت الأمر ولم أكتب هراءً مطلقًا في الموضوع المرتبط أعلاه) أنه إذا قمت بإزالة السطرين التاليين:

DISCOURSE_S3_BUCKET: 'lc-xyz'
DISCOURSE_S3_BUCKET_NAME: 'lc-xyz'

فإنك تستطيع ضبط DISCOURSE_S3_CDN_URL، وسيُستخدم فقط للرفع وليس للملفات الثابتة.

أعتقد أنك تفهم بالفعل، وبفضلك، أصبحت أنا أيضًا أقرب إلى الفهم! شكرًا جزيلاً!

أواجه هذه المشكلة وما زلت مرتبكًا تمامًا بعد قراءة هذا الموضوع…

أحاول استضافة ملفات التحميل من S3 (وليس الأصول المُجمَّعة) عبر شبكة توصيل المحتوى (Cloudfront).

إذا قمت بتكوين “عنوان CDN الخاص بـ S3” عبر شاشة الإعدادات، فإن الأمر يعمل كما هو متوقع (حسنًا… باستثناء هذه المشكلة: System upload not using s3 cdn url).

ومع ذلك، إذا قمت بالتكوين عبر DISCOURSE_S3_CDN_URL وأعدت البناء، فإن الواجهة الأمامية تتعطل لأنها تحاول تحميل الأصول المُجمَّعة من عنوان CDN الخاص بـ S3 الخاص بي.

يبدو أن DISCOURSE_S3_CDN_URL أو s3_cdn_url يجب أن تؤثر فقط على التحميلات، بينما يجب أن يؤثر DISCOURSE_CDN_URL فقط على الأصول.

هذه هي تجربتي أيضًا. لقد انتهى بي الأمر إلى إنشاء إضافة لتحديد S3_CDN_URL.

@pfaffman يبدو أنه يجب تسجيل هذا كخطأ، أليس كذلك؟

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

يبدو أن نفس المشكلة تمنعني هنا
@pfaffman أحتاج إلى مساعدتك
هل تستخدم Cloudfront لتحقيق عنوان URL مخصص للمجال عبر CDN، أم تستخدم فقط البادئة العامة لكائنات الـ bucket في عنوان URL الخاص بـ CDN؟

لقد واجهت هذه المشكلة للتو. @pfaffman هل تم حلها من قبلك؟

تمكنت من تشغيل التحميلات عن طريق تعيين s3_cdn_url يدويًا في إعدادات الموقع، لكني أحتاج مثاليًا إلى القدرة على تعيين متغير البيئة ENV عالميًا عند النشر. عندما أفعل ذلك، أواجه نفس المشكلة، حيث يحاول Discourse البحث عن الأصول في s3_cdn_url، وهو ما يبدو لي خطأً في discourse/lib/content_security_policy/default.rb at main · discourse/discourse · GitHub

أعتقد أنني قمت بتعيين القيمة في قاعدة البيانات.

تخميني هو أن الحل هو العثور على مهمة Rake التي ستقوم بدفع الأصول إلى S3.

كنت أتساءل عما إذا كان بإمكان أي من أعضاء @team تأكيد ما إذا كان هذا السلوك متوقعًا، وهو أنه لا يمكن استخدام CDN من S3 (المُعرَّف عالميًا) للرفع دون أن يبحث Discourse عن الأصول هناك أيضًا. يبدو أن هذا السلوك غير متوقع إلا إذا كنت أسيء فهم شيء ما.

نعم، هذا هو السلوك.

إعداد CDN لـ S3 سيستخدمه لكل شيء سيكون ملفًا ثابتًا، سواء كان ذلك ملفات مُحمَّلة أو أصول JavaScript.

إليك بعض المعلومات حول هذا الأمر، لقد كنت أتعامل مع هذه المشكلة الشهر الماضي.

تمت الإصلاحية عن طريق تعيين كلا المتغيرين (DISCOURSE_S3_CDN_URL و DISCOURSE_CDN_URL) وإنشاء توزيعين لـ CloudFront، أحدهما للرفعيات بمصدره هو حوض S3، والآخر للأصول بمصدره هو الخادم.

إليك الكود الذي نستخدمه لهذا الغرض:

إليك ملف app.yml الخاص بنا (سمّيناه web.yml)، حيث نستبدل المتغيرات أثناء البناء infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

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

لديّ في قائمتي كتابة دليل #كيفية حول هذا الأمر. آمل أن أنجزه بحلول نهاية الأسبوع.

نعم، بمجرد أن تفهم أنك بحاجة إلى توزيعين لـ CloudFront، يصبح الأمر أكثر وضوحًا. أيضًا، لا تنسَ رفع الأصول إلى S3 بعد كل إعادة بناء. هناك مشكلة في الترقية من Docker Manager تتطلب تشغيل bundle exec rake s3:upload_assets يدويًا داخل حاوية Docker. أما إذا قمت بإعادة البناء بدلاً من ذلك، فيجب أن يعمل الأمر إذا أضفت هذه الأسطر إلى ملف app.yml الخاص بك:

hooks:
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - 'bundle exec rake s3:upload_assets'

هذه المهمة تشكو من عدم تكوين S3. لقد ضيقت النطاق إلى هذه الطريقة في global_setting.rb:

def self.use_s3?
    (@use_s3 ||=
      begin
        s3_bucket &&
        s3_region && (
          s3_use_iam_profile || (s3_access_key_id && s3_secret_access_key)
        ) ? :true : :false
      end) == :true
  end

أين يُتوقع تعريف GlobalSetting.s3_bucket؟ يبدو لي أننا بحاجة إلى تعيين متغيرات البيئة DISCOURSE_S3_UPLOAD_BUCKET و DISCOURSE_S3_BUCKET. ما الفرق بينهما؟