실수로 업데이트했는데 일부 설정이 사라지거나 깨졌습니다

솔직히 말씀드리면, 저희가 자체 호스팅한 Discourse 설치 환경에 수동으로 유지보수를 한 지가 아주 오래되었고, 처음 세팅을 한 사람은 다른 사람이었습니다.

SendGrid가 기본 인증(basic auth)에서 API 키로 전환을 요구하기 때문에 SMTP 인증 정보를 변경해야 했습니다.

다음 문서를 찾았습니다: Discourse에 권장되는 이메일 제공업체

해당 문서에는 다음과 같이 적혀 있습니다:

현재 이메일 서비스를 변경하려면 ./discourse-setup 명령도 실행해야 합니다(이 과정에서 포럼이 재빌드되는 동안 몇 분간 오프라인 상태가 됩니다).

해당 명령을 실행하고 예상대로 질문에 답변한 결과, 표준 출력(stdout)으로 약 2,000줄의 출력이 발생했으며, 마지막에는 다음과 같은 내용이 표시되었습니다:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 10 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

./launcher rebuild app
-------------------------------------------------------------------------------------

cfd4df26701b4b4cd4a4202f30a9c8165a1ba609c921bffc25f250f52fee6cbe

솔직히 이 과정이 소프트웨어를 "업그레이드"할 것이라고는 기대하지 않았습니다. 단순히 SMTP 인증 정보만 변경하려 했을 뿐입니다. 하지만 사이트가 자동으로 다시 시작되지 않아, 텍스트에 "업그레이드를 완료하려면"이라고 적힌 대로 다음 명령을 실행했습니다:

./launcher rebuild app

이로 인해 표준 출력으로 약 8,000줄의 출력이 더 발생했습니다. 결국 사이트는 다시 올라왔지만, 이전과 같은 모습이 아닙니다:

  • 로고가 사라지고 “Discourse” 기본 로고로 대체되었습니다.
  • 사용자 아바타 이미지가 깨져 있었습니다. 나중에 다시 정상 작동하기 시작했습니다.
  • 게시글 내 이미지와 카테고리 로고가 깨져 있습니다. 여전히 작동하지 않습니다. ./discourse/share 디렉터리와 S3 버킷(URL이 이미지를 찾도록 설정된 곳)에서 파일명이 일치하는 이미지를 찾아보았지만 존재하지 않습니다.
  • “latest” 페이지에서 숨겨두었던 “support” 카테고리의 게시글이 다시 해당 페이지에 표시되고 있습니다.
  • “support” 카테고리가 “categories” 페이지에 더 이상 표시되지 않습니다.
  • “categories” 페이지가 이제 2열 레이아웃으로 바뀌었습니다. 왼쪽에 카테고리, 오른쪽에 "latest"가 표시되는데, 이전에는 단순히 카테고리 목록만 있었던 것 같습니다.
  • + New Topic 버튼의 + 기호 색상이 흰색에서 회색으로 변경되었습니다.

이 시점에서 일부 설정이 손실된 것으로 의심됩니다. 하지만 모든 게시글은 온전히 남아 있습니다. 또한 Discourse가 자체적으로 업그레이드되었을 것(어떤 버전에서인지 모르지만, 아마도 아주 많은 버전이 건너뛰었을 것입니다)이라고 추정하며, 이로 인해 기본 설정, CSS, 템플릿 등이 변경되어 위에서 나열된 문제들이 발생했을 것으로 보입니다.

소스 코드를 확인해보니 현재 버전은 2.6.0.beta6으로, apparently 7일 전에만 출시된 버전이었습니다.

따라서 제 질문은 다음과 같습니다:

  • SMTP 인증 정보와 같은 단순한 설정 변경을 적용하기 위해 소프트웨어를 이렇게 완전히 업그레이드해야 하는 것이 정상적인가요?
  • 소프트웨어 전체를 업그레이드하지 않고 설정을 변경하거나 보안 업데이트를 적용하는 방법이 있나요?
  • 제 이미지는 어디에 있으며, 왜 URL이 변경되어 더 이상 접근할 수 없게 되었나요?
  • 이 일어난 일 이후에 작성된 새 게시글을 잃지 않고 롤백할 방법이 있나요? 이전에 어떤 버전을 사용했는지조차 알지 못합니다. S3에 Discourse 백업(gzipped SQL 덤프)은 가지고 있습니다.
  • + New Topic 버튼 색상, 숨김/표시 설정된 “support” 카테고리 같은 것들을 수정하려면 모든 설정과 커스터마이징을 수동으로 다시 확인해야 하나요?

Discourse가 호스팅된 EC2 볼륨의 EBS 스냅샷을 유지하고 있다고 생각했지만, 실제로는 그렇지 않았습니다. 이후로 스냅샷을 활성화하여, 향후 필요 시 해당 방식으로 롤백할 수 있도록 조치했습니다.

도와주셔서 감사합니다.

네. 새로운 smtp 설정을 적용하기 위해 컨테이너를 삭제하고 다시 시작하는 것이 가능했을 것입니다. 그렇게 하는 방법을 자세히 살펴봐야 합니다.

아니요. 보안 업데이트는 소프트웨어 전체의 일부입니다. 안정 버전(stable branch)을 실행할 수는 있지만, 몇몇 버전이 뒤처져 있는 것 같으므로 적어도 대부분의 문제는 여전히 발생했을 것입니다.

불분명합니다. 일반적으로 업그레이드 과정에서 이미지가 손실되지 않습니다.

아니요. [quote=“mrmachine, post:1, topic:171465”]
+ New Topic 색상이나 숨김/표시 “support” 카테고리 같은 것들을 수정하려면 모든 설정과 사용자 설정을 수동으로 하나씩 확인해야 하나요?
[/quote]

네. 수년 전 버전의 소프트웨어를 실행하고 있었던 것 같습니다. 그 이후로 수십 명의 개발자가 수천 시간을 투입했습니다. 그들은 일부 사용자 설정을 깨뜨리는 변경사항을 도입했습니다.

하지만 마지막 백업 이후 작성된 게시물을 잃지 않고 롤백하는 것은 여전히 불가능합니다.

모든 베타 릴리스 시점에 업그레이드하거나, 다음 안정 버전 릴리스 시점에 안정 버전으로 전환해야 합니다.

이전에 언급했던 건에 대해 후속 보고드립니다. 우리는 업로드된 이미지를 S3에 저장하고 있었고, 깨진 링크를 방지하기 위해 원격 이미지를 다운로드하지 않는 방식을 선택했습니다. 이것이 관련이 있는지 확신은 없으나, 핵심은 이미지가 S3에 저장되어 Discourse에서 S3 URL로 참조되어야 한다는 점입니다.

업그레이드 이후, 수많은 이미지가 표시되지 않았습니다. 카테고리 로고와 사용자가 게시글에 업로드한 이미지들이 포함되었습니다. S3를 확인해 보니 참조된 파일명이 존재하지 않았습니다.

다행히 S3 버전 관리(versioning)를 활성화해 두었기에 S3 콘솔에서 업그레이드 중/후에 참조된 수많은 이미지가 삭제되었음을 확인할 수 있었습니다.

저는 발견한 Python 스크립트(https://stackoverflow.com/a/54613767/2829685)를 수정하여 S3 버킷의 모든 객체 버전을 반복 처리하고, 업그레이드 날짜와 같거나 그 이후의 last_modified 타임스탬프를 가진 파일의 현재 버전에서 "삭제 마커(delete markers)"를 제거했습니다.

이 작업이 하루 대부분을 소요되었으며, 약 45,000개의 이미지를 복원했습니다. Discourse가 각 이미지에 대해 많은 썸네일을 생성하는 것 같습니다.

현재 카테고리 로고와 게시글 내 사용자 업로드 이미지가 모두 복구되었습니다. 하지만 업그레이드 과정의 일부로 이 모든 이미지가 S3에서 어떻게 삭제될 수 있었는지는 전혀 알 수 없습니다.

이것은 Discourse 업그레이드 과정에서 매우 위험한 버그일 수 있습니다. 다만, 제가 매우 오래된 버전에서 업그레이드했기 때문에 이미 수정되었을 수도 있습니다.