Fatal: не удалось прочитать имя пользователя для '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.

Попробую посмотреть логи.

Примечание: Также у меня осталось приличное место на диске — 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)

Думаю, это как-то связано?

Я не могу обновить свои компоненты на форуме, и при пересборке получаю неожиданное:

./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.

Скорее всего, так и есть. По ощущениям именно так.

Это началось сегодня утром, и я бы предположил, что проблема появилась, когда Voice был добавлен в ядро. Но это просто моё ощущение.

Придётся просто подождать :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 точках отказа.
После четырёх часов расследования где-то в полночь это уже не так весело. Часть информации, вероятно, технически неточна, но так текст читается интереснее, пусть и с возможными ошибками.

Базовые факты (извините за пояснения): мой 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*) Поскольку я не мог понять, что пошло не так, я просто перезагрузил Linux «на всякий случай» и начал обновлять Discourse. Это не удалось из-за проблемы с GitHub. И да, сначала пришлось немного почистить диски, как обычно, но я никогда не доходил до 0 ГБ, что могло бы стать возможной причиной проблем с redis. И да, теперь, когда всё кажется стабильным, я добавлю 10 ГБ в облаке и, возможно, обновлю Arkshine.
5*) Это, так сказать, та же самая проблема, что и в пункте 1, но пока я пытался решить все эти вопросы, я постоянно делал жёсткое обновление страницы, чтобы проверить, не починилось ли что-нибудь. Я подозреваю, что я постоянно сталкиваюсь с закэшированным перенаправлением от первоначального сбоя, что означает, что я даже не могу увидеть, решена ли проблема, даже после первого перезапуска.

  1. Я могу нормально получить доступ к моему SSO.
  2. Другой сайт с другим доменом, не использующий SSO, тоже работает нормально.
  3. Отключение SSO для Discourse показывает форум, но у меня никогда не работали обычные логины, так что это не очень помогает. Но хотя бы теперь я знаю, что проблема действительно в SSO.
  4. Gemini предложил протестировать в режиме инкогнито, так что я запустил Firefox, и, что за…, форум работает просто отлично. Отлично, кроме… чего?
  5. Opera по-прежнему не работает. Да, я подозреваю, что она всё ещё кэширует перенаправление, но тогда я этого не знал. Я пока не собираюсь очищать куки сайта, кэш и т.д.
  6. Поскольку всё заработало, я проделал необходимую работу, которую на самом деле собирался делать, используя Firefox в течение получаса.
  7. Перезапустил Opera, и, вуаля, форум отобразился. Возможно, я перезапускал Opera раньше, не помню, но, может быть, кэш просто истёк, и произошло правильное обновление.

Смешно, но сегодня утром я проснулся, и Opera снова обновилась. Может быть, это обновление с жёстким кэшированием создало много проблем и в других местах :slight_smile: .

Дополнительное примечание: пункт 3) — это, конечно, самая интересная часть для нас. Возможно, это всё ещё можно найти в логах (могу покопаться, если нужно). Если Discourse падает, пытается ли он перезапуститься с помощью какого-то таймера? Или весь сайт был недоступен, пока я не зашёл и не перезапустил приложение?

У меня две self-hosted-инстанции Discourse, которые в данный момент недоступны. В логах я вижу строки такого вида:

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:

Привет,

похоже, теперь всё работает. Первая пересборка завершилась с ошибкой, но при второй попытке обновление прошло успешно, и discourse снова в сети. Проверка версии тоже работает.