Cloudflare R2: التنقل في إعداداته ومعالجة أخطاء التكوين

هذا السطر غير مُعرّف بشكل صحيح. يجب أن يحتوي على مسافتين بالضبط مثل after_code

هل هذه مشكلة؟ لأن بعض الإعدادات تبدأ بدون مسافات. وعندما أقوم بالترجمة لا يعطيني أي خطأ. مثال:

كل هذا يبدو جيدًا. كيف يبدو الجزء after_assets_precompile الذي سألت عنه؟

تحتاج إلى إدراج مسافتين قبل "after_assets_precompile".

إعجابَين (2)

سأفعل ذلك وسأعلمك. شكراً جزيلاً على وقتك :heart:

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

عند تطبيق هذا، يظهر الخطأ التالي ولا يتم التحميل، يتعذر الوصول إلى الموقع:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:upload_assets failed with return #<Process::Status: pid 4803 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "cmd"=>["sudo -E -u discourse bundle exec rake s3:upload_assets", "sudo -E -u discourse bundle exec rake s3:expire_missing_assets"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

./discourse-doctor قمت بتشغيل هذا، ثم أعدت التجميع، وحصلت على نفس الخطأ.

عندما أدخل الحاوية وأقوم بتشغيل الأكواد التالية، أحصل على خطأ:

rake uploads:migrate_to_s3

خطأ:

rake uploads:migrate_to_s3 --trace
Plugin name is 'DiscourseMatheditor', but plugin directory is named 'discourse-matheditor'
Plugin name is 'discourse-post-voting', but plugin directory is named 'discourse-question-answer'
Plugin name is 'discourse-topic-voting', but plugin directory is named 'discourse-voting'
** Invoke uploads:migrate_to_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_to_s3
Please note that migrating to S3 is currently not reversible!
[CTRL+c] to cancel, [ENTER] to continue

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.2.0/gems/rails_multisite-6.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-6.0.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-6.0.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.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.2.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.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.2.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.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.2.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.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:451:in `exec'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:34:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:28:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP =&gt; uploads:migrate_to_s3

بعض المشاكل المماثلة التي لم يتم حلها:

هل لدى أي من المواضيع الأخرى التي ذكرتها تعليمات لإنهاء التحميلات يدويًا؟

هذه هي مجرد طبقة الفشل النهائية، الأخطاء الفعلية من ذلك ستكون أبعد في الأعلى كما يذكر:

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

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

أردت المحاولة مرة أخرى. لقد أضفت اتصالات S3 اللازمة إلى app.yml وأعدت تجميعها. هذه المرة، قمت بإزالة after_assets_precompile. تم تغيير جميع عناوين URL إلى cdn ولم يتم تحميل ملفات الأنماط. عندما أدخل الحاوية يدويًا وأحاول: rake s3:upload_assets، أحصل على الخطأ التالي.

Attempting to apply ASSETS S3 CORS ruleset in bucket cloudflarebucketname.
rake aborted!
Aws::S3::Errors::AccessDenied: Access Denied (Aws::S3::Errors::AccessDenied)

إذا حاولت هذا: rake uploads:migrate_to_s3 --trace

الخطأ الذي حصلت عليه:


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)

جميع رسائل الخطأ لـ “rake s3:upload_assets”:

Plugin name is 'DiscourseMatheditor', but plugin directory is named 'discourse-matheditor'
Plugin name is 'discourse-post-voting', but plugin directory is named 'discourse-question-answer'
Plugin name is 'discourse-topic-voting', but plugin directory is named 'discourse-voting'
** Invoke s3:upload_assets (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke s3:ensure_cors_rules (first_time)
** Invoke environment
** Execute s3:ensure_cors_rules
Installing CORS rules...
Attempting to apply ASSETS S3 CORS ruleset in bucket cloudflarebucketname.
rake aborted!
Aws::S3::Errors::AccessDenied: Access Denied (Aws::S3::Errors::AccessDenied)
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/client.rb:5424:in `get_bucket_cors'
/var/www/discourse/lib/s3_helper.rb:385:in `fetch_bucket_cors_rules'
/var/www/discourse/lib/s3_helper.rb:166:in `ensure_cors!'
/var/www/discourse/lib/tasks/s3.rake:184:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.2.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.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:243:in `block in invoke_prerequisites'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:241:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:241:in `invoke_prerequisites'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:218:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.2.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.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.2.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.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:451:in `exec'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:34:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:28:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => s3:upload_assets => s3:ensure_cors_rules

من الصعب الخروج من هذا الموقف.

شيء ما يخبرني أن رموز S3 تعمل بعد التجميع تدعم Amazon S3 فقط. ما رأيك؟

يعمل لدي. أعتقد أن هناك إعدادًا لتخطي قواعد cors. قد ترغب في الاطلاع على تكوين موفر تخزين كائنات متوافق مع S3 لعمليات التحميل لمعرفة ما هو.

this?: DISCOURSE_S3_INSTALL_CORS_RULE: false

لقد نجح هذا بشكل رائع، ولكن هناك مشكلة واحدة. لم يتم تحميل ملفات theme-javascripts إلى S3. بطبيعة الحال، يتم إتلاف تصميم الموقع. لا يتم تحميل سوى مجلد الأصول. ماذا يمكننا أن نفعل لتحميل ملفات التصميم الأخرى؟

هذه هي المرة الأخيرة التي سأخبرك فيها أنك تتضمن الجزء الذي يستدعي مهمة rake للتحميل إلى s3.
حظا سعيدا.

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

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


عندما أقوم بتشغيل هذا عن طريق الدخول إلى الحاوية: rake uploads:migrate_to_s3 أحصل على الخطأ التالي:

Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
1001 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 9 of 3769 uploads are not migrated to S3. S3 migration failed for db 'default'. (FileStore::ToS3MigrationError)

ملف app.yml الخاص بي هو كالتالي. لقد قمت بإيقاف هذا الإعداد لأنه لم يقم بتحميل ملفات JavaScript الخاصة بالثيم وملفات الأنماط: DISCOURSE_CDN_URL.

سأحاول فتحه مرة أخرى في منتصف الليل وتجميعه، لكنني لا أعرف ما الذي فاتني. بحثت لمعرفة ما الذي قد تعنيه بهذا، لكنني لم أجد شيئًا مختلفًا: “مهمة rake لتحميل إلى s3”

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: 'auto'
  DISCOURSE_S3_ENDPOINT: 'https://xxxxx.eu.r2.cloudflarestorage.com'
  DISCOURSE_S3_ACCESS_KEY_ID: 'xxxxx'
  DISCOURSE_S3_SECRET_ACCESS_KEY: 'xxxxx'
  DISCOURSE_S3_CDN_URL: 'https://cdn.xxxxx.com'
  #DISCOURSE_CDN_URL: 'https://cdn.xxxxx.com'
  DISCOURSE_S3_BUCKET: 'cloudflarer2xxxxx'
  #DISCOURSE_S3_BACKUP_BUCKET: 'cloudflarer2xxxxxbackups'
  #DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_S3_INSTALL_CORS_RULE: false

أعتذر عن إضاعة وقتك، ولكن سيكون من الجيد لو تضمنت وثائق المستخدم هذه المشكلات. الآن نعلم أن r2 يعمل. فقط أضف الإعدادين التاليين:


DISCOURSE_S3_REGION: 'auto'
DISCOURSE_S3_INSTALL_CORS_RULE: false

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

ملاحظة: خادم Postgresql منفصل، لا أستخدم الخادم الموجود على localhost. أعتقد أنه لا توجد مشكلة في ذلك.
شكراً لكل من أخذ من وقته.

هذا هو الأمر الذي يجب تشغيله لتحميل الأصول. تخميني هو أنك لا تزال لديك مشكلة ما تمنع تحميل الأصول.

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

حسنًا، إذا لم أكن أفعل شيئًا خاطئًا، فأنا بحاجة إلى العثور على المشكلة. عندما أدخل الحاوية وأقوم بتشغيل الكود “rake s3:upload_assets”، يبدو كل شيء على ما يرام. حتى لو قمت بتشغيل هذا الإعداد أو إيقافه، فإنه لا يقوم بتحميل ملفات الأنماط (theme-javascripts و stylesheets): “DISCOURSE_CDN_URL: ‘https://cdn.xxxxx.com’”.

rake s3:upload_assets --trace
Plugin name is 'DiscourseMatheditor', but plugin directory is named 'discourse-matheditor'
Plugin name is 'discourse-post-voting', but plugin directory is named 'discourse-question-answer'
Plugin name is 'discourse-topic-voting', but plugin directory is named 'discourse-voting'
** Invoke s3:upload_assets (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke s3:ensure_cors_rules (first_time)
** Invoke environment
** Execute s3:ensure_cors_rules
Installing CORS rules...
skipping
** Execute s3:upload_assets Skipping: assets/break_string-cc617154cd04790e.js
....
....
....

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

مرحباً بالجميع،

أردت مشاركة تجربتي والخطوات التي اتبعتها لتهيئة Cloudflare R2 بنجاح لكل من التحميلات والنسخ الاحتياطي في منتدى Discourse الخاص بي. آمل أن يساعد هذا الآخرين الذين يتطلعون إلى استخدام Cloudflare R2 مع Discourse.

نظرة عامة على الإعداد:

  • المنصة: Discourse (تثبيت Bitnami)
  • الدلو (Bucket): Cloudflare R2
  • نطاق مخصص: تم إعداده لتقديم الملفات بشكل عام
  • التهيئة: تم إجراؤها بالكامل من خلال إعدادات موقع Discourse (لم يتم المساس بمتغيرات البيئة)

دليل خطوة بخطوة:

  1. إنشاء دلو Cloudflare R2:
    • قم بتسجيل الدخول إلى حساب Cloudflare الخاص بك وانتقل إلى تخزين R2.
    • أنشئ دلوًا جديدًا لتحميلات Discourse الخاصة بك (على سبيل المثال، forum-uploads).
    • دوّن عنوان URL لواجهة برمجة تطبيقات S3 للدلو، ومعرف مفتاح الوصول، والمفتاح السري للوصول.
  2. إعداد نطاق مخصص لشبكة توصيل المحتوى (CDN):
    • لتقديم محتوى دلو R2 الخاص بك بشكل عام، أنشئ نطاقًا مخصصًا في Cloudflare.
    • على سبيل المثال، استخدمت forumfiles.example.in.
    • تأكد من تكوين إعدادات DNS للإشارة إلى CNAME المقدم من Cloudflare. نظرًا لأن لدي نطاقًا على Cloudflare، فقد قام بذلك تلقائيًا.
  3. تهيئة إعدادات موقع Discourse:
    • s3_bucket: اسم دلو R2 الخاص بك (على سبيل المثال، forum-uploads).
    • s3_region: اضبطه على شرق الولايات المتحدة (شمال فيرجينيا). لم يكن هناك خيار تلقائي.
    • s3_endpoint: استخدم عنوان URL لواجهة برمجة تطبيقات S3 للدلو المقدم من Cloudflare (على سبيل المثال، https://\u003cyour-bucket-unique-id\u003e.r2.cloudflarestorage.com).
    • s3_access_key_id: معرف مفتاح الوصول الخاص بـ R2.
    • s3_secret_access_key: المفتاح السري للوصول الخاص بـ R2.
    • s3_cdn_url: النطاق المخصص لشبكة توصيل المحتوى (CDN) (على سبيل المثال، https://forumfiles.example.in).
    • تأكد من تحديد مربعي تمكين النسخ الاحتياطي لـ S3 وتمكين التحميلات لـ S3.
  4. ضبط الأذونات و CORS:
    • اضبط دلو R2 الخاص بك على خاص وقم بتكوين سياسة CORS:
[
  {
      "AllowedHeaders": ["*"],
      "AllowedMethods": ["GET", "POST", "PUT", "HEAD"],
      "AllowedOrigins": ["*"],
      "ExposeHeaders": ["ETag"],
      "MaxAgeSeconds": 3000
  }
]
  • يضمن هذا أن التحميلات تعمل بشكل صحيح دون مشاكل CORS.
  1. اختبار الإعداد:
    • قم بتحميل ملف أو صورة اختبار عبر منتدى Discourse الخاص بك للتحقق من أن التحميلات تعمل بشكل صحيح.
    • تحقق مما إذا كانت الملفات متاحة عبر النطاق المخصص الخاص بك (على سبيل المثال، https://forumfiles.example.in/original/1X/...).
    • تحقق من النسخ الاحتياطي، تمكنت من تنفيذ النسخ الاحتياطي بنجاح. تم التحقق المتقاطع في دلو R2 وهو مدرج أيضًا في إعدادات الموقع.

الخلاصة:

باتباع هذه الخطوات، تمكنت من دمج Cloudflare R2 مع Discourse بسلاسة، والتعامل مع كل من التحميلات والنسخ الاحتياطي بكفاءة. إذا كانت لديك أي أسئلة أو واجهت مشكلات، فلا تتردد في طرحها!

6 إعجابات

هل اختبرت ما إذا كان يمكن لـ discourse تنزيل الملفات من Cloudflare R2؟ على سبيل المثال، لتضمين تحميلات S3 في نسخة احتياطية كاملة من المثيل.

لا يبدو أن الأمر يعمل لأن Cloudflare يفتقد شيئًا في واجهة برمجة تطبيقات R2 S3، كما أن migrate_to_s3 لا يعمل.

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