فشل ترقية Discourse عبر واجهة الويب وترقية SSH تؤدي إلى تعطيل مثيل Discourse

ملاحظة: تم تحديث المنشور الأصلي في 25/11/21 بتوقيت شرق الولايات المتحدة بمعلومات جديدة

تم إبلاغي بتحديثات أمنية حرجة لتثبيت Discourse الخاص بي، وحاولت تحديث تثبيتي باستخدام واجهة المستخدم الرسومية (/admin/upgrade) كما فعلت في الماضي. كان هناك برنامجان يحتاجان إلى الترقية - Docker Manager و Discourse.

كان يجب ترقية Docker Manager أولاً (تم تعطيل زر ترقية Discourse). بدأت ترقية Docker Manager باستخدام واجهة المستخدم الرسومية واكتملت بنجاح. ثم بدأت ترقية Discourse لكنها فشلت في منتصف الطريق. عند تحديث واجهة المستخدم الرسومية، رأيت الرسالة التالية:

لذلك، باتباع التعليمات التي تظهر على الشاشة، قمت بتسجيل الدخول إلى الخادم عبر SSH، وقمت بتشغيل git pull ثم sudo ./launcher rebuild app من سطر الأوامر. انتهت العملية ولكنها فشلت برسالة خطأ FAILED TO BOOTSTRAP.

هذا هو ناتج تشغيلين لـ sudo ./launcher rebuild app في أوقات مختلفة:

أرقام الأسطر بعد كل ملف هي حيث تظهر الأخطاء الوحيدة. يبدو أن كلاهما متعلق بقاعدة البيانات والأدوار (الاختلاف بين النطاقين يرجع إلى أن الثاني حاول git pull من مستودع discourse/base).

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

يبدو أن هذا يتوافق مع رسالة خطأ FAILED المعروضة في أسفل كل محاولة إعادة بناء مشغل.

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 436 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
13bbdd52e0835ba9dfddc5c367d63b6087a16553c3a77d27ca307734d6e16907
** 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.

ملاحظة: هذه الأخطاء ليست المشكلة الجذرية. انظر “الحل” أدناه.

ذكر بعض الأشخاص أدناه أن هناك مشكلة في redis تمنع إعادة البناء بنجاح.

قمت بتشغيل sudo ./discourse-doctor في أوقات مختلفة خلال اليوم. هذا هو ناتج تشغيلين:

  • discourse-doctor-output-0.txt - لم يتم العثور على حاوية ‘app’ قيد التشغيل؛ تم محاولة إعادة البناء ولكن فشل إعادة تشغيل الحاوية
  • discourse-doctor-output-1.txt - تم تشغيل ‘app’ يدويًا باستخدام sudo usr/bin/docker start app قبل تشغيل discourse-doctor

تحققت من أن تثبيت Docker الخاص بي يعمل بشكل صحيح عن طريق تشغيل sudo docker run -it --rm hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

قمت بتشغيل sudo ./launcher cleanup للتأكد من أن لدي مساحة كافية على القرص.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
<DETAILS REMOVED>

Total reclaimed space: 3.836GB

$ df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     ext4   30G  9.1G   20G  32% /

وحتى أنني تحققت من إعدادات الذاكرة الخاصة بي.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        304M        633M         20M        1.0G        1.5G
Swap:          2.0G          0B        2.0G

لم يؤدِ إعادة تشغيل الخادم إلى حل المشكلة ولكني لاحظت شيئًا مثيرًا للاهتمام بعد إعادة تشغيل الخادم.

حاوية Docker app تعمل بعد إعادة التشغيل.

$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED       STATUS          PORTS                                                                      NAMES
6449ec0061a0   local_discourse/app   "\"/sbin/boot\""   7 weeks ago   Up 25 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

ولكن عندما أذهب إلى الموقع، أحصل على خطأ “502 Bad Gateway”.

عندما أوقف حاوية app وأذهب إلى الموقع، أحصل على خطأ “Unable To Connect” (وهو أمر طبيعي نظرًا لأن الحاوية لا تعمل).

لكن هذا يحيرني لأنني لم أقم بتثبيت Nginx على هذا الخادم.

يمكنني رؤية في ناتج إعادة البناء حيث تقوم العملية بنسخ ملفات Nginx من موقع إلى آخر ولكن لا يمكنني العثور على الدلائل أو الملفات المقابلة، وخاصة nginx.conf على خادمي في أي مكان. Ubuntu و Docker و Discourse ليست مهاراتي الأساسية ولكنني أفترض أن هذه الملفات يتم نسخها “داخل” حاوية Docker app.

شكرًا مقدمًا؛ أقدر أي مساعدة إضافية أو توجيه بشأن هذه المشكلة، والتي يبدو أنها تظهر من وقت لآخر أثناء ترقيات Discourse.

تحديث: اتضح أن افتراضي فيما يتعلق بامتلاك حاوية Docker app لنظام ملفات داخلي خاص بها صحيح. يمكنك إنشاء لقطة من نظام ملفات الحاوية واستكشاف نظام الملفات هذا باستخدام bash.

# create image (snapshot) from container filesystem
$ sudo docker commit <container_id> mysnapshot
$ sudo docker run -t -i mysnapshot /bin/bash

في نظام ملفات app، يوجد دليل nginx يحتوي على ملف تكوين Discourse.

root@f91826d986eb:/etc/nginx/conf.d# ls -l
total 12
-rw-r--r-- 1 root root 10568 Oct  3 21:33 discourse.conf

ماذا عن إعادة التشغيل؟ من هنا

يتطلب هذا التحديث إعادة تشغيل دوكر.

لذلك، نعم، سيكون ديسكورس الخاص بك غير متصل بالإنترنت أثناء تشغيل ‘./launcher rebuild app’ في سطر الأوامر.

سيكون كل شيء 100% بمجرد اكتمال إعادة البناء.

@IAmGav يبدو أن Docker قيد التشغيل.

@rmccown ZSm8WzJ7gLigPd08D4tiwt.png)

سأجرب بعض أوامر المشغل الأخرى لمعرفة ما إذا كان بإمكاني تشغيل الأشياء.

@IAmGav Ran ./discourse-doctor وتم التأكيد أيضًا على أن حاوية Docker قيد التشغيل.

==================== معلومات دوكر ====================
إصدار دوكر: Docker version 20.10.11, build dea9396

عمليات دوكر (docker ps -a)

معرف الحاوية   الصورة                 الأمر        تم الإنشاء   الحالة   المنافذ                                                                      الأسماء
6449ec0061a0   local_discourse/app   "/sbin/boot"   قبل 7 أسابيع   قيد التشغيل منذ حوالي ساعة   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app


حاوية Discourse app قيد التشغيل


@rmccown جربت كل من start و restart دون جدوى.

لا يزال يظهر هذا على عنوان URL.

فشل تشغيل sudo ./launcher rebuild app مرة أخرى مع هذه الرسائل (أبحث حاليًا في الملف عن رسائل خطأ سابقة).

عندما تفشل كل الحلول الأخرى - هل جربت فصله وإعادة توصيله؟ :wink:

أعد تشغيل المثيل: reboot now

قم بترقية المثيل إلى أحدث إصدار: apt-get update و apt-get dist-upgrade

ثم قم بتشغيل ترقية Discourse.

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

@omarfilip هذا هو أول شيء جربته :wink:

لقد جربت إعادة التشغيل مرة أخرى (لا توجد مكونات Ubuntu 18.04.6 للترقية من ترقية سابقة).

نفس النتائج - خطأ 502 Bad Gateway في عنوان URL.

لكن شكراً على الاقتراح.

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

وأيضًا وجدت هذا من نوفمبر 2020 - Upgrade ends with FAILED TO BOOTSTRAP.

لكن يجب أن أعترف أنني لا أعرف بالضبط ما يعنيه “اتباع قناة الإصدار الافتراضية الخاصة بنا”. أفترض أن الترقية عبر واجهة المستخدم على الويب هي “قناة الإصدار الافتراضية”.

سيكون ذلك “tests-passed”. إذا لم تقم بتعديل هذا السطر في ملف app.yaml الخاص بك، فأنت على قناة الإصدار الافتراضية:

  ## Which Git revision should this container use? (default: tests-passed)
  #version: tests-passed

هل يمكنك مشاركة السجل بالكامل، هذا لا يكفي لرؤية الخطأ الفعلي.

أنا أستخدم قناة الإصدار الافتراضية.

وقيمة db_shared_buffers الخاصة بي ليست 0 ميجابايت (وجدت هذه المشكلة هنا).

@IAmGav إليك ملخص يحتوي على مخرجات ./launcher rebuild app - link

المؤشر الوحيد للخطأ هو في مجموعة الأسطر التالية (انظر أدناه).

يبدو أنها متعلقة بإنشاء قاعدة البيانات والدور. هل هناك أي طريقة لتجاوز هذه الإجراءات؟ (أعتقد أنك سترغب في القيام بذلك أثناء الترقية نظرًا لأنك تعمل مع نسخة موجودة مسبقًا)

الأسطر 88-95

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

حدث لي نفس الشيء بالضبط منذ فترة، فشل التحديث في منتصف تحديث واجهة الويب؛ حتى رسائل الخطأ بعد محاولة إعادة البناء متشابهة إلى حد كبير ولا تزال غير محلولة؛ الاختلاف الوحيد هو أنني تمكنت من التحديث عبر واجهة الويب لفترة من الوقت، باستثناء قبل يوم أو يومين، بعد عدم التحديث لبضعة أسابيع، ظهر الآن إشعار “أنت تشغل إصدارًا قديمًا من صورة Discourse”، والآن لا يمكنني التحديث على الإطلاق. :وجه_مقلوب:

يبدو أن المشكلة تتعلق بـ redis.

الجميع - تم تحديث مشاركتي الأصلية بالمعلومات التي تم جمعها طوال اليوم. شكرًا لكل من نشر حتى الآن.

لا. هناك خطأ آخر. حاول إزالة هذا المكون الإضافي.

Gem::ConflictError: Unable to activate omniauth-vkontakte-1.7.0, because omniauth-oauth2-1.7.2 conflicts with omniauth-oauth2 (>= 1.5, <= 1.7.1)

3 إعجابات

باتباع نصيحة مايكل في المنشور أعلاه، قمت بالتعليق على إضافة في ملف app.yml كانت من محاولة أولية للمصادقة باستخدام الدخول الموحد (SSO) باستخدام إضافة VK (لم نعتمد هذا التنفيذ أبدًا ولكننا نسينا بوضوح إزالة الإضافة من ملف app.yml).\n\n\n## Plugins go here\n## see https://meta.discourse.org/t/19157 for details\nhooks:\n after_code:\n - exec:\n cd: $home/plugins\n cmd:\n - git clone https://github.com/discourse/docker_manager.git\n## - git clone https://github.com/discourse/discourse-vk-auth.git\n\n\nبعد التعليق على السطر أعلاه، قمت بتشغيل sudo ./launcher rebuild app مرة أخرى. بعد إعادة البناء، يبدو أن موقع المنتدى يعمل (أختبر الآن).\n\nشكرًا مرة أخرى لكل من أخذ الوقت لمراجعة منشوراتي والتعليق عليها. كان مساعدتكم محل تقدير كبير (ما هي أفضل طريقة لقضاء عطلة عيد الشكر هنا في الولايات المتحدة :wink:).\n\nابقوا آمنين.

4 إعجابات

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.