최신 버전으로 업데이트하거나 Discourse를 재구성하면 웹사이트가 되돌릴 수 없이 손상됩니다

요즘 아주 고약한 버그에 막혀서 저희 웹사이트 전체가 깨져 버렸는데, 해결책이 보이지 않습니다. 재구축부터 플러그인 제거/추가까지 모든 방법을 시도해 보았지만 소용이 없었습니다. 몇 달 전의 정상 작동하던 백업은 있지만, 더 최신 버전으로 이를 재구축하려고 하면 사이트가 그냥 깨져 버리는 것 같습니다.

표시되는 주요 메시지는 다음과 같습니다:

Oops
The software powering this discussion forum encountered an unexpected problem. We apologize for the inconvenience.

Detailed information about the error was logged, and an automatic notification generated. We'll take a look at it.

No further action is necessary. However, if the error condition persists, you can provide additional detail, including steps to reproduce the error, by posting a discussion topic in the site's feedback category.

이것은 디스코urses의 일반적인 오류 메시지이며, 문제 해결 시 실질적인 결과를 제공하지 않습니다. 도커 로그를 확인해 보니 다음 내용이 발견되었습니다:

Completed 500 Internal Server Error in 152ms (ActiveRecord: 0.0ms | Allocations: 17980)
ActionView::Template::Error (undefined method `[]' for nil:NilClass)
lib/svg_sprite/svg_sprite.rb:502:in `block in custom_icons'
lib/svg_sprite/svg_sprite.rb:500:in `each'
lib/svg_sprite/svg_sprite.rb:500:in `custom_icons'
lib/svg_sprite/svg_sprite.rb:275:in `block in all_icons'
lib/distributed_cache.rb:25:in `defer_get_set'
lib/svg_sprite/svg_sprite.rb:517:in `get_set_cache'
lib/svg_sprite/svg_sprite.rb:268:in `all_icons'
lib/svg_sprite/svg_sprite.rb:337:in `bundle'
lib/svg_sprite/svg_sprite.rb:285:in `block in version'
lib/distributed_cache.rb:25:in `defer_get_set'
lib/svg_sprite/svg_sprite.rb:517:in `get_set_cache'
lib/svg_sprite/svg_sprite.rb:284:in `version'
lib/svg_sprite/svg_sprite.rb:290:in `path'
app/helpers/application_helper.rb:586:in `client_side_setup_data'
app/views/layouts/application.html.erb:61
lib/topic_list_responder.rb:13:in `block (2 levels) in respond_with_list'
lib/topic_list_responder.rb:9:in `respond_with_list'
app/controllers/list_controller.rb:103:in `block (2 levels) in <class:ListController>'
app/controllers/application_controller.rb:387:in `block in with_resolved_locale'
app/controllers/application_controller.rb:387:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:356:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:198:in `call'

그래서 당연히, 오류가 발생하는 501번째 줄에 try/catch를 구현하면 문제를 해결할 수 있을 것이라 생각했습니다. 해당 메서드는 다음과 같습니다:

  def self.custom_icons(theme_id)
    # Automatically register icons in sprites added via themes or plugins
    icons = []
    custom_svg_sprites(theme_id).each do |item|
      begin
        svg_file = Nokogiri::XML(item[:sprite])
        svg_file.css('symbol').each do |sym|
          icons << sym.attributes['id'].value if sym.attributes['id'].present?
        end
      rescue Exception:
        puts Exception
      end
    end
    icons
  end

이 방법은 사이트의 기능을 실제로 복원하지만, 불행히도 웹사이트 전체에서 아이콘이나 이미지가 로드되지 않도록 함으로써 복원되므로, 결국 아무것도 해결하지 못합니다.

저희가 사용 중인 플러그인은 다음과 같습니다:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/discourse/discourse-user-notes.git

기억이 맞다면, discourse-follow와 같은 일부 플러그인은 공식적으로 지원되기 전에 사용했었습니다. 따라서 사이드그레이딩(sidegrading) 과정에서 무언가가 깨진 것일 수도 있습니다.

업데이트 전 원래 버전은 2.8.0.beta2였으며, 현재는 2.9.0.beta1을 사용 중입니다.

생각할 수 있는 거의 모든 방법을 시도해 보았지만, 이 버그가 너무 일반적이어서 누군가가 도움을 줄 수 있을지 확신이 서지 않아 여기에 게시해야 할지 고민되었습니다. 하지만 이 문제를 일으키는 원인에 대해 아이디어가 있으시다면 도움을 주시면 감사하겠습니다.

Postgres가 10에서 13 버전으로 업그레이드를 시도하면서 발생하는 문제일 수 있습니다.

Postgres와 관련된 항목이 있는지 로그를 확인해 보세요.

/shared/standalone/log/rails에 포함된 로그를 말씀하시는 건가요? 거기에는 Postgres와 관련된 내용이 전혀 언급되어 있지 않습니다. /shared/standalone/log/var-log/postgres에 포함된 로그의 경우, 에러가 발생한 시간대인 19:51:08경에는 아무런 특이점 없이 일반적인 요청만 기록되어 있습니다. 에러나 실패로 보이는 내용도 없습니다. 그리고 업데이트가 이루어지는 시간대에는 이 로그에 기록되지 않는다고 생각합니다.

구체적으로 찾아볼 수 있는 것이 있을까요?

apt-get update | apt-get upgrade가 최신 상태인지 확인한 후
./launcher rebuild app을 실행하세요.

오류를 확인하거나 /var/discourse/shared/standalone/log/rails를 살펴보세요.

apt-get update와 apt-get upgrade를 모두 업데이트하고 전체 재빌드도 수행했는데, 불행히도 동일한 에러가 발생합니다. 제가 확인한 바로는 아무것도 변경되지 않았습니다.

몇 가지 질문이 있습니다:

  1. 재구성이 오류 없이 완료됩니까?
  2. 안전 모드에서 사이트를 불러와 보셨나요?
  3. 확인해 볼 수 있도록 사이트 URL을 공유해 주실 수 있나요?
  1. 네, 재구축이 오류 없이 완료됩니다.
  2. 네, 위에서 언급한 오류를 수정할 때와 비슷하게 웹사이트를 일종의 “아이콘/이미지 없음” 모드로 부팅합니다. 이때 아무것도 로드되지 않습니다.
  3. 그렇고 말고요. 사이트에 일부 노골적인 콘텐츠가 포함되어 있어, URL을 공유하는 것에 대해 사람들이 괜찮은지 주변에 물어봐야 할 것 같습니다.

그동안 다른 것도 알아냈습니다. 안전 모드로 웹사이트를 탐색하던 중 DiscoTOC가 오류를 발생시키는 것을 발견했습니다. 이 플러그인을 비활성화하자 안전 모드 없이도 웹사이트가 다시 정상적으로 작동하지만, 여전히 아이콘/이미지가 제대로 로드되지 않습니다.

모든 이미지가 콘솔에서 404 오류를 반환하고 있으며, favicon을 포함한 대부분의 아이콘은 500 오류를 반환하고 있습니다.
물론 이전에는 모두 정상적으로 작동했습니다.

이와 관련하여, 재구성이 이미지 참조 정보를 모두 삭제한 것은 아닌지 궁금합니다.

모두가 상황을 파악할 수 있도록, 이후 여러 스레드에서 나온 다양한 조언을 시도해 보았습니다. 그중 두 가지만 언급하자면 다음과 같습니다:

불행히도 어떤 조언도 도움이 되지 않았습니다. rake posts:rebake, rake posts:missing_uploads, rake uploads:recover_from_tombstone 명령어 모두 작동하지 않았습니다. 또한 sidekiq 대시보드도 확인해 보았지만, 이것 역시 아무것도 복원되지 않았습니다.

현재 사라진 이미지들을 복원하는 방법에 대해 아시는 분이 계신다면, 조언을 듣고 싶습니다.

여러 번 시행착오를 거친 끝에 결국 이미지를 성공적으로 복구할 수 있었기 때문에, 이 문제를 해결된 것으로 간주하겠습니다.

처음에 알았으면 좋았을 것이 있나요?

처음부터 안전 모드에서 웹사이트를 더 꼼꼼히 살펴봤다면 도움이 됐을지도 모릅니다. 또한 고백하자면, 저는 이미 일부 작업이 진행된 후에야 사이트 복구에 관여하게 되었는데요, 결과적으로 이미지들은 별도의 백업 폴더에 저장되어 있었고, 그냥 해당 폴더로 옮기기만 하면 되는 상황이었습니다.

그걸 누가 맞힐 수 있었을까요! 알아내셨다니 다행입니다.