Discourse 업그레이드 오류 "FAILED TO BOOTSTRAP"

안녕하세요 모두,

여기 첫 게시글입니다. 미리 감사드립니다. Discourse 기반 포럼( https://forum.troygrady.com )에서 예정되어 있었지만 다소 늦어진 정기 업그레이드를 진행하던 중, 화면에 표시된 안내에 따라 터미널에서 "git pull"과 “rebuild” 단계를 실행한 후 업그레이드가 실패하는 지점에 도달했습니다.

아래는 “./launcher rebuild app” 명령어의 출력 결과입니다. 또한 “discourse doctor” 스크립트도 실행했는데, 보안상의 우려가 크지 않다고 판단하신다면 해당 출력 결과를 게시하거나 링크를 전달할 수도 있습니다.

참고로 저는 PHP/SQL 개발자로 상당한 역량을 갖추고 있으며 가끔 리눅스 애플리케이션 관리 경험을 가지고 있지만, Discourse 자체에 대해서는 전혀 기술적 지식이 없습니다. 또한 초기 설치를 한 사람도 저가 아닙니다. 다들 아시는 그 상황인 셈이죠!

저는 단순히 화면의 안내에 따르고 있을 뿐입니다. 안내는 Docker UI에서 파란색 “업그레이드” 버튼을 클릭하는 것으로 시작되었습니다. 해당 과정이 완료된 후, 터미널에 로그인하여 git pull과 launcher rebuild를 실행하라는 화면 안내를 확인했습니다. 그렇게 해서 현재 지점까지 왔습니다.

추가로, 이번 업그레이드 전까지 포럼은 아무런 문제 없이 완벽하게 작동하고 있었습니다. 만약 진단에 도움이 된다면 참고해 주세요. 이번 업그레이드를 진행하는 이유는 단순히 여러분이 출시하는 최신 업데이트를 따라가서 너무 오래된 버전으로 남지 않기 위해서일 뿐입니다. 이것이 저의 "안 망가진 건 고치지 마라(ain’t broke, don’t fix it)"라는 사고방식의 핵심적인 갈등 지점입니다. 업그레이드가 제 능력으로 해결할 수 없는 오류를 일으킬까 두려웠습니다. 그리고 결국 이런 상황이 되고 말았네요.

이 글을 쓰는 시점 현재 포럼은 완전히 오프라인 상태입니다. 포럼은 저희 비즈니스의 핵심 구성 요소이므로 가능한 한 빨리 다시 가동하고 싶습니다.

어떤 조언이나 통찰도 감사히 받겠습니다!

–

FAILED

Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ failed with return #<Process::Status: pid 3972 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn’
exec failed with the params {“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}
f89318158c2c276c69a60d600def8a838ae4ad4bc7bafbe665fb1cd77c130ad1
** 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.

안녕하세요, 디스코커스 커뮤니티에 오신 것을 환영합니다.

어디에 설치 중이신가요? 어떤 운영체제를 사용하시나요? 공식 가이드를 따르고 계신가요?

사실 이전의 오류 메시지가 있을 수 있습니다. 데이터베이스(서버)에 접근할 수 없는 것 같습니다.

다시 포럼이 정상적으로 작동하게 되면, 관리형 호스팅을 고려해 보시는 것이 좋을 것 같습니다…

가빈님! 빠른 답변 감사합니다. Digital Ocean의 Droplet을 사용 중인데, 로그인하면 다음과 같이 표시됩니다:

Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-210-generic x86_64)

공식 가이드를 사용했는지에 대해서는 말씀드리기 어렵습니다. 이 설치 환경은 처음 설정한 사람이 저가 아니긴 하지만, 3~4년 동안 문제없이 운영해 온 것입니다. 지금까지는 브라우저 내 업그레이드와 가끔씩의 커맨드라인 리빌드만 필요했고, 그 외에는 우리의 특별한 개입 없이 모두 잘 작동해 왔습니다.

리빌드 과정의 터미널 출력 전체를 파일로 저장해 두었으니 그 내용을 살펴볼 수 있습니다. 하지만 우리는 가상 Droplet 환경을 사용하고 있으며, 설정 이후로 아무것도 변경하지 않았습니다. 사실 Discourse가 브라우저 내 업그레이드로 잘 작동하기 때문에 우리는 거의 로그인하지 않습니다. 그래서 갑자기 데이터베이스에 접근할 수 없게 된 원인이 무엇인지 확신할 수 없습니다.

물론입니다. 수년 동안 문제없이 작동해 온 상황이라, 우리가 변경을 원하지 않는다고 굳이 억지를 부릴 이유는 없습니다. 하지만 제가 직접 하는 대신, 설치된 환경을 가끔 점검하고 최신 상태인지 확인해 줄 전문가를 고용하는 것은 기꺼이 고려해 보겠습니다. 이런 일을 할 의향이 있는 Discourse 전문가를 찾을 수 있는 리소스나 디렉토리가 있을까요?

감사합니다!

그 부분을 업데이트해야 합니다. 너무 오래되었거든요. 정말 오래됐습니다.

하지만 일단 시스템을 정상적으로 구동하는 것부터 시작해 봅시다. 에러 로그를 올려 주실 수 있나요? 실제 에러가 무엇인지 확인해야 합니다.

좋습니다, 재빌드 출력에서 경고와 오류를 검색해 보았습니다. 아래는 제가 찾은 내용입니다.

–

227:initdb: warning: enabling “trust” authentication for local connections
294:update-alternatives: warning: forcing reinstallation of alternative /usr/share/postgresql/13/man/man1/psql.1.gz because link group psql.1.gz is broken
324:update-alternatives: warning: forcing reinstallation of alternative /usr/share/postgresql/13/man/man1/postmaster.1.gz because link group postmaster.1.gz is broken

–

1684:createdb: error: database creation failed: ERROR: database “discourse” already exists
1811:I, [2021-08-29T20:18:40.246150 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
1813:I, [2021-08-29T20:18:40.253584 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
2563:StandardError: An error has occurred, this and all later migrations canceled:
2698:-- add_column(:groups, :imap_last_error, :text)
2961:** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
3118:createdb: error: database creation failed: ERROR: database “discourse” already exists
3245:I, [2021-08-29T20:22:40.262592 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
3247:I, [2021-08-29T20:22:40.274767 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
3960:StandardError: An error has occurred, this and all later migrations canceled:
4087:** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
4224:/error – search for the word ‘error’
4358:createdb: error: database creation failed: ERROR: database “discourse” already exists
4485:I, [2021-08-29T20:26:59.373901 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
4487:I, [2021-08-29T20:26:59.381142 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
5200:StandardError: An error has occurred, this and all later migrations canceled:
5327:** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

게이빈, 이 문제를 살펴봐 주셔서 다시 한번 감사드립니다. 그리고 OS 업그레이드를 방치한 점 죄송합니다.

위 내용은 스크립트 출력에서 "error"와 "warning"이라는 단어를 grep으로 검색했을 때 나온 결과일 뿐이며, 전체 출력은 여기에 저장해 두었습니다. 그 출력에서 추가로 확인해야 할 부분이 있다면 알려 주세요. 기꺼이 공유하겠습니다.

아, 죄송합니다. 방금 출력 내용이 설명이 부족하다는 점을 깨달았습니다. “StandardError” 메시지에 대한 세부 정보를 여기에 첨부합니다. 중복 키 때문에 INSERT 쿼리가 실패한 것으로 보입니다. 가독성을 위해 쿼리 본문은 생략했는데, 필요하시면 포함할 수 있습니다.

–

I, [2021-08-29T20:23:37.257772 #1] INFO – : > cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse ERROR: duplicate key value violates unique constraint “data_explorer_queries_pkey”
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse DETAIL: Key (id)=(-2) already exists.
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse STATEMENT: INSERT INTO
[…]
FROM plugin_store_rows
WHERE plugin_name = ‘discourse-data-explorer’ AND type_name = ‘JSON’

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

ERROR: duplicate key value violates unique constraint “data_explorer_queries_pkey”
DETAIL: Key (id)=(-2) already exists.

이것을 시도해 보세요

네, 그렇게 하면 됩니다(확인하셨듯이).

업그레이드 과정에서 뭔가 문제가 발생했습니다.

#marketplace에 요구 사항을 게시하거나, 그곳에서 정기적으로 답변을 남기는 사람들을 살펴보시면 됩니다.

discourse가 다시 정상 작동하기 시작하면 다음 단계를 수행하기만 하면 됩니다.

  • discourse 백업
  • 백업 다운로드
  • droplet 업데이트
  • 앱 재구축

이렇게 하면 몇 년 동안 더 문제없이 사용할 수 있을 거예요.

좋아요, 감사합니다.

제가 이해한 바로는, "data explorer"라는 플러그인이 사용하는 데이터베이스 테이블에 중복된 행이 하나 있고, 그 중복된 행을 삭제하면 재구축 스크립트가 진행될 수 있는 것 같습니다. 해당 스레드를 보면 이 오류 — 또는 비슷한 오류 —가 이전에 여러 번 발생했으며, Discourse에 이를 방지하기 위한 업데이트가 있었을 수도 있다는 내용도 포함되어 있습니다. 즉, 앞으로 진행할 업그레이드에서는 이 문제가 발생하지 않을 수 있다는 뜻입니다.

제가 이렇게 이해하는 것이 맞는지 확인해 주시면 좋겠습니다!

Ubuntu 업그레이드를 말씀하시는 건가요? 그렇다면 알겠습니다.

맞습니다.

다시 한번 맞습니다 :slight_smile:

네 :smiley:

좋아요! 이제 진행할 일이 명확해졌네요. 빠른 피드백 주셔서 정말 감사합니다.

이 에러를 마주하는 분들을 위해, 이번 사건의 결론을 간단히 정리해 보겠습니다.

업그레이드 자체와 관련하여, “data_explorer” 플러그인에 존재하던 중복된 행이 문제를 일으키고 있어 이를 제거해야 했습니다.

그 과정에서 Ubuntu 16에서 20으로의 OS 업그레이드도 함께 진행했는데, 이로 인해 네트워크 오류가 발생하여 재부팅 후 Digital Ocean 드롭렛에 접속할 수 없게 되었습니다. 구체적으로, OS가 새로운 “Netplan” 설정으로 전환되는 과정에서 설정 파일의 일부가 네트워크 인터페이스 부트 스크립트가 실행되는 시점에 정상적으로 완료되지 못하도록 막고 있었던 것으로 보입니다. 결국 드롭렛은 기동했지만 네트워크만 연결되지 않은 상태였습니다. 이후 브라우저 기반 복구 콘솔을 통해 접속하여 네트워크 인터페이스 스크립트를 한 번 더 실행하자 인터페이스가 활성화되고 외부에서 다시 접속할 수 있게 되었습니다. 드롭렛을 재부팅하지 않는 한, netplan 설정에 대한 수정 사항을 찾아 테스트할 시간을 확보할 때까지는 문제가 없을 것입니다.

아마도 이는 매우 드문 예외적인 경우일 것입니다. 어딘가에서 OS 업그레이드는 일반적으로 문제를 일으키지 않는다고 읽은 기억이 나거든요. 대부분의 경우 사실일지 모르지만, 이번에는 그렇지 않았고, 시간대가 맞물려 고용한 기술 지원 인력이 시스템 복구 작업을 시작할 수 있을 때까지 약 반나절 동안 오프라인 상태에 머물러 있었습니다.

지금으로서는 모든 문제가 해결되었습니다. 빠른 피드백을 주신 모든 분들께 감사드립니다.