3.4.0 업데이트 후 계정 활성화 페이지 문제 (빈 화면)

Discourse 팀에게,

정말 훌륭한 제품을 제공해 주셔서 감사합니다! 저와 제 커뮤니티는 수년간 이 제품을 사용하며 큰 만족을 느껴 왔습니다. 최근 문제가 발생했는데, 도움을 주시면 감사하겠습니다.

Discourse 3.3.0에서 3.4.0으로 업그레이드한 후, 새 사용자들이 이메일 인증 링크를 클릭하여 ‘계정 활성화’ 페이지에 도달할 때 빈 페이지(헤더와 푸터만 표시)를 보고 있습니다.


(테스트 링크는 이 글의 끝에 제공할 예정입니다)

지금까지 취한 조치:

  1. 개발자 콘솔 확인: 외부 스크립트가 CSP에 의해 차단되고 있음을 나타내는 오류가 표시됩니다.

  2. Cloudflare를 통해 CSP 수정 시도:


    정책을 조정하고 캐시를 삭제했지만 문제가 해결되지 않았습니다.

  3. Discourse 관리자 패널을 통해 CSP 수정 시도: ‘self’, 'unsafe-eval’을 추가하고 SHA256 해싱을 시도했습니다. 또한 이 글을 참고했지만 변화가 없었습니다.

  4. 오류 메시지:


    다양한 입력값(예: ‘self’, ‘unsafe-eval’)을 시도했고, 정책을 “보고만”(report only) 모드로 설정하기도 했습니다. 하지만 여전히 효과가 없습니다.

  5. 캐시 삭제: 변화가 없었습니다.

  6. 앱 재빌드: Discourse를 재빌드한 후 캐시를 삭제했지만 문제가 지속됩니다.

흥미롭게도 이 문제는 모든 신규 사용자에게 영향을 미치지 않습니다. 신규 사용자의 약 90%가 이 문제를 겪고 있는 것으로 확인되었습니다.

제안이나 해결책이 있으시면 정말 감사하겠습니다! 감사합니다!

안전 모드를 시도해 보셨나요?

@pfaffman
방금 시도해 보았는데 이런 게 보였어요:

CSP 오류가 /cdn-cgi/speculation 엔드포인트와 관련되어 보고되는 다른 사이트가 있습니다: Refused to load the script 'site.com/cdn-cgi/speculation' because it violates the following Content Security Policy directive - #2 by simon. 과거에 유사한 문제가 보고된 적이 있는지 저는 알지 못합니다. 아마도 Cloudflare 또는 Discourse 3.4.0에서 무언가가 변경되었을 수 있습니다.

/cdn-cgi/speculation 엔드포인트는 “Speed Brain” 기능이 활성화된 Cloudflare에 등록된 도메인에 추가됩니다. Speed Brain은 사용자가 링크에 마우스를 올릴 때 Cloudflare이 콘텐츠를 미리 가져오도록 하여 웹사이트의 성능을 향상시키는 것을 목표로 합니다. 이것이 Discourse와 호환되는지 확신할 수 없습니다.

https://community.lezismore.org/login을 방문할 때 응답과 함께 Speculation-Rules 헤더가 반환되는 것을 확인할 수 있습니다. 이는 Speed Brain 기능이 활성화되어 있음을 나타냅니다. Cloudflare 문서에 따르면, 이 기능은 기본적으로 활성화되어 있는 것으로 보입니다.

Cloudflare 대시보드의 Speed 탭에서 Speed Brain을 비활성화해 보시겠습니까? 해당 방법을 안내하는 설명서는 여기 있습니다: Speed Brain · Cloudflare Speed docs.

제가 링크한 문서의 “Caveats”(주의사항) 섹션에는 다음과 같이 나와 있습니다:

  • strict-dynamic 또는 nonce-{hash} 속성을 사용하는 제한적인 Content Security Policy :up_right_arrow: 구성에서는 Speed Brain이 작동하지 않습니다.

Speed Brain이 Discourse와 _호환_된다면, 이를 Content Security 규칙에 추가하는 방법을 찾아야 할 것입니다.

답변 주셔서 감사합니다.

권장하신 대로 Cloudflare에서 Speed Brain 설정을 비활성화하고 캐시를 삭제했지만, 불행히도 문제가 여전히 지속되고 있습니다.

관심 있는 분들을 위해 오늘 새로 테스트한 활성 계정 페이지 링크를 공유합니다: https://community.lezismore.org/users/activate-account/34180b9eed9e1a1a1dbcca7eab66fb43

사이트에 로그인할 수 있나요? 가능하다면, 오류 로그 페이지(https://community.lezismore.org/logs)에서 오류 메시지가 표시되는지 확인해 주시겠습니까?

네, 웹사이트에 로그인할 수 있습니다.
로그 페이지는 다음과 같습니다:

Job exception: can't write unknown attribute

그리고 자세한 내용은 다음과 같습니다:

Message (23685 copies reported)

Job exception: can't write unknown attribute ``

Backtrace

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activemodel-7.1.4/lib/active_model/attribute.rb:236:in `with_value_from_database'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activemodel-7.1.4/lib/active_model/attribute_set.rb:60:in `write_from_user'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/transactions.rb:435:in `restore_transaction_record_state'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/transactions.rb:345:in `rolledback!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:200:in `block in rollback_records'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:263:in `run_action_on_records'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:199:in `rollback_records'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:527:in `block in rollback_transaction'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.1.4/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:520:in `rollback_transaction'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:539:in `rescue in block in within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:538:in `block in within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.1.4/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:532:in `within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/connection_adapters/abstract/database_statements.rb:344:in `transaction'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/transactions.rb:361:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.4/lib/active_record/persistence.rb:904:in `update!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:156:in `process_queue'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:77:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads'

관련이 있는지 확실하지는 않지만, 혹시 모르니 참고용으로 다른 에러들도 함께 공유합니다.

Message

Job exception: PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """
LINE 1: ...1506385, "success" = TRUE WHERE "scheduler_stats"."" IS NULL
                                                             ^



Backtrace

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.3.0/lib/patches/db/pg.rb:69:in `exec_params'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.3.0/lib/patches/db/pg.rb:69:in `exec_params'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/postgresql_adapter.rb:768:in `block (2 levels) in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/dependencies/interlock.rb:41:in `permit_concurrent_loads'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/postgresql_adapter.rb:767:in `block in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract_adapter.rb:752:in `block in log'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract_adapter.rb:743:in `log'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/postgresql_adapter.rb:766:in `exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/postgresql_adapter.rb:745:in `execute_and_clear'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/postgresql/database_statements.rb:67:in `exec_delete'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract/database_statements.rb:175:in `update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract/query_cache.rb:22:in `update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/persistence.rb:513:in `_update_record'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/persistence.rb:1060:in `_update_row'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/locking/optimistic.rb:93:in `_update_row'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/persistence.rb:1082:in `_update_record'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/attribute_methods/dirty.rb:216:in `_update_record'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/callbacks.rb:463:in `block in _update_record'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/callbacks.rb:99:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/callbacks.rb:929:in `_run_update_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/callbacks.rb:463:in `_update_record'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/timestamp.rb:121:in `_update_record'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/persistence.rb:1069:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/callbacks.rb:455:in `block in create_or_update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/callbacks.rb:99:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/callbacks.rb:929:in `_run_save_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/callbacks.rb:455:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/timestamp.rb:126:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/persistence.rb:648:in `save!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/validations.rb:53:in `save!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/transactions.rb:302:in `block in save!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract/database_statements.rb:314:in `transaction'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/transactions.rb:302:in `save!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/suppressor.rb:54:in `save!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/persistence.rb:782:in `block in update!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/persistence.rb:780:in `update!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mini_scheduler-0.16.0/lib/mini_scheduler/manager.rb:134:in `process_queue'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mini_scheduler-0.16.0/lib/mini_scheduler/manager.rb:70:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mini_scheduler-0.16.0/lib/mini_scheduler/manager.rb:59:in `block (2 levels) in ensure_worker_threads'

도와주실 분께 큰 감사를 드립니다 :folded_hands:

제공해 주신 세부 사항을 살펴본 결과, Discourse 코드에서 에러가 발생하는 정확한 위치를 파악하기 어렵습니다. 에러 페이지의 “info” 또는 “env” 탭에 관련 정보가 있나요? 또한 페이지 우측 하단에 있는 “share” 버튼을 클릭하면 모든 에러 세부 사항을 확인할 수 있습니다.

해당 에러가 문제와 직접적인 관련이 있는지 확실하지는 않지만, 사이트에서 백그라운드 작업(sidekiq) 관련 오류가 발생하는 것 같습니다.

사이트의 /sidekiq 페이지에도 유용한 정보가 있을 수 있습니다. 관리자 계정으로 로그인한 경우 https://community.lezismore.org/sidekiq 주소에서 해당 페이지를 확인할 수 있습니다.

웹사이트를 확인해 봤는데 전통 중국어로 되어 있네요. 제가 겪었던 것과 같은 상황에 부딪히신 것일 수도 있습니다.

우리도 같은 문제를 겪고 있었던 것 같습니다! 이메일 템플릿의 활성화 페이지 링크를 다음과 같이 업데이트한 후:

%{base_url}/user/activate-account/%{email_token}

다음으로 변경했습니다:

%{base_url}/u/activate-account/%{email_token}

그 후 모든 것이 정상적으로 작동하기 시작했습니다. 이전의 사용자 지정 설정으로 인해 이메일 템플릿이 자동으로 업데이트되지 않아, 앱 재빌드 후 변경 사항이 적용되지 않았기 때문에 이런 문제가 발생한 것으로 보입니다.

디버깅 과정에서 엄청난 인내심을 가지고 도와주신 @simon 님과 정보를 공유해 주신 @th21 님께 진심으로 감사드립니다.

앞으로도 애플리케이션의 성능을 계속 모니터링하고, 문제가 발생하면 업데이트를 공유하겠습니다. 다시 한번 감사드립니다!