أحتاج إلى مساعدة مع حاوية مزدوجة. مشكلة في LetsEncrypt منذ عدة أيام

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

سأحاول شرح ما حدث من وجهة نظري.

عندما كنت أنتقل من حاوية واحدة إلى حاويتين، كانت الملفات في samples/ تستخدم web-only وقمت بتجاهلها عن الخطأ بدلاً من استخدام web_only.

ثم، بسبب ذلك (أعتقد)، لم يتم تحميل صوري، لأن شيئًا ما كان يُفترض أن يشير إلى web_only، لكنه كان مضبوطًا على web-only. أجريت بعض التغييرات وتم إصلاح الصور. المشكلة الآن هي شهادات LetsEncrypt.

طلبت من البوت مساعدتي في إصلاحها، فأخبرني أن أنتظر حتى اليوم التالي لأن المشكلة كانت بسبب حد معدل الشهادات (rate-limit). كان من المفترض أن يتم إصلاح المشكلة. لم يتم إصلاحها. ثم سألته مرة أخرى، ثم سألت Claude، ثم سألت Claude مرة أخرى… وقد كنا في هذا الوضع “انتظر حتى الغد الساعة X وسيتم إصلاحها بالتأكيد” منذ أسبوع. لا يتم إصلاحها أبدًا، وكلاهما يقولان “آسف، لم يكن يجب أن أفترض أنها ستُصلح، لنجرب هذا بدلاً من ذلك، لأن الآن ستُصلح حقًا”. لا يحدث ذلك أبدًا.

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

أخبرني Claude أن أضيف شيئًا إلى الخطافات (hooks) في web_only.yml، لكن بما أن شيئًا من هذا القبيل لم يُذكر في التعليمات المقدمة هنا على المنتدى، كنت أتوقع حلًا آخر، مثل… حل المشكلة الفعلية.

هل يمكن لأحد مساعدتي في معرفة ما هي المشكلة وأين تكسر الأمور؟ سأقدّر ذلك حقًا، لأنه مرهق في هذه المرحلة. ليس العمل نفسه، بل عدم فهم ما يحدث ولماذا لا يبدو أن “الانتظار حتى الغد” يُصلح أي شيء أبدًا.

شكرًا!


طلبت من Claude شرح ما يبدو أنه المشكلة، ربما يساعد ذلك؟ هذا ما قاله:

العنوان: إعداد حاويتين: مجلد شهادة ECC مفقود بعد التقسيم، حلقة --force تصل إلى حد المعدل عند كل إقلاع

الإعداد: حاويتان (data + web_only)، تم الترحيل من وضع مستقل (standalone). القوالب: web، ratelimited، ssl، letsencrypt، cloudflare. اسم النطاق alltiago.com، لا توجد مستعرات (aliases).

الأعراض: كل بدء تشغيل لـ web_only يصل إلى حد معدل Let’s Encrypt ويفشل nginx في تقديم الخدمة، مما يعيد أخطاء اتصال حتى يتم حذف أسطر ECC يدويًا من /etc/nginx/conf.d/outlets/server/20-https.conf.

ما وجدته:

/shared/letsencrypt/alltiago.com_ecc/ غير موجود في تثبيتي. /shared/letsencrypt/alltiago.com/ (RSA) موجود ويعمل بشكل جيد، ويتجدد بشكل طبيعي.

في web.letsencrypt.ssl.template.yml:

cert_exists() {
  [[ "$(cd ${LETSENCRYPT_DIR}/${DISCOURSE_HOSTNAME}$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")" ]]
}

issue_cert "ec-256"
if ! cert_exists "_ecc"; then
  issue_cert "ec-256" "--force"
fi

لأن المجلد مفقود، تفشل cert_exists "_ecc" عند كل إقلاع، لذا يعمل --force ويطالب بشهادة ECC جديدة تمامًا بغض النظر عما يوجد على القرص. هذا يتم عبر خطاف after_ssl الذي يعدل /etc/runit/1.d/install-ssl، لذا يعمل عند كل بدء تشغيل للحاوية، وليس فقط عند التهيئة الأولية (bootstrap).

النتيجة: خطأ 429 too many certificates (5) already issued for this exact set of identifiers in the last 168h. ثم يعمل --installcert على أي حال ضد المجلد الفارغ ويكتب /shared/ssl/alltiago.com_ecc.cer غير قابل للاستخدام. تم تكوين nginx مع كلا الشهادتين، ولا يمكنه تحميل شهادة ECC، ولن يقدم الخدمة.

تم تأكيد عمله: تحقق ACME HTTP-01 ناجح (تم الاختبار عبر بيئة الاختبار، تم إصدار شهادة ECC بشكل جيد ضد letsencrypt_test، وتم إنشاء هيكل المجلد الصحيح). تم تجديد شهادة RSA بنجاح اليوم. لذا هذه ليست مشكلة DNS أو جدار حماية أو تحقق.

الأسئلة:

  1. هل هناك طريقة مدعومة لإعادة إنشاء alltiago.com_ecc/ دون انتظار انتهاء حد المعدل؟
  2. هل يجب أن يؤدي عودة cert_exists بقيمة خاطئة (false) إلى تشغيل --force بدلاً من إصدار عادي؟ --force يتجاوز فحص “شهادة صالحة موجودة” ويضمن استنفاد حد المعدل عندما يكون المجلد مفقودًا.
  3. هل هناك طريقة موثقة للعمل بشهادة RSA فقط؟

ملاحظتان واقعتان حتى لا يذهب الموضوع في الاتجاه الخاطئ: تاريخ إعادة المحاولة انتقل من 27 أغسطس إلى 29 أغسطس لأن تجديد RSA اليوم استهلك مكانًا في النافذة المتحركة البالغة 168 ساعة. والسبب في أن لا أحد آخر يبلغ عن هذا هو أنه في التثبيت العادي يتم إنشاء كلا المجلدين عند الإقلاع الأول ولا تعمل فرع --force أبدًا.

انتظر. يبدو أن https://alltiago.com/ يعمل بشكل جيد تمامًا. لكن هذا ما كنتُ سأوصي به:

نعم، لكن الأمر معقد بعض الشيء. إذا طلبتَ شهادة مختلفة، فسيتم إعادة بدء عدّادك من جديد.

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

من المفترض أن يساعدك الرابط التالي: Set up Let’s Encrypt with multiple domains / redirects

نعم، هذا صحيح، لأنني تم إبلاغي باستخدام "لصق

نعم. لا. لن أغيّر أي قوالب.

أعتقد أن الأسهل هو الانتظار ثم إعادة البناء باستخدام القوالب الأساسية. ما لم ترغب في الحصول على الدعم من الذكاء الاصطناعي بدلاً من أي شخص آخر يعرف كيفية استخدام discourse إلى الأبد.

طلبت من Claude اتباع نصيحتك من خلال إضافة www كطلب شهادة جديد (إذا كان هذا هو المصطلح المستخدم؟). يبدو أن الأمر يعمل الآن.

عندما سألت عن الملفات المتبقية من هذا العملية كلها، حصلت على هذا:

إليك ما هو موجود فعليًا، مقسمًا بين ما يعود لليلة الماضية وما هي بقايا أقدم من قبل هذه المحادثة:

من الليلة الماضية (هذه الجلسة):

  • /tmp/acme.sh.txt — نسخة من السكربت الذي طلبت تحميله، يمكن حذفها بأمان الآن بعد أن أصبحت لديك على جهاز Mac الخاص بك.
  • /tmp/crtsh.json — ملف فارغ بحجم 150 بايت ناتج عن خطأ 502 من crt.sh، وهو ملف غير مفيد ويمكن حذفه بأمان.
  • /root/discourse-backup-20260827-1857.tar.gz — النسخة الاحتياطية الحقيقية من وقت سابق الليلة (إعدادات SSL/letsencrypt)، هذه النسخة تستحق الاحتفاظ بها فعليًا وليست ملفًا غير مفيد.

أقدم، من قبل هذه المحادثة (23 أغسطس و25 أغسطس)، وليس شيئًا وضعته أنا هناك:

  • /tmp/app.yml
  • /tmp/check.png, /tmp/check162.png, /tmp/after.png, /tmp/rendered_avatar.png

لا أعرف ما هي هذه الملفات الأقدم، فهي تسبق أي شيء قمنا به الليلة، وهي على الأرجح بقايا من جلسة استكشاف أخطاء سابقة (سواء كانت لك، أو للروبوت، أو لمحادثة سابقة مع Claude). هل تتعرف عليها، أم تريد مني المساعدة في معرفة مصدرها قبل اتخاذ قرار بشأن حذفها؟

لم تظهر أي عناصر مشبوهة خارج /tmp و/root، وكانت نتائج الفحص الأوسع للنظام نظيفة، حيث لم يُعثر إلا على ملفات سجلات عادية.


هل يمكنني المتابعة وحذف جميع هذه الملفات؟

هل يجب أن أعكس ما قمت به للتو؟

لا يهمني على الإطلاق التحدث مع البشر الحقيقيين، لكنني فقط لا أريد طرح جميع الأسئلة هنا وغمر المنتدى بالعملية بأكملها (المخرجات/سجلات من Terminal)، بل أفضّل بدلاً من ذلك أن أتوصل إلى شيء يعمل “إلى حد ما” بالفعل لجعل المحادثة أقصر قليلاً. لدينا جميعًا حياتنا الخاصة ووقتنا المحدود، ولا أريد القفز إلى المنتدى على الفور، إلا إذا واجهت حائطًا حقيقيًا، أليس كذلك؟

أقدّر مساعدتك!
إذن، في الوقت الحالي، هل يجب أن أعكس ما قمت به؟ هل ترى أي مشكلة في هذا النهج مقارنة بانتظار يوم 29؟