إعادة خبز المنشورات القديمة لن تسحب عنوان S3 CDN الجديد بعد إعادة تسمية S3 bucket

بعد تثبيت Discourse (2.7.0.beta1) واستيراد مشاركات Google Groups القديمة، أضفت إعدادات سلة المفاتيح S3 (ولكن بدون عنوان URL لشبكة CDN) وقمت بتشغيل الأمر

rake uploads:migrate_to_s3

والذي بدا وكأنه يعمل بشكل ممتاز. تم تحميل جميع الصور إلى S3 وحاول Discourse الوصول إليها عبر عنوان URL لـ S3 تم إنشاؤه تلقائيًا—شيء مثل

https://ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

ثم قمت بإعادة تسمية السلة (إلى ortus-discourse-uploads) وأعدت توزيع Cloudfront أمامها مع اسم CNAME تم إعداده بواسطة Cloudflare يُدعى

https://communitycdn.ortussolutions.com/

يعمل الاسم CNAME و Cloudfront و S3 بشكل ممتاز. عناوين URL مثل هذه تخدم بشكل صحيح أحد الصور الموجودة في السلة:

https://communitycdn.ortussolutions.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

ومع ذلك، تكمن المشكلة في أن Discourse عالق تمامًا في نطاق ortus-discourse.s3.dualstack.us-west-2.amazonaws.com القديم (الذي لا يعمل بسبب إعادة تسمية السلة)، وبغض النظر عن عدد المرات التي أعيدت فيها بناء الحاوية أو أعدت خبز المشاركات القديمة، لا أستطيع بأي حال من الأحوال جعل Discourse يستخدم عنوان URL الجديد لـ CDN. لقد بحثت في Google لمدة يوم وأعدت الخبز ربما اثني عشر مرة (داخل حاوية app) مع إعدادات مختلفة. كل خيط في المنتدى يعطي نفس النصيحة—إعادة البناء وإعادة الخبز، لكن هذا لا يعمل.

ليست الصور الموجودة في المشاركات فقط هي المعطلة، بل حتى <link rel="icon" type="image/png" href=""> وشعار الموقع عالقان في النطاق القديم ولن يستخدموا عنوان URL لـ S3 CDN.

إليك إعدادات S3 الحالية الخاصة بي.

  DISCOURSE_S3_ACCESS_KEY_ID: '********'
  DISCOURSE_S3_SECRET_ACCESS_KEY: '******'
  DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_ENABLE_S3_UPLOADS: true
  DISCOURSE_S3_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_UPLOAD_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_BACKUP_BUCKET: 'ortus-discourse-backups'
  DISCOURSE_S3_REGION: 'us-west-2'
  DISCOURSE_S3_CDN_URL: https://communitycdn.ortussolutions.com

  DISCOURSE_CDN_URL: https://community.ortussolutions.com

لقد جربت حتى إعادة تعيين عنوان URL القديم إلى عنوان URL الجديد في المشاركات على النحو التالي

rake posts:remap["ortus-discourse.s3.dualstack.us-west-2.amazonaws.com","communitycdn.ortussolutions.com"]

لكن الأمر قال 0 مشاركات متأثرة.

لا يوجد في أي من متغيرات البيئة أو إعدادات قاعدة البيانات الخاصة بي أي شيء يشير إلى اسم السلة القديم ortus-discourse، لذا لا أستطيع معرفة المكان الذي يحصل منه Discourse على ذلك. أنا جديد على Discourse ولست مطور Ruby، لذا لم أنظر أعمق مما يمكنني رؤيته في ملف app.yml، وواجهة مستخدم المسؤول، ومخرجات أوامر rake التي وجدت في المنتديات.

ما هي قيمة تلك التحميلات في جدول Uploads؟

./launcher enter app
rails c
Upload.all.sample(10).pluck(:url)

@Falco شكرًا لك على الرد. إليك ناتج الأمر.

root@discourse-app:/var/www/discourse# rails c
Upload.all.sample(10).pluck(:url)
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/52b3aff4e63a7e38bef42d469bafd1ed7c1cc1a2.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f90374a280a4681332bcd2191b8de43462f8776.png",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/29691fba566fc998a966aa93859753e3cf0b8528.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6ae912ced40d60adc1356c1d7acf144b0fa0985a.jpeg",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/4dfe5b48fc8cb5d79880d70355c34d7ed02be812.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/897c4b4e755c1c8e93224a27187dc631a02e4388.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/59886f322e6834b567d473138108fab6e0f33764.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/e3e3429d63155cf0d850e161846d187bc6f273ea.jpeg",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/1b701869b4b235daa8d6a9a7728766f3b4e69814.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/c83aaee941462d47ef91f0c6448257d07487b231.png"]
[2] pry(main)>

إذن، هناك بالفعل عدد كبير من الملفات في الدلو القديم.

يجب أن يكون إعادة التوجيه المطلوب هو:

./launcher enter app
rails c
DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")

يرجى عمل نسخة احتياطية قبل ذلك، حيث لا يمكن التراجع عن مثل هذه العملية.

@Falco شكرًا مرة أخرى. قمت بتشغيل عمليتي إعادة تعيين:

DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")
DbHelper.remap("ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")

أعدت بناء الصورة وتم حل مشاكل مثل شعار رأس الموقع. أنا أعيد معالجة جميع المنشورات حاليًا لأرى ما إذا كان ذلك سيصلح صور المنشورات، لكن هذا سيستغرق بعض الوقت.


بينما ننتظر إعادة المعالجة، ما الذي حدث خطأ هنا؟ هل هذه خلل في Discourse جعلت عمليات الرفع عالقة على الرابط القديم ولم تتحول لاستخدام الرابط الجديد؟

قرأت منشورات مثل هذا المنشور الذي تحدث عن تغيير عنوان CDN، لكنها ذكرت فقط استبدال النصوص في المنشورات (وهو ما لم ينجح) ولم تذكر عملية إعادة تعيين DBUtil على الإطلاق. How do I change the legacy CDN URLs of images in posts?

حتى أنني حاولت إعادة تشغيل سكريبت استيراد S3 Rake، لكنني تلقيت خطأ (آسف، لم أقم بتدوينه في ذلك الوقت).

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

أنا في حيرة من أمري بشأن ما كان ينبغي علي فعله بشكل مختلف أو أي منشور في المنتدى كان سيجيبني على هذا. (لقد حاولت حقًا حل المشكلة بنفسي قبل النشر هنا!)

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

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

ولكن عند عرض المنشور، تظهر مساحة فارغة كبيرة في المنشور تشير إلى:

https://community.ortussolutions.com/images/transparent.png

هذا تغيير حدث مؤخرًا إلى حد ما. فمعظم اليوم السابق، كانت هذه الصور تشير ببساطة إلى عنوان URL القديم غير الصحيح الخاص بـ S3، ولكن في وقت ما الليلة الماضية أو اليوم ظهر ملف PNG شفاف.

هااااااااا، هذا ليس ما طلبت منك فعله في ردي السابق :face_with_raised_eyebrow:

في جدول الـ uploads، نتوقع وجود موقع S3، ويتم استبداله برابط CDN فقط أثناء عملية معالجة (cook) لغة الترميز Markdown.

أنت وضعت رابط CDN في جدول الـ Uploads، وهذا ليس ما يفعله البرنامج عادةً.

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

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

لا تزال أسئلتي حول ما حدث خطأ في منشوري السابق قائمة.

أعتقد أن الأمر بسيط جدًا: نحن لا ندعم تغيير حزمة التخزين الكائني (Object Storage bucket).

المقصود بـ “الدعم” هنا أنك لا تستطيع تغييرها والتوقع أن تعمل بشكل صحيح، ولا يوجد دليل مكتوب ولا مهمة rake مُجهّزة مسبقًا لذلك. لذا، إذا احتجت في النهاية إلى تغيير الحزمة، فسيكون ذلك يتطلب بعض التلاعب بقاعدة البيانات.

حسنًا، هذا معقول. إذن، المشكلة الكبيرة التي ارتكبتها كانت عندما قمت بإعادة تسمية bucket S3 وفترضت أن تحديث اسم bucket في لوحة الإدارة سيُعالج كل ما أحتاجه. ربما يكون إضافة تحذير في واجهة المستخدم الخاصة بلوحة الإدارة عند تعديل اسم bucket فكرة مفيدة هنا. (بدأت بإعدادات لوحة الإدارة قبل أن أنتقل إلى استخدام متغيرات البيئة، ظنًا مني أن ذلك قد يساعد بطريقة ما) بالتأكيد لم يكن واضحًا أن تغيير اسم bucket بعد الرفع سيُشكّل مشكلة.

لقد قمت بإعادة ربط النطاقات إلى نطاق AWS S3 الصحيح.

DbHelper.remap("communitycdn.ortussolutions.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/fc05f9be9b783479819fec68b1d8e493110007a4.cfc",
 "/images/d-logo-sketch-small.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/50f0d6f260cdb4ef91e29023d92b46df096ab34e.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/65d80cddc6dc15b9a4d1b9e9d88cc9a8928c5316.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/a86aa2a12183428f3289caa95787ea16f22e2e4d.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f76b5238b147a60c8ad5f65bd7fa4bb6b58d852.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6a4c9b992e6cd8a15ddeaec0d158ebd473164525.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/93420848249ecea2261d405e46f7f450cc02a3af.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/d67c39e06ce624b9deb7625dd041d21cffd96df9.png"]

لقد قمت بإعادة بناء التطبيق مرة أخرى، والآن أعييد إعادة بناء المنشورات. سأرى ما إذا كانت المحاولة السابعة والثلاثين هي المحظوظة :slight_smile:

تمت جميع عمليات الرفع مع رابط حاوية S3 الصحيح، وتم إعادة بناء الحاوية، وإعادة معالجة جميع المنشورات الـ 30 ألفًا. لا يزال يظهر لدي:

/images/transparent.png

بدلًا من جميع صوري.

عند تحرير المنشورات، يظهر هذا أيضًا:

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

المثير للاهتمام هو أن المرفقات الأخرى مثل ملفات ZIP تعمل بشكل صحيح الآن.

هل هناك جزء مفقود ضروري لجعل الصور المضمنة في المنشورات القديمة تعمل؟

هل يمكنك طباعة سمات كائن التحميل المقابل لـ yTDVQSa4wbIeLGEZvE7muXe8sAJ؟

سأحبّ ذلك بشدة، لكنني سأحتاج إلى بعض المساعدة في هذا الأمر. أنا مطوّر، لكنني لست مطوّر روبي. لقد تمكّنت من معرفة كيفية طباعة جميع سمات ملف مرفق عشوائي على النحو التالي:

[17] pry(main)> Upload.all.sample(1)
=> [#<Upload:0x00005633230f8af0
  id: 353,
  user_id: 273,
  original_filename: "helloWorldF.zip",
  filesize: 50542,
  width: nil,
  height: nil,
  url: "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
  created_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  updated_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  sha1: "3a532dec6390d5087ed6154fc0335c2c0f1ea543",
  origin: nil,
  retain_hours: nil,
  extension: "zip",
  thumbnail_width: nil,
  thumbnail_height: nil,
  etag: nil,
  secure: false,
  access_control_post_id: nil,
  original_sha1: nil,
  animated: nil,
  verification_status: 1>]

وقد وجدت بعض المراجع الخاصة بـ Active Record في ريلز للبحث عن سجلات محددة، لكنني لم أجد أي بيانات فيها تشبه yTDVQSa4wbIeLGEZvE7muXe8sAJ حتى من بعيد. كيف يمكنني العثور على سجل الرفع المقابل؟

أوه، أخبار جيدة. أثناء بحثي عن كيفية العثور على سجلات الرفع، صادفت هذا المنشور الذي أريني كيفية تحويل سلسلة base62 إلى تجزئة sha1.

ذكر المنشور أن الصور التي تظهر فقط ملف transparent.png قد تم وضعها في القبر (tombstoned). لست متأكدًا تمامًا مما يعنيه ذلك، لكنني أفترض أن عملية ما عملت طوال الليل بينما كانت الصور معطلة وعلّمتها بأنها غير مستخدمة. تمكنت من تشغيل الأمر:

rake uploads:recover_from_tombstone

ويبدو أن جميع الصور المضمنة قد عادت الآن وتوجه إلى شبكة توصيل المحتوى (CDN) الخاصة بي على S3!

ولأجل الفائدة، إليك كيف وجدت سجل الرفع الذي يبدأ بالسلسلة yTDVQSa4wbIeLGEZvE7muXe8sAJ.

[14] pry(main)> Base62.decode("yTDVQSa4wbIeLGEZvE7muXe8sAJ").to_s(16)
=> "f49428d6af35d7e0414408ccb65e7316f5003215"
[15] pry(main)> Upload.where( "original_filename ilike '%f49428d6af35d7e0414408ccb65e7316f5003215%'" )
=> [#<Upload:0x000056313aa91fe8
  id: 899,
  user_id: 549,
  original_filename: "f49428d6af35d7e0414408ccb65e7316f5003215.png",
  filesize: 25514,
  width: 1169,
  height: 984,
  url: "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/f49428d6af35d7e0414408ccb65e7316f5003215.png",
  created_at: Tue, 12 Jan 2021 23:01:35 UTC +00:00,
  updated_at: Tue, 12 Jan 2021 23:01:36 UTC +00:00,
  sha1: "f49428d6af35d7e0414408ccb65e7316f5003215",
  origin: nil,
  retain_hours: nil,
  extension: "png",
  thumbnail_width: 594,
  thumbnail_height: 500,
  etag: "6977f35ddbf39a4399dc76f92a5079d4",
  secure: false,
  access_control_post_id: nil,
  original_sha1: nil,
  animated: nil,
  verification_status: 1>]

شكرًا مرة أخرى على مساعدتك يا @Falco. أنا جديد في Discourse، لكنك أثبتت أنك صبور ومفيد للغاية :+1: