كيفية حل أخطاء Pups exec أثناء إعداد Discourse

أقوم بإنشاء مثيل discourse جديد من الصفر لأغراض التطوير وأرى خطأ التمهيد هذا مرة أخرى:

فشل
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' فشل مع العودة #<Process::Status: pid 1002 exit 1>
مكان الفشل: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
فشل التنفيذ مع المعلمات {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
فشل التمهيد برمز خروج 1

إعداد الحاوية يتم مع حاويتين لـ webonly و dataonly (redis) مع قاعدة بيانات postgresql خارجية. التعليق على إعدادات maxmind لا يغير شيئًا.

هل لديك أي أفكار حول ما يمكنني فعله هنا؟

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

حسناً، لا، لدينا 4 جيجابايت من ذاكرة الوصول العشوائي والكثير من مساحة القرص الصلب (2 × 32 جيجابايت)، والبيئة العامة هي نفسها مثل جهاز دوكر الآخر حيث تعمل عمليات البناء دون مشاكل.

حالة الذاكرة:

root@docker3a:/var/discourse# free -h
إجمالي مستخدم حر مشترك مخزن مؤقت/ذاكرة تخزين مؤقت متاح
الذاكرة: 3.8Gi 819Mi 1.4Gi 22Mi 1.9Gi 3.0Gi
التبديل: 974Mi 52Mi 922Mi

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

هل هناك أي أخطاء حديثة في مخرجات dmesg قد تكون ذات صلة؟

هل يمكنك مشاركة السجل بأكمله؟

هذا تخمين غريب، لا نرى عادةً نفاد الذاكرة (OoM) يسبب أخطاء ترحيل في المنتديات.

تم اكتشاف بنية x86_64.
جارٍ التأكد من تحديث المشغل
المشغل محدث
2.0.20250226-0128: السحب من discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
الحالة: الصورة محدثة لـ discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
18:C 19 Apr 2025 16:38:41.670 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18:C 19 Apr 2025 16:38:41.670 # Redis version=7.0.15, bits=64, commit=00000000, modified=0, pid=18, just started
18:C 19 Apr 2025 16:38:41.670 # Configuration loaded
18:M 19 Apr 2025 16:38:41.670 * monotonic clock: POSIX clock_gettime
18:M 19 Apr 2025 16:38:41.670 * Running mode=standalone, port=6379.
18:M 19 Apr 2025 16:38:41.670 # Server initialized
18:M 19 Apr 2025 16:38:41.671 * Loading RDB produced by version 7.0.15
18:M 19 Apr 2025 16:38:41.671 * RDB age 72606 seconds
18:M 19 Apr 2025 16:38:41.671 * RDB memory usage when created 0.82 Mb
18:M 19 Apr 2025 16:38:41.671 * Done loading RDB, keys loaded: 0, keys expired: 0.
18:M 19 Apr 2025 16:38:41.671 * DB loaded from disk: 0.000 seconds
18:M 19 Apr 2025 16:38:41.671 * Ready to accept connections
999:C 19 Apr 2025 16:39:59.006 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
999:C 19 Apr 2025 16:39:59.006 # Redis version=7.0.15, bits=64, commit=00000000, modified=0, pid=999, just started
999:C 19 Apr 2025 16:39:59.006 # Configuration loaded
999:M 19 Apr 2025 16:39:59.006 * monotonic clock: POSIX clock_gettime
999:M 19 Apr 2025 16:39:59.006 # Warning: Could not create server TCP listening socket *:6379: bind: Address already in use
999:M 19 Apr 2025 16:39:59.006 # Failed listening on port 6379 (TCP), aborting.
18:signal-handler (1745080813) Received SIGTERM scheduling shutdown...
18:M 19 Apr 2025 16:40:13.541 # User requested shutdown...
18:M 19 Apr 2025 16:40:13.541 * Saving the final RDB snapshot before exiting.
18:M 19 Apr 2025 16:40:13.549 * DB saved on disk
18:M 19 Apr 2025 16:40:13.549 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' failed with return #&lt;Process::Status: pid 1002 exit 1&gt;
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
** 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.
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b

إذا كان هذا حاوية ويب فقط، فلماذا يوجد عليها ذاكرة التخزين المؤقت Redis؟

هل يمكنك مشاركة تعريفات الحاويات الخاصة بك بصيغة yml؟ ولماذا تقوم بتشغيل تثبيت من حاويتين؟

يا فالكو
أنت على حق وأنا غبي :wink:
سأقوم بتصحيح ذلك…

حسنًا، لقد أصلحت فصل web_only و redis. رسالة الخطأ الآن هي:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 981 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migra
te'"]}
bootstrap failed with exit code 1
** 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.
801049b69a89d38b1ae5c299d356fc5f8dc6a8f518b1260c2dde05e0b6081556

ولكن ربما يكون هناك سوء فهم / نقص في المعرفة من جانبي:

يجب أن تكون قاعدة البيانات خارجية في حاوية lxc أخرى تحتوي على قاعدة بيانات postgresql. المستخدم وقاعدة البيانات موجودان، لكن قاعدة البيانات فارغة قبل أول عملية bootstrap لـ web_only. هل يقوم البرنامج النصي بإنشاء قاعدة البيانات بنفسه على النظام البعيد عند أول بناء؟ أم يجب علي أولاً إنشاء حاوية قاعدة البيانات ثم تصدير مخططها الافتراضي والبيانات يدويًا إلى خادم postgresql الخارجي؟

تصور للإعداد العام

forum2 Setup.excalidraw

شكراً على الرسم البياني. هذا إعداد متطور للغاية - ستقوم بذلك إذا كان لديك سبب وجيه وتعرف المنطقة.

إذا كنت لا تزال ترى ما يلي، أعتقد أن هذا هو مؤشر على الخطأ. لا يمكن لـ Redis فتح المنفذ الذي يحتاج إلى الاستماع إليه.

إذن، الأسئلة تدور حول ما إذا كان يجب على Redis القيام بذلك، في هذه الحاوية، وإذا كان الأمر كذلك، فأين يعمل Redis آخر على الجهاز. قد تكون أداة lsof أداة مفيدة هنا.

مرحباً @Ed_S
شكراً على التلميح بشأن المنفذ المفقود. أريد أولاً انتظار رد فالكو بخصوص أسئلتي حول الإعداد العام لـ discourse مع قاعدة بيانات postgres خارجية.

نعم، الإعداد معقد بعض الشيء مقارنة بالإعداد القياسي الذي يحتوي على حاوية تطبيق واحدة فقط. أقوم بتشغيل كل شيء على جهاز فعلي مخصص مع Proxmox (https://p.roxmox.com) كبيئة افتراضية في hetzner.de

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

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

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

مرفق ملف tarball يحتوي على

./launcher bootstrap web_only >> web_only_bootstrap.log

وملفات ymls لـ redis و web_only، تم إزالة كلمات المرور.

forum2_build.tar.gz (3.3 KB)

Longshot:

links:
  - link:
      name: redis
      alias: data

لماذا ليس alias: redis؟

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

الملف من /samples/web_only.yml يحتوي على
# استخدم مفتاح 'links' لربط الحاويات معًا، أي استخدم علامة Docker --link.
links:
- link:
name: data
alias: data

في حالتي، حاوية البيانات هي حاوية redis

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a27999b28a90 local_discourse/redis \"/sbin/boot\" 2 days ago Up 20 hours

لذلك name: redis and alias: data

وفقًا لوثائق Docker، هذه ميزة قديمة، ولكن لا يزال من الممكن استخدامها، انظر Legacy container links | Docker Docs

أعتقد الآن أن النهج الأفضل سيكون إنشاء إعداد قياسي “متكامل” أولاً (app.yml). ثم تفريغ مخطط وقاعدة البيانات الأولية من الحاوية إلى جهاز postgres خارجي. @Falco ما رأيك؟

ولكنها 28 سطراً فقط، لذا فهي تفتقد معظمها.

تخميني الجديد هو أنه لا يتصل بقاعدة البيانات الخاصة بك على الإطلاق، على الرغم من أنه قد يكون redis الذي لا يتحدث إليه.

جرب

./launcher bootstrap web_only >> web_only_bootstrap.log 2>&1

سيقوم المثبت تلقائيًا بإنشاء كل ما هو ضروري طالما تم تزويده ببيانات اعتماد صالحة وكان قادرًا على الوصول إلى قاعدة البيانات. هذا موثق في تكوين Discourse لاستخدام خادم PostgreSQL منفصل

web_only_bootstrap2.tar.gz (9.1 KB)

هذا يجب أن يكون أفضل :wink:

هل هذا تثبيت جديد أم أنك تقوم بنقله إلى خادم جديد؟

إذًا، تريد إلقاء نظرة على ملف السجل والبحث عن “migrate” للعثور على خطأ الترحيل.

هذا هو الخطأ:

PG::DuplicateObject: ERROR:  type "hotlinked_media_status" already exists

قد تكون مشكلة في شيء تم ترحيله ثم تم التراجع عن التثبيت. هذا مرتبط، ولكنه ليس حلك: Restore fails with "hotlinked_media_status" already exists. ربما هذا: Upgrading 2.7 to 3.1 failing: "hotlinked_media_status" already exists - #5 by merefield

أيضًا، يجب عليك إصلاح هذا، على الرغم من أنه لا يسبب أي ضرر حقًا:

اسم المكون الإضافي هو "discourse-topic-voting"، ولكن اسم دليل المكون الإضافي هو "discourse-voting"

إذا قمت بذلك مرة أخرى، فيرجى فقط ربط الملف دون وضعه في ملف tar.

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