مشاكل مع AWS CDN و S3

,

@Falco هل هذا لا يزال هو الحال؟ أعتقد أنني قرأت شيئًا عن مشكلات حديثة في استخدام AWS ولكني لا أستطيع العثور على الموضوع مرة أخرى.

أواجه العديد من المشكلات في استخدام AWS S3 باتباع المواضيع ذات الصلة كأدلة.

النسخ الاحتياطي يعمل كما هو متوقع ولكن استخدام Cloudfront كشبكة توصيل محتوى (CDN) أو إلغاء التعليق على DISCOURSE_USE_S3 و/أو DISCOURSE_S3_BUCKET يتسبب في ظهور مؤشر تحميل دائم.

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

discourse-cdn.repealobbba.org CNAME —> amazonassigned.cloudfront.net

DISCOURSE_CDN_URL: https://discourse-cdn.repealobbba.org

## S3 storage config
#  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: us-east-1
  DISCOURSE_S3_ACCESS_KEY_ID: ACCESS_KEY_ID
  DISCOURSE_S3_SECRET_ACCESS_KEY: SECRET_ACCESS_KEY
  DISCOURSE_S3_CDN_URL: amazonassigned.cloudfront.net  or
#  DISCOURSE_S3_BUCKET: repeal-obbba-discuss-uploads
  DISCOURSE_S3_BACKUP_BUCKET: repeal-obbba-discuss-backups
  DISCOURSE_BACKUP_LOCATION: s3

بالإضافة إلى ذلك، فإن إضافة هذا إلى التكوين

    after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

يعطي خطأ فشل في التهيئة (FAILED TO BOOTSTRAP)

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:upload_assets فشل مع الإرجاع #<Process::Status: pid 8484 exit 1>
مكان الفشل: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
فشل التنفيذ مع المعلمات {"cd"=>"$home", "cmd"=>["sudo -E -u discourse bundle exec rake s3:upload_assets", "sudo -E -u discourse bundle exec rake s3:expire_missing_assets"]}
فشل التهيئة برمز خروج 1
** FAILED TO BOOTSTRAP ** يرجى التمرير لأعلى والبحث عن رسائل خطأ سابقة، قد يكون هناك أكثر من واحد.

كالعادة… أي أفكار أو اقتراحات ستكون موضع تقدير.

تحتاج إلى إضافة المقطع الذي يقوم بتحميل الأصول إلى S3.

أوه. أنا مخطئ، أنت تقوم بذلك.

هذا يشير إلى وجود خطأ ما في إعدادات الحاوية (bucket).

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

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

أتفق
على الرغم من عدم استخدام سياسة حاوية (bucket policy) على حاوية النسخ الاحتياطي، إلا أن إضافة سياسة إلى حاوية التحميلات أدت إلى إزالة فشل التمهيد (bootstrap failure).
يمكن العثور على ملف json الخاص بالسياسة في CloudFront > التوزيعات (Distributions) > التوزيع الخاص بك (your distribution) > تحرير المصدر (Edit origin)
Screenshot 2025-12-10 141220

لسوء الحظ، يستمر رمز التحميل الدائم (perpetual throbber).

تعديل ملكية الكائن (Object Ownership) و قوائم التحكم في الوصول (ACLs) لا يغير النتيجة.
Screenshot 2025-12-10 141936

الإعدادات الحالية. أعتقد أنها الإعدادات الموصى بها أو ربما أنا مرتبك.
Screenshot 2025-12-10 141702
Screenshot 2025-12-10 141835

بعد تغيير الإعدادات، تحتاج إلى تشغيل مهمة rant لتحميل الأصول.

أيضًا، يمكنك فتح وحدة تحكم المطور (developer console) والتحقق مما إذا كانت الملفات التي يحاول الوصول إليها موجودة في الحاوية (bucket) أو ما إذا كانت هناك مشكلة في شبكة توصيل المحتوى (cdn).

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

شكرًا لمتابعتك…

نعم، يتم تشغيل مهام rake، ولا يحدث أي فرق.

./launcher enter app
rake posts:rebake
rake uploads:migrate_to_s3
rake posts:rebake_uncooked_posts

لا يزال رمز التحميل (Throbber) مستمرًا.

rake uploads:migrate_to_s3 ينتج خطأ

Migrating uploads to S3 for 'default'...
Some uploads were not migrated to the new scheme. Running the migration, this may take a while...
rake aborted!
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

يُظهر مدقق CDN واحد على الأقل أن discourse-cdn.repealobbba.org → Amazon CloudFront

وما زالت وحدة التحكم تُظهر أن الملفات والصور الخاصة بـ js يتم استدعاؤها من شبكة توصيل المحتوى (CDN)
Screenshot 2025-12-10 192413

يتم استدعاء الأصول من شبكة توصيل المحتوى (cdn)، ولكن هل هي موجودة هناك؟ إذا لم تكن كذلك، فهل هي في الحاوية (bucket)؟ وهل يمكن الوصول إليها من الحاوية؟

من المحتمل أن تكون لديك بعض عمليات الرفع في حاوية مختلفة أو شيء يمنعها من أن تكون في المكان المتوقع. إذا كان الأمر كذلك، فستحتاج إلى إصلاحها يدويًا كما هو مذكور. ستحتاج إلى الوصول إلى وحدة التحكم (console) ورؤية مكانها في سجل الرفع.

هل تبدو مهمة رفع الأصول (upload assets task) وكأنها تعمل؟ يستمر رمز التحميل (throbber) في العمل لأن الأصول الأخرى لا يتم تحميلها.

إعجابَين (2)

نعم إنها موجودة، الملفات موجودة في الحاوية (bucket) تحت اسم assets\nيمكن الوصول إليها: https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/logo-815195ae.png\n\nهناك حاويتان فقط، uploads و backups. النسخ الاحتياطية تعمل بشكل جيد.\n\nأعطت rake s3:upload_assets الخطأ التالي: \nrake aborted!\nAws::S3::Errors::AccessControlListNotSupported: The bucket does not allow ACLs (Aws::S3::Errors::AccessControlListNotSupported)\n\nقمت بالتبديل إلى تمكين قوائم التحكم في الوصول (ACLs) وشغلت مرة أخرى s3:upload_assets تعديل: uploads:migrate_to_s3 ولكن…\nFileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)\n\n??? You need to fix this manually. (FileStore::ToS3MigrationError)

يبدو أنك أصلحت الحاوية (bucket) وهي الآن قادرة على تحميل الأصول (assets)، لذا يجب أن يعمل الموقع الآن. التعامل مع عمليات التحميل التي لن تتم ترحيلها هي مشكلة أخرى (معقدة).

إليك أحد الأصول التي تحاول تقديمها:

https://discourse-cdn.repealobbba.org/assets/start-discourse-6f03a463.br.js

الشهادة (cert) معطوبة، لذا هذه هي مشكلتك. هناك شهادة، لكنها لا تتطابق مع عنوان URL.

كما اقترحت سابقًا، انظر إلى علامة تبويب الشبكة (network tab) في أدوات المطور (dev tools) في متصفحك وشاهد هذا:

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

تعديل من الأعلى
تم التبديل إلى تمكين قوائم التحكم في الوصول (ACLs) وتشغيل s3:upload_assets تعديل: uploads:migrate_to_s3 مرة أخرى

يكتمل s3:upload_assets الآن دون مشاكل

أرى أخطاء الشبكة. هل الشهادة مشكلة من AWS؟

شكراً جزيلاً لك مرة أخرى على وقتك في هذا الأمر!!

نعم. الشهادة لا تتطابق مع اسم المضيف. إنها تتطابق مع *.cloudfront.net

هذا يعمل: https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/logo-815195ae.png

هذا لا يعمل: https://discourse-cdn.repealobbba.org/assets/start-discourse-6f03a463.br.js

هذا يعمل: https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/start-discourse-6f03a463.br.js

لذا تحتاج إلى تغيير شبكة توصيل المحتوى (CDN) الخاصة بـ s3 إلى https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com – أوه، أعتقد أن هذا هو عنوان الحاوية (bucket)، لذا لن يكون مثاليًا، ولكنه سيعمل.

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

لست متحمسًا جدًا لـ “لذا لن يكون مثاليًا” :wink:

أبحث في أسماء النطاقات البديلة لـ AWS كحل محتمل.

ربما أنا فقط، ولكن إضافة شبكة توصيل محتوى (CDN) يستخدمها @Discourse داخليًا لا ينبغي أن تكون صعبة للغاية وتتطلب الدعم اللطيف من أشخاص مثل @pfaffman

ربما يمكن لـ @Falco أو @sam و @team (لا يمكن ذكر الفريق) التدخل؟؟

نعم، جميع المواقع التي نستضيفها تستخدم مزيج S3 و CloudFront. حتى هذا الموقع الذي تتصفحه الآن.

إعجابَين (2)

شكرًا للتأكيد! بعد رؤية هذا، قمت بإعادة ضبط DISCOURSE_S3_CDN_URL: إلى amazonassigned.cloudfront.net على أمل أن يحل مشكلات الشهادة وعنوان URL.
Screenshot 2025-12-11 133250

أعدت البناء وأعدت تشغيل جميع أوامر rake المذكورة في الوثائق.
rake posts:rebake
rake uploads:migrate_to_s3 لا يزال يولد FileStore::ToS3MigrationError
rake posts:rebake_uncooked_posts

rake s3:upload_assets
rake s3:expire_missing_assets

لا يزال الموقع لا يعمل.

أي اقتراحات؟

اتضح أن هذا كان مفيدًا.
Screenshot 2025-12-12 001849

@chapoi يرجى تقسيم هذا الموضوع لدعم
ربما نقل @JammyDodger إلى التثبيت ربما لرؤية أفضل على الرغم من أن المنتدى كان يعمل بشكل جيد لعدة أشهر.

على أي حال، شكراً على الاهتمام!

التثبيت ليس فقط لإعداد المنتدى

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

مفهوم، شكرًا على التوضيح.

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

كما ذكر أعلاه، أضف نطاقًا بديلاً للمساعدة.
الموقع يعمل ولكن بدون أوراق الأنماط و…

بالنظر في الحاوية (bucket) لا أرى مجلد stylesheets/

Screenshot 2025-12-12 120937

يبدو أن s3:upload_assets غير مكتمل.

وهل هناك مشكلة CORS؟
Screenshot 2025-12-12 121734

أحرزت تقدماً بعد أن استوعبت بعض الأمور في الوثائق كانت إما مضللة أو مربكة أو أكثر من اللازم لشخص لديه اضطراب نقص الانتباه وفرط النشاط (BBS). :distorted_face:

بالنسبة لنا نحن المصابين باضطراب نقص الانتباه وفرط النشاط، فإن وضع هذا باللون الأحمر الوامض سيساعد في إيصال " ستحتاج إلى توزيعي Cloudfront".

وبعض التعليمات حول كيفية

بعض التحديثات وتوحيد المواضيع المتعلقة بـ S3 سيكون أمراً رائعاً جداً. أعتقد أن موضوعاً رئيسياً واحداً يحتوي على بيانات حالية لـ AWS S3 CDN والنسخ الاحتياطي سيكون مذهلاً.

ننتقل إلى…

لدي الآن توزيعا Cloudfront ولكن:

تنفذ جميع أوامر rake دون أخطاء و
وهذا لم يعد يسبب فشلاً في التمهيد (bootstrap failure).

after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

مدقق CDN يبدو أشبه بالنتيجة المرجوة
Screenshot 2025-12-14 004220

بشكل عام، هناك تقدم ولكن بعض النصائح من فريق البنية التحتية لـ Discourse ستكون مفيدة جداً.

يا للراحة! لقد استغرق الأمر الكثير من الوقت وبعض الساعات (8 عبر مكالمتين) على الهاتف مع مهندس أمازون متعاون للغاية، ولكن أعتقد أنني فهمت الأمر. الأمور تسير على ما يرام في موقع RepealOBBBA وعمليتي قابلة للتكرار على مواقع أخرى.

قد أكتب ملخصًا ولكن إليك بعض الملاحظات في الوقت الحالي:

  1. يتطلب DISCOURSE_CDN_URL (إذا كنت تستخدم AWS S3) و DISCOURSE_S3_CDN_URL توزيعات Cloudfront خاصة بهما.
  2. لا يستخدم DISCOURSE_CDN_URL حاوية (bucket).
  3. يمكن أن يكون DISCOURSE_CDN_URL شبكة توصيل محتوى (CDN) غير تابعة لـ AWS. يعمل Bunny.net بشكل رائع. (قيل لي إن تخزين Bunny مع دعم S3 سيصدر في الربع الأول من عام 2026)
  4. يمكن أن تكون شبكات CDN الخاصة بـ DISCOURSE_CDN_URL و DISCOURSE_S3_CDN_URL عناوين URL ذات علامات تجارية مع إعداد DNS المناسب.
  5. يتطلب DISCOURSE_S3_CDN_URL حاوية تحميلات (uploads bucket).
  6. تتطلب حاوية التحميلات تمكين قوائم التحكم في الوصول (ACLs) وتعيين “الجميع (وصول عام)” على “قراءة” ويجب عليك تعيين سياسة للحاوية.
  7. لا تتطلب حاوية النسخ الاحتياطي (backups bucket) قوائم تحكم في الوصول أو سياسة.

تعديل (تعديلات)

  1. حدد المربع في S3 “استخدام عنوان URL لشبكة CDN لجميع التحميلات”: استخدم عنوان URL لشبكة CDN لجميع الملفات التي تم تحميلها إلى S3 بدلاً من الصور فقط. عدم التمكين تسبب دائمًا في حدوث أخطاء بالنسبة لي.

أتخيل أن الكثيرين سيقرؤون ما سبق ويقولون: يا إلهي يا فيل، لا شك في ذلك، هذا واضح ولكن… رأسي الخاص بالمنتدى لم يفهم ذلك على الفور.

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