فشل البناء بسبب عدم تطابق إصدار ruby

بعد بضعة أيام من استخدام
./launcher bootstrap web_only && ./launcher destroy web_only && ./launcher start web_only دون مشاكل
واجهت مشاكل بعد محاولة استخدام وحدة تحكم rails لتعيين SiteSetting.can_permanently_delete = true
باستخدام ./launcher enter web_only ثم rails c

سؤال: هل يتم الوصول إلى وحدة تحكم rails بشكل مختلف في وضع الحاوية المنفصلة؟

بعد الفشل في الحصول على إعادة بناء وتشغيل ناجح، قمت بإرجاع الخادم بضعة أيام قبل تطبيق محتوى الذكاء الاصطناعي. لا فائدة!
تفشل طريقة التشغيل المسبق (bootstrap) مع:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3' failed with return #<Process::Status: pid 465 exit 18>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"bundle_exec", "cmd"=>["su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'", "su discourse -c 'bundle clean'", "su discourse -c 'find /var/www/discourse/vendor/bundle -name cache -not -path \\\"*/gems/*\\\" -type d -exec rm -rf {} +'", "su discourse -c 'find /var/www/discourse/vendor/bundle -name tmp -type d -exec rm -rf {} +'"]}
bootstrap failed with exit code 18
** 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.
aee0f5c110bf8ce78f05c138a78712b4a0116fe6662c998b2f29800715036091

يحدث خطأ في ./launcher rebuild web_only أيضًا

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web_only (06b7b1f7f6b476adac20a11a55de776d7350e837407a6c7a6ba582c917f6dd73): Bind for 0.0.0.0:80

بعد تحديث Docker Manager من المسؤول، أحصل على

You are running an old version of the Discourse image
Updates via the web UI are disabled until you run the latest image. To do so log in to your server using SSH and run:

  cd /var/discourse
  ./launcher rebuild app

سؤال: هل لديكم أي أفكار عما يحدث؟

إليك الخطأ الذي يتسبب في فشل البناء:

[2026-02-17T16:51:13.376629 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
Your Ruby version is 3.3.8, but your Gemfile specified >= 3.4

تحتاج إلى التمرير لأعلى للعثور على الخطأ.

3 إعجابات

نعم، لقد فعلت ذلك ولكنني لم أر أي شيء مفيد أبدًا.
إليك الأحدث.
exitcode18.txt (43.5 كيلوبايت)

إليك الخطأ:

[2026-02-17T16:51:13.376629 #1]  INFO -- : \u003e cd /var/www/discourse \u0026\u0026 su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
إصدار Ruby الخاص بك هو 3.3.8، ولكن ملف Gemfile الخاص بك حدد ~\u003e 3.4

هل لديك Discourse Docker مثبتًا على إصدار قديم؟ أو، قد يكون خطأً، ولكن يبدو من غير المحتمل أن يجتاز مثل هذا الخطأ اختبار البناء.

شكرًا جاي. لقد رأيت ذلك، ولكن الرسائل الغريبة ليست غير شائعة مع عمليات البناء الناجحة.

لا، اتبعت صاحب الموضوع كما ذكرت.

@pfaffman شكراً على النقل!

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

هل يمكنك سحب /var/discourse؟ يجب إجراء إعادة البناء باستخدام الصورة الأساسية 2.0.20260209-1300

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

شكرًا لانضمامك @supermathie

يتم استخدام 2.0.20260209-1300
من إعادة بناء ./launcher rebuild web_only جديدة

Status: Downloaded newer image for discourse/base:2.0.20260209-1300
docker.io/discourse/base:2.0.20260209-1300
Ensuring launcher is up to date
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 web_only
web_only
2.0.20260209-1300: Pulling from discourse/base
Digest: sha256:50d2dae489a9c9916c3d50d880f7f1282fcbe179339b60a8947ab135c1f1f9bf
Status: Image is up to date for discourse/base:2.0.20260209-1300
docker.io/discourse/base:2.0.20260209-1300

end of build

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web_only (9e391a36bdc1a80a6b993a466ffdba25337ce70f1fe74f2b5d8aaca75585322b): Bind for 0.0.0.0:80 failed: port is already allocated

failed to set up container networking.txt (74.3 KB)

تعديل
أعتقد أن الخطيئة الأصلية بدأت بالتحويل إلى حاويتين.

هناك شيء ما على الخادم الخاص بك يستخدم المنفذ 80 ويحتاج إلى الإيقاف

ولكنك قلت إنها كانت تعمل وأنك قمت بعدة عمليات إعادة بناء.

دسكورس هو الشيء الوحيد الموجود على الخادم

لقد فعلت وأفعل :grinning_face:

هناك ثلاثة خيارات لإعادة البناء في المنشور الأصلي. الخيار الذي أشير إليه لم يعمل أبدًا، أي تسبب في الفشل

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1310/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      1316/docker-proxy

التحقق من مثيلين آخرين يعملان في حاويات منفصلة… الرسالة التي أشار إليها @pfaffman

نفس النتيجة مع ./launcher bootstrap web_only && ./launcher destroy web_only && ./launcher start web_only

Already up to date
╭ Warning ─────────────────────────────────────────────────────────────────────╮
│                                                                              │
│   Ignored build scripts: @swc/core@1.15.7, core-js@2.6.12, core-js@3.47.0,   │
│   esbuild@0.25.12, esbuild@0.27.1, lefthook@2.1.0.                           │
│   Run "pnpm approve-builds" to pick which dependencies should be allowed     │
│   to run scripts.                                                            │
│                                                                              │
╰──────────────────────────────────────────────────────────────────────────────╯
I, [2026-02-17T21:07:23.811289 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
Your Ruby version is 3.3.8, but your Gemfile specified ~= 3.4

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

إذا كنت بحاجة إلى ترقية البيانات، فأنت بحاجة إلى إيقاف تشغيل الويب فقط ثم إعادة بناء البيانات، ثم الويب فقط. لقد قمت بتحديث المنشور الأصلي (OP).

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

docker ps

ومعرفة ما إذا كان app قيد التشغيل. نأمل أن يكون كذلك، لأن هذا يفسر مشكلة المنفذ.
ربما تحتاج إلى

 docker stop app; docker rm app
إعجابَين (2)