실패하거나 일부 적용된 업그레이드에서 복구

Discourse 인스턴스를 업그레이드하려고 했으나, 몇 가지 문제로 인해 일부 적용된 상태로 실패한 것 같습니다. ./launcher rebuild app을 실행하면 다음과 같은 오류 메시지가 표시되며, 이는 이미 (일부) 적용된 마이그레이션을 가리킵니다:

I, [2022-03-24T21:13:16.043071 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists

이 상황에서 복구할 방법이 있는지(아니면 아예 새로 설치해야 하는지) 조언을 주시면 감사하겠습니다. 감사합니다!

다음 명령을 실행하면

 ./launcher start app

이전 컨테이너를 시작할 수 있습니다. 이렇게 하면 다시 복구됩니다.

네, 그 부분은 알고 있습니다(그리고 그렇게 했습니다) - 하지만 업그레이드와 관련하여 다음 단계가 무엇인지 궁금합니다.

아. 그러면 도움이 안 됐네 :person_shrugging:

저도 비슷한 문제를 겪었지만, 제 해결책이 당신에게 도움이 될 것 같지는 않아요.

app.yml 파일에 SKIP_POST_DEPLOYMENT_MIGRATIONS가 설정되어 있지 않나요? 만약 설정되어 있다면, 이 값을 0으로 설정하고 데이터베이스를 마이그레이션한 후 다시 빌드해야 하지만, 당신의 문제는 그게 아닐 것 같아요.

아니, 그렇게 보이진 않네.

그렇게 생각했어요. 그래서 특정 지점에서 현재 지점으로 마이그레이션할 수 있는 능력과 관련된 실제 문제가 있을 수 있습니다. 하지만 그런 일은 일어나서는 안 됩니다.

이것을 확인해 보세요:

에러를 일으키던 테이블들을 하나씩 비웠습니다(결국 7개였습니다). 에러 없이 앱을 다시 빌드할 수 있을 때까지 그렇게 했죠.

당신의 경우, 문제는 컬럼인 것 같습니다:

PG::DuplicateColumn: ERROR: column "bookmarkable_id" of relation "bookmarks" already exists

어느 테이블에 속하는지 찾아서 비울 수 있도록 하거나, 해당 컬럼을 단순히 삭제하는 것이 좋을 것입니다.

부분적으로 마이그레이션을 수행할 때, 해당 테이블들이 이미 생성되어 있어 다시 생성할 수 없고 에러가 반환되는 것 같습니다. 이 과정에서 에러가 발생하지 않도록 조건문을 추가할 수 있지 않을까요? (저는 전문가가 아닙니다) @pfaffman

맞는 말인 것 같습니다, @undasein.

bookmarks 테이블에서 bookmarkable_id 컬럼을 제거하고 싶으신 것 같습니다. 먼저 다음과 같이 컨테이너에 접속한 후 postgres로 진입하세요:

cd /var/discourse
./launcher enter app
su - postgres
psql

그런 다음 아래 명령을 실행하면 됩니다:

ALTER TABLE bookmarks 
DROP COLUMN bookmarkable_id
DROP COLUMN bookmarkable_type;

하지만 포럼이 실행 중이라면 데이터베이스만 백업하는 것도 나쁘지 않은 방법입니다. 포럼이 실행 중이지 않다면, 위 enter app 명령 이후에 discourse backup으로 백업할 수 있습니다.

저도 같은 문제가 발생합니다! 이게 올바른 해결 방법인가요?

그렇게 추측했어요. 한번 시도해보고 알려주세요.

저는 디스커스(Forum software)에 익숙하지 않습니다.

@sam 앞으로 어떻게 진행해야 할지 아이디어가 있으신가요? 표준 설치와 업그레이드가 악몽 같은 일이었습니다.

위 방법으로 이 문제를 해결하는 것이 올바른 방법인가요?

감사합니다.

불행히도 작동하지 않았습니다. 여전히 다음과 같은 오류가 발생합니다.

PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists

위 명령어 이후에 추가로 실행해야 할 작업이 있었나요?

ALTER TABLE bookmarks 
DROP COLUMN bookmarkable_id
DROP COLUMN bookmarkable_type;

도움 주셔서 감사합니다.

닉, 안녕하세요.
이 문제를 재현해 보고 있는데, 현재 인스턴스의 커밋은 무엇인가요?
아래 커밋으로 시도해 볼 수 있습니다:

version: cd7ce52138bed391d5efc56366e7a6517a6079e7

app.yml 파일에 이 커밋을 사용하세요. 이 커밋은 10일 전 것으로, 비슷한 문제가 있었던 커밋을 되돌린 직후의 상태입니다.

벤, 안녕하세요.

이 작업을 수행하기 위한 명령어를 순서대로 알려주실 수 있을까요?

업데이트 같은 건 쉽게 할 수 있지만, 이렇게 문제가 생긴 건 처음이라 솔직히 제 역량 범위를 벗어나서 좀 당황스럽네요 ㅎㅎ

./launcher start app를 실행하고 https://your.domain/admin에서 설치된 버전을 확인해 주시겠어요? 그러면 제가 사용자님의 단계를 다시 추적해 볼 수 있습니다. 어떤 플러그인을 사용하고 계신가요?

Ben님, 안녕하세요.

설치된 버전: 2.9.0.beta2
(5374e587a3)

설치된 플러그인:
discourse-reactions
docker_manager
styleguide

감사합니다.
Nick

./launcher start app
-bash: ./launcher: No such file or directory
 cd /var/discourse

이전

./launcher start app

그래서 몇 가지 Ubuntu 업데이트가 있다는 걸 알아차렸고, 서버의 모든 것이 최신 상태가 되도록 업데이트했습니다.

다시 시도해 봤는데도 여전히

PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists

이것은 가능성이 높은 해결책으로 보입니다. 이 버전으로 업그레이드한 후 현재 버전을 설치할 수 있을지도 모르겠네요. 그런 식으로 진행하는 것이 제 생각에는 합리적으로 들립니다.