خطأ قاتل: تعذّر قراءة اسم المستخدم لـ 'https://github.com'

حاولت ترقية منتدي الذي يتكون من حاويتين، لكنه فشل. هل لديك أي فكرة عن السبب؟

x86_64 arch detected.                                                                                                                                                    
2.0.20260803-0122: Pulling from discourse/base                                                                                                                           
Digest: sha256:ab1e7217470759e63313a16bc5b71b9f2dd7d3ae8303286e5985f563ad12b7b3                                                                                          
Status: Image is up to date for discourse/base:2.0.20260803-0122                                                                                                         
docker.io/discourse/base:2.0.20260803-0122                                                                                                                               
/usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups.rb                                                                                                               /usr/local/bin/pups --stdin                                                                                                                                              
I, [2026-09-02T16:49:46.027794 #1]  INFO -- : Reading from stdin                                                                                                         
I, [2026-09-02T16:49:46.066073 #1]  INFO -- : > thpoff echo "thpoff is installed!"                                                                                       thpoff is installed!                                                                                                                                                     
I, [2026-09-02T16:49:46.079514 #1]  INFO -- : > /usr/local/bin/ruby -e 'if (ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com" && ENV["DISCOURSE_SKIP_EMAIL_SETUP"] != "
1"); puts "Aborting! Mail is not configured!"; exit 1; end'                                                                                                              
I, [2026-09-02T16:49:46.242618 #1]  INFO -- : > /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Aborting! Domain is not configured!"; exit 1; end'                                                                                                                                                         I, [2026-09-02T16:49:46.351184 #1]  INFO -- : > /usr/local/bin/ruby -e 'if (ENV["DISCOURSE_CDN_URL"] || "")[0..1] == "//"; puts "Aborting! CDN must have a protocol specified. Once fixed you should rebake your posts now to correct all posts."; exit 1; end'                                                                                   I, [2026-09-02T16:49:46.497030 #1]  INFO -- : > rm -f /etc/cron.d/anacron                                                                                                I, [2026-09-02T16:49:46.504864 #1]  INFO -- : File > /etc/cron.d/anacron  chmod:   chown:                                                                                I, [2026-09-02T16:49:46.512848 #1]  INFO -- : File > /etc/runit/1.d/copy-env  chmod: +x  chown:  I, [2026-09-02T16:49:46.525056 #1]  INFO -- : File > /etc/service/unicorn/run  chmod: +x  chown: 
I, [2026-09-02T16:49:46.533676 #1]  INFO -- : File > /etc/service/nginx/run  chmod: +x  chown:  
I, [2026-09-02T16:49:46.542104 #1]  INFO -- : File > /etc/runit/3.d/01-nginx  chmod: +x  chown:   
I, [2026-09-02T16:49:46.557772 #1]  INFO -- : File > /etc/runit/3.d/02-unicorn  chmod: +x  chown:            
I, [2026-09-02T16:49:46.566700 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse git clean -f
I, [2026-09-02T16:49:46.797286 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit                                                                    
  git fetch --tags --prune-tags --prune --force origin                                                                                                                   
  if [[ $(git symbolic-ref --short HEAD) == latest ]] ; then                                                                                                             
      git pull                                                                      
  else                                                                              
      git -c advice.detachedHead=false checkout latest                                                                                                                   
  fi                                                                                
'                                                                                   
fatal: could not read Username for 'https://github.com': No such device or address                                                                                       
fatal: expected flush after ref listing                                             


FAILED                                                                              
--------------------                                                                
Pups::ExecError: cd /var/www/discourse && sudo -H -E -u discourse bash -c '                                                                                              
  set -o errexit                                                                    
  git fetch --tags --prune-tags --prune --force origin                                                                                                                   
  if [[ $(git symbolic-ref --short HEAD) == latest ]] ; then                                                                                                             
      git pull                                                                      
  else                                                                              
      git -c advice.detachedHead=false checkout latest                                                                                                                   
  fi                                                                                
' failed with return #<Process::Status: pid 34 exit 128>                                                                                                                 
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#spawn'
exec failed with the params {"cd" => "$home", "tag" => "build", "hook" => "code", "cmd" => ["sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n 
 set -o errexit\n  git fetch --tags --prune-tags --prune --force origin\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      gi
t -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-da
ta tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/ra
ils/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.st
dout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/
public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discours
e:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 128                                                 
** 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.                                                                                                                        
f21423e74889e97cf80d8d237c4ca8bb1d4674e6e3a0a30527d1b4394d5d8c98

نعم، أنا أيضًا خارج الخدمة رسميًا الآن.

أولًا، ظهرت لي رسالة Oops The software powering this discussion forum encountered an unexpected problem

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

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

لكنها فشلت عند سؤال اسم المستخدم.

حاولت استخدام ./discourse-doctor لكن انتهى بي الأمر بنفس خطأ github.

سأحاول فحص السجلات (logs).

ملاحظة: لدي أيضًا مساحة تخزين جيدة متبقية قدرها 5 جيجابايت، لكنني عادةً ما أجد صعوبة في الترقية بالكاد. مضاعفة مساحة التخزين ستمثل مضاعفة التكلفة، ولم يكن لدي وقت أبدًا لنقل كل شيء إلى خوادمي الخاصة.

حاولت فحص السجلات لكنني لاحظت فقط العديد من رفضات الاتصال مثل:
/usr/local/lib/ruby/3.4.0/socket.rb:1639:in ‘Socket#__connect_nonblock’: Connection refused - connect(2) for 127.0.0.1:6379 (Errno::ECONNREFUSED)

أعتقد أن الأمر متعلق بهذا؟

لا أستطيع تحديث مكوّنات منتدائي، وعند إعادة البناء (rebuild) تظهر لي رسالة غير متوقعة:

./launcher rebuild app
arm64 arch detected.
WARNING: This output is designed for human readability. For machine-readable output, please use --format.
Ensuring launcher is up to date
Username for 'https://github.com':

منتدائي يستخدم نطاق discourse.diy.

على الأرجح هذا هو الحال. يبدو ذلك.

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

سنضطر إلى الانتظار فقط :man_shrugging:

الآن أعجبني حقا حل الحاويتين…

يبدو أن هناك مشكلة في GitHub، وقد وجدت نقاشًا حولها هنا: Unauthenticated clone of a public repo intermittently returns 401 (prompts for Username) from CI workers · community · Discussion #206581 · GitHub

مرحبًا بالجميع! :waving_hand: شكرًا لكم على رفع هذه المسألة. لقد شاركناها مع فرقنا الداخلية للتحقيق فيها - وإذا كانت لدينا أي تحديثات فسنقوم بنشرها هنا وفي النقاشات المناسبة :sparkles:

كحل مؤقت محتمل، لكنني أنصحك بالانتظار أولًا، وهذا يعمل:

cd /var/discourse
git config --global http.version HTTP/1.1
./launcher rebuild app

(قد تحتاج إلى إعادة البناء مرتين بسبب ترقية PostgreSQL)

لقد قمت بتحديث حوالي 10 مواقع اليوم دون أي أخطاء (باستثناء أخطاء مساحة القرص).

يبدو أن هذا تحديث عبر سطر الأوامر، ولكن إذا لم يكن كذلك، فأنصح به بالتأكيد.

5 جيجابايت ليست مساحة مريحة، بل هي بالكافي لبناء حاوية جديدة. هل قمت بتنفيذ أمر ./launcher cleanup مؤخرًا؟

هذا منطقي. ومن المرجح أن المشكلة لا تؤثر على الجميع بالتساوي.

بديل قد يكون أقل إزعاجاً بكثير هو تغيير الإعداد على النحو التالي:

# docker exec -i -u discourse app git config --global http.version HTTP/1.1

(على مسؤوليتك الخاصة، بالطبع.)

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

الحقائق الأساسية (آسف على التوضيحات): يقوم نظام SSO الخاص بي بالتحويل إلى خادمي المنزلي (بعد أن فشل Gandi في حل بعض الأمور قبل بضع سنوات وانتقلت إلى Dynadot). كما أن التحويل يعمل بشكل أفضل بعد أن اشترى Hostpapa استضافة LFC ذات الموثوقية العالية، حيث لم تكن متأكدًا من أنهم سيقومون بترقية شيء ما بصمت مما قد يؤدي إلى انهيار بنيتك التحتية بأكملها.

والآن إلى 3 (أو هل يمكنني حتى أن أحسب هذا كفشل في 5 نقاط، سيكون رقمًا قياسيًا جديدًا)

1*) تم تحديث Opera اليوم، مرة أخرى، ويبدو أنه أضاف بعض الشيفرة التي لا تحب (بشكل سيئ) تحويلات 301/302 وتخزينها مؤقتًا بشكل صارم (شيء متعلق بـ Chromium).
2*) يبدو أن Dynadot كان يعاني من تأخير يزيد عن 30 ثانية الليلة (وهو ما يلزم لتفعيل مشكلة Chromium، التي تم تخزينها مؤقتًا الآن، يا للكارثة).
3*) تعطل Discourse (الخطأ المذكور أعلاه) لأنه لم يتمكن من الوصول إلى SSO خلال 30 ثانية. كان لا بد من إعادة تشغيل التطبيق، لكنني لست متأكدًا فعليًا مما إذا كان Discourse متوقفًا حتى إعادة التشغيل أم لا (كنت في وضع الذعر :wink: ). لكن Gemini جعلني أدور في حلقات حول sso/rails/redis وما إلى ذلك بناءً على السجلات. وهذا بعد أن حاولت الترقية، لكني أذكرها تحت هذه النقطة للحفاظ على تماسك القصة.
4*) وبما أنني لا أستطيع تحديد ما الذي يحدث خطأً، أعد تشغيل نظام لينكس على أي حال وأبدأ في ترقية Discourse. التي تفشل بسبب مشكلة GitHub. ونعم، كان لا بد من تنظيف الأقراص قليلاً أولاً كما هو معتاد، لكنني لم أكن يومًا عند 0G مما كان يمكن أن يكون سببًا محتملًا لمشاكل redis أيضًا. ونعم، الآن، بما أن الأمور تبدو مستقرة، سأضيف 10G في السحابة وربما ترقية Arkshine.
5*) نوعًا ما هي المشكلة الأولى، لكن أثناء محاولة حل كل هذا، كنت أتحديث الصفحة باستمرار بشكل صارم لأرى ما إذا كان قد تم إصلاح شيء ما في مكان ما. أعتقد أنني أصطدم بالتحويل المخزن مؤقتًا من الفشل الأولي طوال الوقت، مما يعني أنني لا أستطيع حتى رؤية ما إذا كان قد تم إصلاح المشكلة، حتى بعد إعادة التشغيل الأولى.

  1. يمكنني الوصول إلى SSO الخاص بي بشكل جيد تمامًا.
  2. موقع نطاق آخر لا يستخدم SSO يعمل أيضًا بشكل جيد.
  3. تعطيل SSO لـ Discourse يعرض المنتديات، لكنني لم أكن لدي تسجيلات دخول عادية تعمل من قبل، لذا فهي لا تساعد كثيرًا هناك. لكن على الأقل، أعلم الآن أن المشكلة تكمن في SSO حقًا.
  4. يقترح Gemini الاختبار في نافذة خاصة، لذا أشغل Firefox بدلاً من ذلك، وماذا، يعمل المنتدى بشكل جيد تمامًا. رائع، باستثناء… ماذا؟
  5. لا يزال Opera يفشل. نعم، لا يزال يخزن التحويل مؤقتًا كما أشك، لكن هذا لم يكن شيئًا كنت أعرفه في ذلك الوقت. لن أقوم بمسح ملفات تعريف الارتباط والمخازن المؤقتة للموقع بعد.
  6. بما أن الأمور تعمل، قمت بالعمل الضروري الذي كنت أود فعله فعليًا باستخدام Firefox لمدة نصف ساعة.
  7. أعدت تشغيل Opera وفجأة، يظهر المنتدى. ربما كنت قد أعدت تشغيل Opera في وقت سابق، لا أذكر، لكن ربما انتهت صلاحية المخزن المؤقت الآن وقام بتحديث صحيح.

مضحك أنني استيقظت هذا الصباح ووجدت أن Opera قام بترقية أخرى. ربما سببت هذه الترقية الصارمة للمخزن المؤقت الكثير من المشاكل في أماكن أخرى أيضًا :slight_smile: .

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

لديّ نسختان من Discourse مُستضيفتان ذاتياً (self-hosted) هما حالياً خارج الخدمة. في السجلات، أرى أسطراً على النحو التالي:

I, [2026-09-03T06:02:41.640393 #80]  INFO -- : reaped unknown subprocess #<Process::Status: pid 3079826 exit 128>
I, [2026-09-03T06:03:10.006495 #80]  INFO -- : reaped unknown subprocess #<Process::Status: pid 3079864 exit 128>
I, [2026-09-03T06:03:10.394732 #80]  INFO -- : reaped unknown subprocess #<Process::Status: pid 3079871 exit 128>
E, [2026-09-03T06:03:10.518338 #722] ERROR -- : worker=0 gen=0 pid=722 timed out, exiting
I, [2026-09-03T06:03:10.530245 #722]  INFO -- : worker=0 gen=0 pid=722 exiting

يبدو رمز الخروج 128 مشبوهاً وكأنه خاص بـ Git.

هل يمكن أن يكون هذا متعلقاً بالأمر؟ وإذا كان كذلك، فلماذا يؤدي فشل عملية البحث في GitHub إلى توقف النسخة عن العمل؟

أتساءل عما إذا كان هذا متعلقًا :thinking:

مرحبًا،

يبدو أن المشكلة قد حُلّت الآن. واجهت أول عملية إعادة بناء خطأً، لكن المحاولة الثانية نجحت، وتم تحديث النظام، وعاد ديسكورس للعمل مجددًا. كما أن فحص الإصدار يعمل الآن أيضًا.