ما زلتُ أواجه صعوبة في نقل التحميلات إلى Spaces. عندما يتم تعريف s3_cdn_url، يشير discourse إلى s3_cdn للحصول على الأصول، لكنها غير موجودة هناك. جربت تشغيل rake s3:upload_assets وحصلت على:
root@shadrack-rbx:/var/www/discourse# rake s3:upload_assets \ninstalling CORS rule\nUploading: assets/vendor-3037640def3beef9cc83cef108868f2bac887cf141d032c6b7388c7879c19601.js\nOPTS: {:cache_control=\u003e\"max-age=31556952, public, immutable\", :content_type=\u003e\"application/ecmascript\", :acl=\u003e\"public-read\", :tagging=\u003e\"\"} # NOTE: Pfaffman added this debug line. . . \nrake aborted!\nAws::S3::Errors::InvalidArgument: \n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/plugins/sse_cpk.rb:22:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/plugins/dualstack.rb:26:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/plugins/accelerate.rb:35:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:20:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/idempotency_token.rb:17:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/param_converter.rb:24:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/response_paging.rb:10:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/seahorse/client/plugins/response_target.rb:23:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/seahorse/client/request.rb:70:in `send_request'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/client.rb:5856:in `put_object'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/object.rb:928:in `put'\n/var/www/discourse/lib/s3_helper.rb:44:in `upload'\n/var/www/discourse/lib/tasks/s3.rake:38:in `block in upload'\n/var/www/discourse/lib/tasks/s3.rake:37:in `open'\n/var/www/discourse/lib/tasks/s3.rake:37:in `upload'\n/var/www/discourse/lib/tasks/s3.rake:148:in `block (2 levels) in \u003ctop (required)\u003e'\n/var/www/discourse/lib/tasks/s3.rake:147:in `each'\n/var/www/discourse/lib/tasks/s3.rake:147:in `block in \u003ctop (required)\u003e'\n/usr/local/bin/bundle:23:in `load'\n/usr/local/bin/bundle:23:in `\u003cmain\u003e'\nTasks: TOP =\u003e s3:upload_assets\n(See full trace by running task with --trace)\nroot@shadrack-rbx:/var/www/discourse# vi config/discourse.\ndiscourse.conf discourse.config.sample discourse.pill.sample \nroot@shadrack-rbx:/var/www/discourse# vi config/discourse.conf\nroot@shadrack-rbx:/var/www/discourse# rails c\n```
بالمناسبة، يمكن لهذا الإعداد رفع الصور إلى S3 بنجاح تام.
وإذا كان هذا سيعمل، فهل سيتم دفع الأصول إلى S3 أثناء عملية التمهيد (bootstrap)؟ أنا أرغب حقًا في نقل هذا الموقع إلى S3 (73 جيجابايت من الصور) للانتقال إلى تكوين خادم مختلف. إن Spaces جذاب لأن لدي أرصدة إحالة وخدمة CDN مجانية. لكن ربما يجب أن أتخلى عن الفكرة وأنتقل مباشرة إلى AWS S3؟
That’s what I thought, but what’s happening is that all the assets are linked to the S3 CDN url and they aren’t there. I’d assumed that they’d either be served by the CDN like normal (I have one site configured with regular CDN and it points to S3 cdn when that’s configured) or from local storage (I have another site configured with no regular CDN and when I have s3_cdn_url in global settings, all the assets are linked to the s3 CDN.
So, I either need to push assets to S3 or have Discourse not point to assets in S3. I don’t really care, but they need to be somewhere that they can be found, as without assets the whole site is hosed and I have to make changes in console.
No, I really mean assets (uploads seem fine). It seems that when GlobalSettings.s3_cdn_url is defined, discourse expects assets (i.e., the javascript stuff) to be in the S3 CDN, so the site is broken because none of the assets are available.
It makes zero sense to me either.
I just set SiteSettings.s3_cdn_url (not in GlobalSettings) and assets seem to still be coming from the server, not the CDN. So maybe it’s a bug with GlobalSettings.s3_cdn_url?
Yup. Re-setting the value in discourse.conf does this:
That means that if you want to use the GlobalSettings for S3 in the current state you will need to deal with the missing feature in the S3-like service in Digital Ocean, patching around it somehow.
You already have a workaround (use a normal site setting), and we know that we need a setting to disable the CORS rule (pr-welcome for that).
لا أدري ما إذا كنتَ (أو أي شخص آخر) لا تزال تواجه مشاكل مع هذا، أو ما إذا كان ما يلي سيحلها، ولكن بما أنني صادفت هذا الأمر أثناء استكشاف مشكلتي الخاصة، فقد ظننتُ أنني سأشاركها:
إذا كنت تستخدم Digital Ocean Spaces لتخزين S3، و
لديك قوالب تحتوي على خطوط تم تحميلها، مثل WOFF، يتم نسخها إلى تخزين S3، و
تحصل على أخطاء CORS عند تحميل الخطوط على موقع Discourse الخاص بك، إذن –
تتوفر الآن إعدادات تكوين CORS في Digital Ocean Spaces على نقطة النهاية (Endpoint) التي تستخدمها لتخزين S3. قم بتعيين عنوان موقع Discourse الخاص بك كـ Origin، و GET كطرق مسموح بها، وقيمة معقولة مثل 86400 للوقت.
قضيت يومًا كاملًا في اختبار توافق Discourse مع عروض DigitalOcean، وكان موضوع CORS هنا مجرد تشتيت للانتباه.
المشكلة هي أن مساحات DigitalOcean لا تدعم رأس tagging في نسخة S3 الخاصة بها.
إصلاح مهمة upload_assets بسيط جدًا وهو موجود في فرع.
المشكلة هي أننا نستخدم tagging فعليًا في مهمة rake أخرى، لذا إذا كنت تستخدم مساحات DigitalOcean، فلن تتمكن أبدًا من استخدام مهمة s3:expire_missing_assets. وقد يكون هذا مقايضة “مقبولة” لبعض المستخدمين.
أخطط لتحديث وإنشاء بعض الأدلة الجديدة حول هذا الموضوع الأسبوع المقبل.
أنا أكتب تقريرًا عن تجربة كبيرة باستخدام خدمات DigitalOcean مع Discourse (مثل خدمة Redis، وخدمة PostgreSQL، وخدمة Object Store، وخدمة CDN)، حتى نتمكن من تقديم ذلك في وثيقة موجزة. لقد اكتشفت بالفعل مشكلة أسوأ بكثير. فـ CDN الخاص بنسخ S3 يزيل رأس Content-Encoding من الملفات، مما يمنع تقديم ملفات JavaScript المضغوطة بـ GZip وBrotli، وهذا يكسر كل شيء.
النتيجة الأفضل على المدى الطويل للجميع هي أن تكون كل عمليات استنساخ AWS S3 دقيقة فعليًا؟ لذا، إذا أمكننا المتابعة وإلحاح الموردين لجعل استنساخاتهم أفضل، فهذا هو المسار المتفوق.