إعداد تحميل الملفات والصور إلى S3

هل المنشور الأول في الأعلى
https://meta.discourse.org/t/set-up-file-and-image-uploads-to-s3
لا يزال دليلًا صالحًا يسمح للمسؤولين بالقيام بذلك؟ إذا لم يكن كذلك، فهل هناك أي مكان آخر يوجد به دليل S3 الصحيح لعام 2024؟ يُقال إن هذا دليل رسمي ومدعوم من فريق Discource.

لقد قمنا بتطبيقه كما في الأعلى والصور معطلة في مثيل Discourse على الرغم من تحميلها إلى S3.

تدفقنا

  1. إعداد دلو S3 نفسه والسياسة في S3 كما في الأعلى (تم اتباع جميع الخطوات بدقة)

  2. إعداد البيئة في app.yml وفي المسؤول (متطابق) كما في الأعلى

  3. إعادة بناء التطبيق باستخدام launcher

  4. لا يتم استخدام أي شبكة توصيل محتوى (CDN) على الإطلاق لأن فهمنا هو أنها اختيارية ويجب أن تعمل بدون CDN.

النتيجة:

  1. يتم تحميل الصور إلى الدلو بواسطة Discourse
  2. يتم استبدال الروابط في المنشورات بشكل صحيح بواسطة Discourse بروابط Amazon مثل
    xxx-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/a1b21eb5de071799d4b5e5215619d11d28602dfe.jpeg
  3. الروابط غير متاحة (بافتراض أنها بسبب سياسة S3 في الدليل الرسمي)

تغيير مفترض لسياسة S3 الرسمية في الدليل. Principal: هذه السياسة لا تحدد Principal، مما يعني أنها تنطبق على كل من تم المصادقة عليه بالأذونات الصحيحة. للسماح بالوصول المجهول (العام)، نحتاج إلى تحديد \"Principal\": \"*\". قد لا يكون هذا حلاً جيدًا لأنه يجعل الدلو عامًا.
هذا افتراض لأننا نقدر إذا قام شخص ما بتحديث الدليل لجعله صحيحًا في عام 2024

مرحبًا،
نحن نستخدم Cloudflare R2 لتخزين S3 (وهو يعمل الآن)، وأردت نقل Discourse إلى خادم آخر.
ومع ذلك، كانت صور الملفات الشخصية مفقودة عند الاستعادة من نسخة احتياطية حتى عند تحديد خيار “نسخ الاحتياطي للمرفقات”.

لذلك قمت بتشغيل أمر نقل S3 على الخادم القديم لنقل الصور التي لا تزال محلية، لكنه فشل مع هذا التتبع، ولا يتضح السبب.

rake uploads:migrate_to_s3 --trace
** Invoke uploads:migrate_to_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_to_s3
يرجى ملاحظة أن الانتقال إلى S3 غير قابل للعكس حاليًا! 
[CTRL+c] للإلغاء، [ENTER] للمتابعة

جاري نقل المرفقات إلى S3 لـ 'default'...
جاري رفع الملفات إلى S3...
 - سرد الملفات المحلية
..... => 5123 ملف
 - سرد ملفات S3
....... => 6871 ملف
 - مزامنة الملفات مع S3
.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^[[B............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
جاري تحديث الروابط في قاعدة البيانات...
جاري إزالة الصور المحسنة القديمة...
جاري تحديد جميع المنشورات التي تحتوي على صناديق عرض لإعادة البناء...
تم تحديد 828 منشورًا لإعادة البناء
rake aborted!
FileStore::ToS3MigrationError: لم يتم نقل 4898 من أصل 5838 مرفقًا إلى S3. فشل انتقال S3 لقاعدة البيانات 'default'. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:73:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383: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-6.1.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-6.1.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-6.1.0/lib/rails_multisite/connection_management.rb:21: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>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:455:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'

يبدو أن هذه الصور لا تزال مخزنة محليًا لسبب ما، على الرغم من أنني قمت بتشغيل سكريبت النقل هذا من قبل.

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

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

يمكنك النظر في

Upload.pluck(:url)

لمعرفة الخطأ، ربما

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

لقد واجهت هذه المشكلة مؤخرًا وتمكنت من حلها. لقد فعلت ذلك عن طريق تحديث أذونات IAM بهذا الدور

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
               "s3:List*",
               "s3:Get*",
               "s3:AbortMultipartUpload",
               "s3:DeleteObject",
               "s3:PutObject",
               "s3:PutObjectAcl",
               "s3:PutObjectVersionAcl",
               "s3:PutLifecycleConfiguration",
               "s3:CreateBucket",
               "s3:PutBucketCORS"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ]
    },
    {
       "Effect": "Allow",
       "Action": [
           "s3:ListAllMyBuckets",
           "s3:ListBucket"
       ],
       "Resource": "*"
    }
  ]
}

كان علي أيضًا تمكين ملكية كائن ACL

هذه هي تكويناتي الكاملة عندما أبحث عن S3

4 إعجابات

إعداد CORS على الحاوية مع الإعدادات المذكورة أعلاه لتحميلات الأجزاء المتعددة.

[
    {
        "AllowedHeaders": [
            "content-type",
            "x-amz-acl",
            "x-amz-meta-sha1-checksum"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD",
            "PUT"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

هل من الممكن تغيير مزودي خدمة S3؟

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

هل من الممكن حفظ الصور محليًا ثم تفعيل S3 مرة أخرى مع مزود الخدمة الجديد؟

يمكنك تعيين siteSettings.include_s3_uploads_in_backups=true في rails ثم إنشاء نسخة احتياطية، وتغيير إعدادات S3، واستعادة النسخة الاحتياطية.

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

تمام، فهمت. شكراً جزيلاً!

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

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

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

نعم. سأقوم باستعادته إلى خادم جديد، بحيث إذا حدث خطأ ما، يظل لديك خادم يعمل.

من هذا الموضوع، يبدو أن هذا الإعداد يقوم بتنزيل الملفات الفردية من S3، ولكني أتساءل عما إذا كانت هناك مشكلات محتملة مع المشاركات التي تشير إلى عناوين URL الخاصة بـ S3 بدلاً من الملفات المحلية. لست متأكدًا من كيفية التعامل مع ذلك في قاعدة البيانات. سأكون مهتمًا بمعرفة ما إذا كانت عملية انتقالك إلى مزود آخر ناجحة، @Rhod.

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

لقد أجريت الانتقال بسلاسة. أؤكد أنني لم أواجه أي مشاكل كبيرة لأن عدد الصور أو النسخ الاحتياطي كان ضئيلاً. كان المنتدى مخصصًا بالكامل لأغراض الاختبار، ولم يكن في “مرحلة الإنتاج” بعد. أخيرًا، بعد عدة محاولات وخطأ، أعدت تثبيت المنتدى على خادم جديد (Hetzner) وقمت بتكوين S3 (Cloudflare R2) للنسخ الاحتياطي والصور مع الخادم الذي أقنعني في النهاية.

أعتذر عن عدم قدرتي على تقديم الكثير من المساعدة. سأرى ما إذا كان بإمكاني اختباره على خادم آخر في المستقبل.

مع CF R2، هل تعمل صورك المصغرة للدردشة بشكل جيد؟

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

لم ألاحظ هذا الخطأ؛ في الحقيقة، لدي الدردشة معطلة على موقعي.

لا أعتقد أنني سأستخدمها، لكن لا يزال لدي نفس الخطأ الذي ذكرته في منشورك.

ومع ذلك، سأراقب منشورك لمعرفة ما إذا كانوا سيساعدونك في إيجاد حل.

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

شكراً والتر! لقد أتيت إلى هنا لنشر نفس الشيء فقط لأرى أنك قمت بذلك بالفعل.

@Discourse هل هناك أي فرصة لدمج محتويات منشور والتر في المنشور الأولي؟

هل يمكنني تحميل مقاطع الفيديو إلى S3؟ حاليًا، عند تحميل مقطع فيديو، يتم تحميل صورة الغلاف فقط إلى S3، ولا يمكن تحميل الفيديو نفسه.