업그레이드 오류, 부트스트랩 실패

안녕하세요! 최근 업데이트에서 문제가 발생했습니다:

FAILED -------------------- Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ 실패, 반환 값: #<Process::Status: pid 690 exit 1> 실패 위치: /usr/local/lib/ruby/gems/2.7.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn’
파라미터 {“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}로 실행이 실패했습니다.
7027ff0ccd166f831f9728472676ad91704fdd4caa6833a219d44697e740acdc ** 부트스트랩 실패 ** 위로 스크롤하여 이전 오류 메시지를 확인해 주세요. 오류가 여러 개 있을 수 있습니다.
./discourse-doctor 도구가 문제를 진단하는 데 도움이 될 수 있습니다.

Sidekiq도 중단되었습니다.

도움 주실 분 계신가요? 감사합니다!!

참고: 사이트는 llastres.com입니다.

메시지에 적힌 대로 해주시겠어요?

문제 해결을 위해 전체 로그가 필요합니다.

네, 어떻게 식별할 수 있을까요? "error"라는 단어를 검색하는 건가요? 로그를 실행하는 방법을 알려주시면 첨부하겠습니다. 서버 사용은 처음입니다. 도움을 주셔서 정말 감사합니다.

수정: 이것을 찾았습니다:

Caused by:                                              
PG::DuplicateTable: ERROR:  relation "discourse_reactions_reactions" already exists

app.yml 파일을 공유해 주시겠어요?

죄송합니다, 직장에 있었습니다. 제 app.yml 파일은 다음과 같습니다:

## 이것은 올인원, 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다
##
## 이 파일을 변경한 후에는 반드시 재빌드해야 합니다
## /var/discourse/launcher rebuild app
##
## 편집할 때 *매우* 주의하세요!
## YAML 파일은 공백이나 정렬 실수에 매우 민감합니다!
## 필요할 경우 http://www.yamllint.com/에서 이 파일을 검증하세요

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Lets Encrypt(https)를 추가하려면 아래 두 줄의 주석을 해제하세요
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## 이 컨테이너는 어떤 TCP/IP 포트를 노출해야 하나요?
## Discourse가 Apache나 nginx 같은 다른 웹서버와 포트를 공유하려면
## https://meta.discourse.org/t/17247 를 참조하세요
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.spanish"

  ## db_shared_buffers는 총 메모리의 최대 25%로 설정하세요.
  ## bootstrap이 감지된 RAM에 따라 자동으로 설정하거나, 직접 덮어쓸 수 있습니다
  db_shared_buffers: "2048MB"

  ## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다
  #db_work_mem: "40MB"

  ## 이 컨테이너는 어떤 Git 리비전을 사용해야 하나요? (기본값: tests-passed)
  #version: tests-passed

env:
  LC_ALL: es_ES.UTF-8
  LANG: es_ES.UTF-8
  LANGUAGE: es_ES.UTF-8
  DISCOURSE_DEFAULT_LOCALE: es

  ## 동시에 처리할 수 있는 웹 요청은 얼마나 많나요? 메모리와 CPU 코어 수에 따라 달라집니다.
  ## bootstrap이 감지된 CPU에 따라 자동으로 설정하거나, 직접 덮어쓸 수 있습니다
  UNICORN_WORKERS: 8

  ## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
  ## 필수 항목입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.
  DISCOURSE_HOSTNAME: EDITED

  ## 컨테이너가 위에서 지정한 도메인 이름(-h 옵션)과 동일한 이름으로 시작되도록 하려면
  ## 주석을 해제하세요 (기본값 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 초기 가입 시 관리자 및 개발자로 설정할 쉼표로 구분된 이메일 목록
  ## 예: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'EDITED'

  ## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
  # SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
  # 경고: SMTP 비밀번호의 '#' 문자는 문제를 일으킬 수 있습니다!
  DISCOURSE_SMTP_ADDRESS: EDITED
  DISCOURSE_SMTP_PORT: EDITED
  DISCOURSE_SMTP_USER_NAME: EDITED
  DISCOURSE_SMTP_PASSWORD: EDITED
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)
  DISCOURSE_SMTP_DOMAIN: EDITED
  DISCOURSE_NOTIFICATION_EMAIL: EDITED

  ## Lets Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 받으려면 아래 주석을 해제하세요
  LETSENCRYPT_ACCOUNT_EMAIL: EDITED

  ## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (pull 설정)
  ## https://meta.discourse.org/t/14857 를 참조하세요
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## IP 주소 조회를 위한 maxmind 지리 위치 IP 주소 키
  ## https://meta.discourse.org/t/-/137387/23 를 참조하세요
  DISCOURSE_MAXMIND_LICENSE_KEY: EDITED

## Docker 컨테이너는 상태(stateless)를 가지지 않으며, 모든 데이터는 /shared에 저장됩니다
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 플러그인은 여기에 추가합니다
## https://meta.discourse.org/t/19157 를 참조하세요
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-reactions
## 빌드 후 실행할 모든 커스텀 명령
run:
  - exec: echo "Beginning of custom commands"
  ## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
  ## 첫 가입 이메일을 받은 후, 해당 줄의 주석을 다시 달아두세요. 한 번만 실행하면 됩니다.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

사실 저는 업데이트에 문제가 생긴 적이 한 번도 없습니다. 이상한 조작을 한 것도 아니고, 그냥 시스템을 업데이트했을 뿐인데 오류가 발생했다는 경고가 떴습니다.

전체 로그는 다음과 같습니다:

2021년 5월의 마이그레이션을 실행하는 데 문제가 발생하고 있습니다. 이 사이트가 어느 시점에 릴리스 채널(베타/안정판/테스트 통과) 사이에서 이동되었거나 백업에서 복원된 적이 있습니까?

그 날짜(5월 21일)에 mybb에서 이주한 것 같다는 기억이 납니다.

오늘 초에 만든 백업을 복원해서 오류가 발생하기 전의 정상적인 상태를 복원해 보려 했지만, 시작 버튼을 클릭하자 오류 화면이 나타났습니다.

번역기를 사용해서 쓰는 중이라 문장이 이상하게 느껴질 수 있으니 양해 부탁드립니다.

아직 해결책을 찾지 못했고, 포럼도 여전히 접속이 안 되네요. 다음으로 어떻게 해야 할지 아이디어가 있으신가요? 감사합니다!!

업그레이드 후 포럼이 다운되었습니다. 업데이트 과정 자체는 문제없이 진행되는 것 같았는데, 포럼 페이지에 접속하니 화면이 하얗게 비어 있었습니다.

수동으로 업데이트를 진행했더니 포럼이 정상적으로 작동했습니다. 이 정보가 도움이 될지 모르겠지만 공유드립니다.

답장 주셔서 감사합니다. 제 문제는 포럼 마이그레이션과 관련된 데이터베이스 오류와 관련이 있는 것 같습니다. 앱 재구성이 작동하지 않습니다.

FAQ와 매뉴얼을 확인해 보았지만, 해결책을 찾을 수 없습니다.

오류 발생 이전(이라고 생각되는) 시점의 백업이 몇 개 있지만, 앱이 실행되지 않아 복원할 수 없습니다. 모든 것을 삭제하고 클린 설치한 후 백업을 불러오는 것 외에는 방법이 떠오르지 않습니다…

백업은 가지고 있지만, 앱을 실행할 수 없어서(백업을 복원하려면 앱이 필요한데) 백업을 복원할 수 없는 상황입니다. 제가 할 수 있는 다른 방법이 있을까요? Docker를 삭제하고 처음부터 다시 시작하는 것 외에는 대안이 없는 것 같습니다.

비슷한 문제를 다루는 주제로는 Unable to login into discourse suddenly - #8 by Tarek_Khalil 이 유일했는데, 거기서 제안된 해결책은 마이그레이션 사고가 발생하기 이전의 백업으로 복구하라는 것이었습니다. 다만, 해당 사고가 꽤 오래전 일인 점을 고려하면 여러분의 상황에 최선의 선택은 아닐 수 있습니다.

데이터베이스 오류는 제 전문 분야가 아닙니다. @pfaffman님과 @RGJ님은 이런 문제에 대해 보통 매우 잘 알고 계십니다(다만, 이전에 비슷한 사례를 접해 보셨는지는 모르겠습니다). 혹시 이런 상황에 대한 비법이나 해결책이 있으신가요?

해야 할 일은 postgres에 접속해서 해당 테이블을 삭제하는 것입니다.

대략적인 과정은 다음과 같습니다.

./launcher enter app 
sudo postgres
psql 
drop table the_table _mentioned above ;

그렇게 하면 업그레이드를 실행할 수 있어야 합니다.

수정: 하지만 만에 하나를 대비해 먼저 데이터베이스만 백업하는 것이 좋습니다!

죄송합니다. 저는 리눅스 서버와 명령어를 사용하는 데 익숙하지 않습니다. 앱이 실행되지 않고 있어서 다음과 같이 시도해 보았습니다.

./launcher start app
x86_64 arch detected.                                                                                           starting up existing container                          
+ /usr/bin/docker start app
app

그 후:

./launcher enter app

그리고 나서, 말씀해 주신 대로 진행했는데 첫 번째 오류가 발생했습니다:

sudo postgres            
sudo: postgres: command not found

psql을 입력하면:

psql: error: FATAL: database "root" does not exist

죄송합니다. 지금 휴대폰으로 작성 중이라 제대로 설명을 못 하고 있네요…

앱을 시작하고 나서

su - postgres 
psql discourse 

그리고 나서

 drop table discourse_reactions_reactions ;

이 명령을 입력하고, 마지막으로 exit를 입력하거나 control-d를 몇 번 눌러서 모든 셸에서 빠져나오면 됩니다.

감사합니다! 테이블을 비우면 다른 테이블에서 오류가 발생합니다. 이미 약 3개의 테이블을 비웠습니다… 이렇게 하나씩 계속 진행해야 할까요? 도움을 주셔서 정말 감사합니다.

흠. 백업을 해두셨길 바라지만, 어쩌면? 마이그레이션이 이렇게나 어긋나 있다는 건 말이 안 되는데.

제가 직접 답을 찾았습니다. 7개의 테이블(discourse_reactions_reactions, directory_columns, external_upload_stubs, associated_groups, user_associated_groups, group_associated_groups, discourse_reactions_reaction_users)을 비운 후 사이트가 정상적으로 작동하고 있습니다. 마지막 백업도 복구했습니다!

도와주신 모든 분들께 감사드립니다. 좋은 주말 보내세요 :slight_smile:

하지만 최신 버전으로 업그레이드할 수 있었나요?