UI에서 생성된 백업 찾기 및 사이트 복구

Discourse 팀에,

어젯밤에 Discourse 업그레이드를 진행하던 중 앱을 다시 빌드했는데, 이로 인해 수많은 Postgres 오류가 발생했습니다. 이는 최근 업그레이드 때문이라는 것을 깨달았지만, 여전히 권한 거부(permission denied) 오류 등 다른 문제들이 계속 발생했습니다(그리고 네, 모든 파일의 권한을 700으로 chown 했으므로 전역적인 문제가 아니었습니다). 그래서 기존 /var/discourse 폴더를 임시로 사용할 위치로 이동하고, 적어도 postgres를 최신 상태로 만들기 위해 Discourse를 새로 설치해 보았습니다.

여기서부터가 흥미진진합니다. 3일 전에 UI를 통해 생성한 사이트 백업(DB만, 업로드는 다른 볼륨에 저장됨)이 있다고 생각했습니다. 적어도 그렇게 믿었습니다. 현재 제가 가지고 있는 파일은 wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz인데, 이것이 실제 백업이 있어야 할 tar.gz 파일이 아님을 이제야 깨달았습니다.

현재 모든 사용자를 랜딩 페이지로 리다이렉트해 놓은 상태이며, 3일 전 서버에서 실제 .tar.gz 파일을 여전히 복구할 수 있는지, 그리고 정확히 어떻게 해야 하는지 알려줄 사람이 있기를 바랍니다.

백업과 업로드를 Digital Ocean 블록 스토리지에 저장하고 있으며, 이전 설치 환경에서 정상 작동하던 discourse 폴더도 가지고 있습니다. 하지만 이를 /var/discourse로 되돌리거나 복사하면 postgres 오류를 포함해 모든 것이 다시 깨져 버립니다. 9시간 동안 계속 작업하고 있는데 이제 거의 한계입니다. 누군가 도와주거나, 적어도 올바른 방향으로의 힌트만이라도 주실 수 있을까요? :pray: 방금 1,000명 사용자 마크를 달성했는데, 정말로 정말로 이 모든 것을 잃고 싶지 않습니다.

업로드 설정에 대한 수정 사항을 편집하여 추가했습니다.

S3 설정이 app.yml에 있다면, 커맨드 라인 복구를 실행하기만 하면 S3에서 백업을 가져옵니다.
자산(Assets)이 S3에 있으므로 백업에는 데이터베이스만 포함됩니다.

새로운 /var/discourse를 클론하고, yml 파일을 복사한 뒤, 다시 빌드하고 커맨드 라인 복구를 수행하면 됩니다.

업로드용 객체 저장소 사용 (S3 & 클론)

커맨드 라인에서 백업 복구

제 백업/업로드 구성 방식에 대해 잘못된 용어를 사용하고 있는 것 같습니다. 저는 이 방법을 사용했습니다: Move Uploads and Backups to DigitalOcean Block Storage

이를 수정하여, 제 업로드와 백업이 메인 discourse 폴더에 로컬로 저장되어 있지 않다고 말씀드리겠습니다. (이것이 문제의 시작점이었고, DigitalOcean Spaces로의 이동을 시도하고 있었기 때문입니다.) 따라서, 불행히도 저는 S3 설정을 전혀 하지 않았습니다. 왜냐하면 저는 단순히 마운트된 스토리지에 저장하고 있었기 때문입니다.

백업은 mnt/my_storage/shared/standalone에 저장되고 있었지만, 그곳에서 백업을 찾아보니 wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz 파일만 있습니다. 더 나은 아이디어가 없어서 실제로 그 파일에서 복원을 시도해 보았지만(아마도 잘못된 방법이었을 것입니다), 권한 거부(permission denied) 오류가 발생했습니다. 아마도 그 백업이 실제로 생성되는 방식과 관련이 있을 것 같습니다.

그래서 업로드된 파일은 여전히 DO 블록 스토리지에 있나요?

네, 모든 업로드가 그대로 유지되고 있습니다.

좋아요.

그렇다면 SQL 파일을 복원한 다음 블록 저장소 볼륨을 다시 마운트하면 업로드된 파일들을 되찾을 수 있을 겁니다.

백업에는 두 가지 종류가 있습니다. 업로드 파일을 포함하지 않는 sql.gz와 업로드 파일을 포함하는 tar.gz입니다. 즉, 처음에는 잘못된 종류의 백업을 사용했지만, 업로드 파일이 외부 볼륨에 저장되어 있었기 때문에 상황이 해결되었습니다.

그래서 앱에 들어가서 해당 sql.gz 파일을 복원했는데, 권한 거부(permission denied) 오류가 발생했습니다. 이유가 뭘 수 있을까요?

당신이 말해줘요!! :slight_smile:

(혹시 chmod을 의미하신 것이라면요.) 파일의 소유자가 잘못 설정되어 있으면 파일을 쓸 수 없게 됩니다.

이것이 권한 거부 오류의 원인이 되었을 수 있습니다.

정확한 오류 메시지는 무엇인가요?

네, 감사합니다. 밤새도록 깨어 있었더니 정신이 좀 없네요.

EXCEPTION: lib/discourse.rb:93:in `exec': Failed to copy archive to tmp directory.
cp: cannot open '/var/www/discourse/public/backups/default/wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz' for reading: Permission denied

chmod 644 /var/www/discourse/public/backups/default/*를 시도해 보세요

네, 지금 이 문제를 해결해 보고 있으니 곧 결과를 알려드릴게요. 시간 내서 도와주셔서 감사합니다.

이 방법으로 복구를 시작할 수 있었어요. 정말 감사합니다. :pray:

이제 사이트가 아직 로딩되지 않는 이유를 찾아야 합니다. :grimacing:

모든 문제가 생기기 전에 저장해 둔 app.yml 파일로 현재 재구성을 진행 중입니다.

이 백업을 앱으로 바로 옮기는 명령어가 있나요? 복원 시 파일이 검색되지 않고, 이전에 어떻게 로드했는지 기억이 나지 않습니다.

S3에서 다운로드하여 다음 경로에 배치할 수 있습니다.

/var/discourse/shared/standalone/backups/default

명령줄에서 복원할 수 있어야 합니다.

그 후, 위 링크에 설명된 대로 S3 설정을 구성해야 합니다. 그렇게 하면 작업이 훨씬 쉬워집니다.

제이, 감사합니다. 네, 제 계획도 정확히 그렇습니다.

자, 지금 제 상황은 다음과 같습니다.

  • 해당 .sql.gz 파일에서 복원이 성공적으로 완료되었습니다. (좋아요! 다시 한번 Richard님께 감사드립니다.)
  • app.yml이 모든 것이 다운되기 전과 동일한 설정인지 확인했습니다.
  • ./launcher rebuild app 실행
  • Postgres 13으로 재빌드가 성공적으로 완료되었습니다 (드디어)

하지만 현재 사이트 자체에 접속하면 여전히 다운된 상태입니다. Cloudflare를 사용 중이며, 현재 개발 모드(Development Mode)를 켜 두었고 DNS 캐시도 플러시했습니다. 모든 것이 제대로 된 곳으로 가리키고 있습니다. Cloudflare 템플릿은 app.yml에 있습니다.

DNS가 올바르게 해석되고 있고, 호스트네임도 최신 상태이며, Discourse 설치 시에도 적절한 URL을 사용했습니다. 이제 아이디어가 바닥난 상태입니다.

URL은 https://forum.wackywriters.com이고, “서버 사용 불가” 오류만 계속 발생합니다. 제자리걸음만 하고 있는 것 같습니다 (미안합니다)만, 혹시 조언이 있으신 분 계신가요?

수정: ./discourse-doctor를 실행해 보니 Docker에서 앱 인스턴스가 두 개가 실행 중이라는 것을 확인할 수 있습니다:

이것이 정상적인가요? (정상적이지 않을 것 같은데, 지난 24시간 동안 Discourse에 대해 알고 있다고 생각했던 모든 것이 뒤집어졌습니다 :sweat_smile: )

수정2: 마지막 수단으로 미뤄 왔지만, 이제 완전히 새로운 서버를 세팅하여 Discourse를 깨끗하게 설치해 볼 생각입니다. 제가 이것저것 만지면서 무언가 엉망이 되었을지 걱정되고, 무엇이 깨진 것인지 파악이 되지 않습니다. 다행히에도 백업과 모든 업로드 파일이 블록 스토리지에 남아 있어, 운이 좋다면 이를 새로운 드롭렛(Droplet)에 연결하여 거기서 이전 작업을 진행할 수 있을 것입니다. 혹시 추가적인 제안이나 팁이 있으시다면, 제 경험보다 더 풍부한 전문 지식을 가진 분들의 조언을 듣고 싶습니다.

수정3: 새로운 서버를 세팅하고 IP가 전파되었음에도 (nslookup과 ping 모두 정상, whatsmydns.net에서도 정상) 포럼이 로드되지 않습니다. 여전히 연결 오류가 발생합니다. IP 주소를 Discourse 인스턴스에 연결하는 대신 정적 페이지를 로드하려고 시도하는 것 같습니다. 물론 이 경우 그런 페이지는 존재하지 않습니다.

거의 24시간 동안 고군분투한 끝에, 복구를 진행한 후 사이트가 로드되지 않던 이유를 찾았습니다.
:point_down:

리셋과 재설치를 반복하고 그 외에도 여러 가지 작업을 하다 보니 레이트 리밋에 걸렸더군요. 그래서 SSL 템플러트를 임시로 주석 처리해 두었고, 일주일 후에 다시 활성화할 예정입니다.

현재는 깨진 이미지들을 수정하기 위해 모든 게시물을 다시 처리(rebake)하는 동안 사이트는 "기능"은 하고 있습니다. 오늘 저를 도와주신 Jay와 Richard에게 진심으로 감사드립니다. 정말 혼자서는 도저히 해결할 수 없었던 부분을 함께 헤쳐 나가 주셨기 때문입니다.

이제 S3를 설정할 때 다시 이런 걱정 없이 이번 주 안에 작업을 마무리할 수 있도록 진짜 백업을 다운로드하는 일만 남았습니다. :sweat_smile:

검색을 해보면, Let’s Encrypt에서 별도 요청으로 처리되도록 두 번째 도메인을 추가하는 방법이 있습니다. 하지만 기다리는 것이 더 쉽습니다.

Cloudflare를 속도 향상 없이 회색 구름(프로キシ 비활성화)으로 설정하는 것을 권장합니다.

@pfaffman 객체 저장소와 블록 저장소를 혼동하고 있는 건 아닌가요? 객체 저장소는 S3이지만, TS는 블록 저장소를 사용했다고 했으며, 이는 단순히 업로드 디렉터리에 마운트된 디스크입니다:

아. :man_facepalming:

네. 그래서 제가 한 말이 전혀 의미가 없네요.

그걸 알아봐 주셔서 감사합니다, 리처드.

음, 당신이 한 말 중 대부분은 의미가 있었지만 여기서는 좀 혼란스러웠습니다 :slight_smile: