مشكلة Postgres... مرة أخرى!

مرحبًا، لدي مشكلتان كبيرتان عند إيقاف وتشغيل Discourse مرة أخرى.

الأولى
بعد 2-3 مرات من القيام بذلك (سواء باستخدام ./launcher stop أو عبر Portainer stop)، يرفض الحاوية البدء مجددًا، ويتعطل باستمرار عند رسالة “rm: cannot remove ‘/shared/nginx.http.sock’: Is a directory”. (لاحظت للتو أن الـ socket ليس في مجلد “shared”، بل في “shared/standalone”، هل هذه مجرد خطأ في الرسالة؟)
لسبب ما لا يزال غير معروف لي، يتحول هذا الـ socket، ربما بعد الإيقاف، إلى مجلد، ولا تستطيع القالب حذفه لأنه لا يمكنه حذف مجلد، بل socket. حذفه يدويًا لا يغير شيئًا، حيث يعاد ظهوره في كل مرة.

الثانية
عند تشغيل “./launcher rebuild app” يتعطل عند رسالة “FATAL: the database system is starting up”، بعد الرسالة الأولى “PANIC could not locate a valid checkpoint record”. لقد قرأت وحاولت كل ما وجدته بخصوص هذه المشكلة، والحل الوحيد الذي يعمل والذي وجدته هو حذف مجلد discourse مع كل ما بداخله وإعادة إعداد كل شيء من جديد… وهذا بالطبع ليس حلاً حقيقيًا!

يبدو أن إيقاف حاوية Discourse في بعض الأحيان يترك قاعدة البيانات في حالة سيئة، ولا يمكنها الاستمرار لأنها “تبدأ التشغيل”، ربما تحاول إصلاح شيء ما. لكنني لم أجد بعد كيفية إصلاح هذه المشكلة، التي تبدو أنها تظهر بعد بعض عمليات الإيقاف والتشغيل.

هل لديك أي فكرة؟ أو طريقة للسماح لـ Postgres بإصلاح مشاكله؟

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

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

ولكنني أجد أن “nginx.http.sock” يتم إنشاؤه أيضًا في “shared/standalone” في نظام ملفات المضيف. في البداية يكون وردي اللون كملف اتصال (socket)، ولكن بعد فترة، ربما بعد إيقاف التشغيل، يتحول إلى أزرق كدليل (directory)، فتتوقف الحاوية عن البدء عالقة في محاولة حذف ملف اتصال أصبح دليلًا.

إذن، ما الذي يمكننا فعله لإصلاح ذلك؟ حتى الآن، أنا فقط أجرب، ولكن إذا ذهبت إلى الإنترنت مع مئات المستخدمين المتصلين ومئات الآلاف من المشاركات، هل سأخاطر بفقدان كل شيء فقط لأن PostgreSQL لا تتعامل مع الانقطاع المفاجئ؟ سيكون هناك شيء يجب القيام به لإصلاح قاعدة بيانات تالفة. هل يمكن تشغيل Discourse على PostgreSQL خارجية يمكن إدارتها إذا لم تبدأ حاوية Discourse؟ باختصار، في حالة حدوث “PANIC” أو “FATAL”، يجب أن يكون هناك إصلاح…

في الواقع، أحاول حل المشكلة (للمستقبل) عن طريق إعداد قاعدة بيانات Postgres “مُحاوية” وربطها بـ Discourse، على أمل عدم الإضرار بقاعدة البيانات (أو على الأقل القدرة على إجراء بعض الصيانة حتى مع توقف Discourse) عند إيقاف Discourse.