ملاحظة: تم تحديث المنشور الأصلي في 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 في أوقات مختلفة:
- launcher-rebuild-app-output-0.txt - الأسطر 88-95
- launcher-rebuild-app-output-1.txt - الأسطر 100-107
أرقام الأسطر بعد كل ملف هي حيث تظهر الأخطاء الوحيدة. يبدو أن كلاهما متعلق بقاعدة البيانات والأدوار (الاختلاف بين النطاقين يرجع إلى أن الثاني حاول 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








