수년간 https://discourse.bokeh.org에서 자체 호스팅 Discourse 인스턴스를 운영해 왔습니다. 전반적으로 매우 안정적이고 유지보수에 거의 노력을 들이지 않아도 되었으며, 특히 업데이트는 항상 완벽하게 완료되어 아무런 문제가 없었습니다.
그러나 오늘 2.7beta7로 업데이트한 후(업데이트는 문제없이 완료된 것으로 보였으나) 사이트가 완전히 마비되었습니다. 페이지가 잘못 렌더링되고 JS 콘솔 오류가 발생하면서 잠시 버텼지만, 롤백을 시도한 후 UI가 완전히 작동하지 않게 되었습니다. 드롭렛에 로그인하여 다음과 같은 시도도 해 보았지만 실패했습니다:
재빌드 (Rebuild)
./launcher rebuild app
여러 번 시도했지만 여러 가지 방식으로 실패했습니다.
Discourse Doctor
./discourse-doctor
복구 (Restore)
./launcher enter app
discourse restore <backup file>
이 과정을 거친 후에는 적어도 재빌드가 성공하여 “새로 설치” 상태, 즉 “축하합니다, Discourse를 설치했습니다!” 메시지가 표시되는 상태까지 도달할 수 있었습니다.
그 후 다시 discourse restore를 실행해 보았지만 이번에도 실패했습니다.
EXCEPTION: 1 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:86:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:357:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:240:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:62:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:44:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:62:in `run'
script/discourse:145:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/base.rb:485:in `start'
script/discourse:286:in `'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:494:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:49:in `block in '
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:37:in `'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `'
Trying to rollback...
Rolling back...
Cleaning stuff up...
Dropping functions from the discourse_functions schema...
Removing tmp '/var/www/discourse/tmp/restores/default/2021-04-23-235404' directory...
Marking restore as finished...
Notifying 'system' of the end of the restore...
Finished!
[FAILED]
이상한 점은 복구 과정에서 사이트가 정상으로 돌아오는 것처럼 보였다는 것입니다. 이전 콘텐츠가 표시되기 시작했거든요. 그런데 실패가 발생했고, 이제는 아무것도 표시되지 않고 계정들도 사라진 상태입니다.
여기서 어떤 조언이나 제안도 정말로 필요하겠습니다. 일주일 전까지의 일일 백업이 있으며(필요하다면 Glacier에 더 오래된 것이 있습니다). 며칠 전 사용하지 않던 카테고리를 삭제했는데, 이것이 문제의 원인이 될 수 있을까요? 확인해 보기 위해 더 오래된 백업을 시도해 볼 예정입니다. 확실한 복구 프로세스에 대한 팁이 있다면 환영합니다.
아쉽게도 없습니다. DO 백업은 주 단위로만 이루어지고, 저는 일 단위의 Discourse 백업을 s3에 설정하여 최근 1주일 치는 최신 상태로, 1년 치는 glacier에 보관하고 있었습니다. 이전에도 Discourse 업그레이드를 여러 번 성공적으로 경험했던 터라, 이 정도면 충분하고 더 나은 방법이라고 생각했습니다(그리고 이전에 성공적인 테스트 복원도 수행했었죠).
단계에서, 1개의 잘못된 게시물을 지적하고 롤백을 시작하기 전에 복원 스크립트를 그냥 강제 종료했어요.
사이트가 실제로 다시 올라와서 안전 모드에서 접근할 수 있었습니다. 코드 블록을 위한 “COPY PASTE” 테마 구성 요소를 비활성화했는데, 이 구성 요소는 최신 베타 버전과 현저히 호환되지 않는 것 같습니다. 그 후로는 안전 모드 없이도 사이트가 대부분 정상적으로 작동하는 것 같습니다. 하지만:
가능한 한 모든 것이 "깔끔하게 정리"되도록 하려면 권장되는 조치가 있나요? 예를 들어 S3에 자산을 다시 업로드하고 "rebake"하는 것 같은? 이에 대한 가장 최신 지침은 어디에서 찾을 수 있나요?
수정: 제가 아는 한, 모든 것이 정상으로 돌아온 것 같습니다. 이전 게시물들의 이미지가 S3/CDN에서 올바르게 로드되고 있습니다. 그렇다면 제 질문은, S3에 이미지를 업로드하는 경우 이 옵션을 체크 해제해야 하는지 여부입니다.
Include uploads in scheduled backups. Disabling this will only backup the database.
체크되어 있으면 중복된 안전 장치를 제공하는 것 같다고 생각했지만, 복원 과정에서 이러한 문제들의 원인이 바로 이것인 것 같습니다?
마지막으로 다른 호스팅 제공업체로 이사를 갈 때, 복원 과정에서 S3 관련 문제가 있었습니다. 그래서 이에 대해 문의했고, 답변은 '예’였습니다. 이미지를 S3에 저장하는 경우, 업로드 파일 없이 백업을 생성해야 합니다. 데이터베이스만 백업하는 것이죠. 하지만 이 경우에도 이것이 해결책인지는 알 수 없습니다. 시도해 보신다면, 먼저 스냅샷을 생성해 두시기 바랍니다.
이 기능은 다가오는 2.8 베타 버전 중 하나에 포함될 예정입니다. 불행히도 아직 다가오는 2.7 릴리스를 위해 준비가 되지 않았습니다.
도와달라는 요청을 더 일찍 확인하지 못한 점 죄송합니다. S3에 저장된 업로드 파일로 인해 복원이 실패하는 문제를 겪고 있는 다른 분들을 위한 팁을 드리겠습니다. 백업에서 dump.sql.gz 파일을 추출한 후 파일 이름을 변경하세요. 예를 들어, 원래 백업 파일명이 discourse-2020-10-09-133921-v20201007124955.tar.gz였다면, 결과 파일명은 discourse-2020-10-09-133921-v20201007124955.sql.gz로 변경해야 합니다. 이 파일을 복원하면 정상적으로 작동할 것입니다.