致命错误:无法读取 '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 错误。

我会试着去查看日志。

备注:目前磁盘空间还剩 5G,虽然通常升级时空间总是很紧张,但勉强还能应付。如果将磁盘空间翻倍,成本也会翻倍,而且我从未有时间将整个系统迁移到我自己的服务器上。

我试着查看日志,但只注意到大量的连接拒绝错误,例如:
/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 域名。

可能就是这样吧,听起来确实如此。

问题是从今天早些时候开始的,我猜大概是在 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 个站点,没有出现错误(磁盘空间不足的情况除外)。

这看起来像是通过命令行进行的升级,但即使不是,我也强烈建议使用这种方式。

5GB 并不“充足”,这仅仅勉强够构建一个新容器。你最近运行过 ./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 崩溃了(就是上面提到的那个 oops),因为它无法在 30 秒内访问 SSO。应用不得不重新启动,但我实际上不确定 Discourse 是否在我重新启动之前一直处于宕机状态(我当时处于恐慌模式 :wink: )。不过,Gemini 根据日志让我在 sso/rails/redis 等方面打转。这发生在我尝试升级之后,但为了保持连贯性,我把它归在这个点下。
4*) 由于我无法弄清楚哪里出了问题,我重启了 Linux 以防万一,并开始升级 Discourse。由于 GitHub 的问题,升级失败了。是的,和往常一样,我不得不先清理一点磁盘空间,但我从未达到 0G,那本也可以是导致 Redis 问题的一个原因。是的,第二,既然现在看起来稳定了,我会在云端增加 10G,也许还有 Arkshine 升级。
5*) 有点像第一个问题,但在试图解决所有这一切时,我不断强制刷新页面,看看是否有什么地方被修复了。我猜我一直都在命中初始故障时的缓存重定向,这意味着我甚至无法看到问题是否已经修复,即使在第一次重新启动之后。

  1. 我可以正常访问我的 SSO。
  2. 另一个不使用 SSO 的域名网站也运行良好。
  3. 禁用 Discourse 的 SSO 后,论坛显示出来了,但我从未让普通登录正常工作过,所以这没什么帮助。但至少我现在知道确实是 SSO 搞乱了事情。
  4. Gemini 建议我在私密窗口中测试,所以我实际上启动了 Firefox,结果,论坛运行得很好。太好了,除了……什么?
  5. Opera 仍然失败。是的,我怀疑它仍在缓存重定向,但这不是我当时知道的事情。我还没有清除站点 Cookie、缓存等。
  6. 既然事情能正常工作,我用 Firefox 做了我原本打算做的必要工作,花了半个小时。
  7. 重启了 Opera,嘿,论坛显示出来了。我可能更早重启过 Opera,记不清了,但也许缓存现在超时了,并进行了正确的刷新。

有趣的是,今天早上我醒来时,Opera 又进行了一次升级。也许这个硬缓存升级在其他地方也造成了很多问题 :slight_smile:

补充说明:第 3 点当然是对我们来说最有趣的部分。也许还可以从日志中找到它(如果需要,我可以深入挖掘)。如果 Discourse 崩溃了,它会尝试使用某种定时器重新启动吗?还是说整个网站在我登录并重新启动应用之前都处于宕机状态?

我有两个自托管的 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 的错误代码。

这与 Git 有关吗?如果是的话,为什么 GitHub 查询失败会导致实例宕机?

我在想这是否与此有关🤔

你好,

现在似乎可以正常工作了。第一次重新构建时遇到了一个错误,但第二次尝试后更新成功,Discourse 也重新上线了。版本检查现在也正常了。