Fatal: 'https://github.com'의 사용자를 읽을 수 없음

2컨테이너 포럼 업그레이드를 시도했는데 실패했습니다. 원인이 무엇일까요?

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 오류가 발생했어요.

이건 처음 보는 현상이에요. 그래서 로그인한 뒤 재부팅을 하면서 무슨 일이 일어나고 있는지 검색해 보았죠.

효과가 없었어요. 음, 새 유저들이 계속 들어오고 있어서 사이트가 다운될 수는 없거든요. 그래서 몇 달 동안 업그레이드를 하지 않았어요. 하지만 최소한 앱을 재빌드(rebuild)해야 할 것 같습니다.

그러면 사용자 이름(username) 관련 질문에서 실패하더군요.

./discourse-doctor도 시도해 봤지만 결국 같은 GitHub 오류가 나왔어요.

로그를 확인해 볼게요.

참고: 디스크 공간이 아직 5G는 남아 있지만, 보통은 간신히 업그레이드할 정도로 여유가 없었어요. 디스크 공간을 두 배로 늘리면 비용도 두 배가 되는데, 전체를 제 서버로 옮길 시간은 한 번도 없었거든요.

로그를 살펴봤는데, 다음과 같은 연결 거부(connection refused)가 많이 눈에 띄었어요:
/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)

단순히 SSO가 원인인 줄 알고 Gemini에게 추측을 시키며 2시간을 보냈더니 Oops 오류가 발생했어요(Opera 브라우저에서). 이것저것 수백만 번 시도해 보고 나서야 Firefox에서 테스트해 보니 모든 것이 정상으로 작동하더군요. 제 SSO가 리다이렉트를 사용하는데, 아마 오늘 Opera 업데이트에 301/302 관련 변경 사항이 들어간 것 같습니다.
하지만 사용자 이름이 해결되길 기다리고 있어요. 지금 업그레이드하고 싶진 않거든요. 이런 식으로 장애가 나는 것만으로 사이트가 다운될 수는 없으니까요. 그래도 클라우드에 디스크 공간을 10G는 더 추가할 겁니다 :smiley: . 아, 그리고 지금 당장 사이트 백업을 꼭 해야겠어요! :smiley:

아마 관련이 있을 것 같습니다.

포럼에서 컴포넌트를 업데이트할 수 없으며, 재빌드 시 예상치 못한 결과가 표시됩니다.

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

이제 정말 2-컨테이너 솔루션이 마음에 드네요…

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가 30초 내에 SSO에 접근할 수 없어 충돌했습니다 (위에서 언급한 오ops). 앱을 재시작해야 했지만, 실제로는 재시작 전까지 Discourse가 다운되어 있었는지, 아니면 재시작 후에도 계속 다운되어 있었는지 정확히 확신하지 못합니다 (패닉 모드였거든요 :wink: ). 하지만 로그를 근거로 Gemini가 SSO/rails/redis 등을 계속 돌게 했습니다. 이는 제가 업그레이드를 시도한 후였는데, 일관성을 유지하기 위해 이 항목 아래에 언급합니다.
4*) 무엇이 잘못되고 있는지 파악할 수 없어, 혹시 모르니 Linux를 재부팅하고 Discourse 업그레이드를 시작했습니다. 그런데 GitHub 문제로 인해 실패했습니다. 그리고 네, 평소처럼 먼저 디스크를 조금 정리해야 했지만, Redis 문제의 원인이 될 수 있는 0G까지 가본 적은 없습니다. 그리고 네, II, 상황이 안정적으로 보이다 보니 클라우드에 10G를 추가하고 아마도 Arkshine 업그레이드도 할 것입니다.
5*) 1번 문제와 비슷하지만, 이 모든 것을 해결하려고 시도하면서 무언가 어딘가에서 수정되었는지 확인하기 위해 계속 페이지를 하드 리프레시했습니다. 초기 실패에서 캐시된 리디렉션을 계속 만나고 있는 것 같습니다. 즉, 첫 번째 재시작 후에도 문제가 수정되었는지조차 볼 수 없다는 뜻입니다.

  1. 제 SSO에는 정상적으로 접근할 수 있습니다.
  2. SSO를 사용하지 않는 다른 도메인 사이트도 잘 작동합니다.
  3. Discourse에서 SSO를 비활성화하면 포럼이 표시되지만, 저는 일반 로그인이 정상적으로 작동해 본 적이 없어서 거기서 큰 도움은 되지 않습니다. 하지만 적어도 SSO가 문제를 일으키고 있다는 것은 확실히 알게 되었습니다.
  4. Gemini가 개인 창에서 테스트해 보라고 제안해서 실제로 Firefox를 켜봤더니, 어라, 포럼이 정상적으로 작동합니다. 좋긴 한데… 뭐야?
  5. Opera는 여전히 실패합니다. 네, 여전히 리디렉션이 캐시되고 있다고 의심하지만, 당시에는 몰랐습니다. 아직 사이트 쿠키, 캐시 등을 지우지는 않았습니다.
  6. 상황이 작동하니, 실제로 하려던 작업을 Firefox로 30분 동안 수행했습니다.
  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과 관련이 있는 것처럼 보입니다.

이것이 관련이 있을까요? 그리고 만약 그렇다면, 왜 GitHub 조회 실패가 인스턴스 다운을 초래하는 것일까요?

이것이 관련이 있는 것 같기도 해요 :thinking:

안녕하세요,

이제 작동하는 것 같습니다. 첫 번째 재구축 시 오류가 발생했지만, 두 번째 시도 후 업데이트가 정상적으로 이루어졌고 Discourse가 다시 온라인 상태입니다. 버전 확인도 이제 정상적으로 작동합니다.