로그인 시 "unknown error" 발생, undefined method `password_algorithm='

잘 알려진 /shared ‘템플릿’ 위에 phpbb3 마이그레이션을 실행했는데(며칠 전부터 매주 몇 번씩 개선하면서 계속 해온 방식입니다), 그 후로 로그인할 수 없게 되었습니다.

로그인 화면에서 "Unknown error"가 표시되었고, 콘솔에는 POST 요청에 대한 500 오류가 나타났습니다. rails에서 비밀번호를 변경하거나 admin:create 태스크를 실행하면 다음과 같은 오류가 발생했습니다:

docker exec -it dc rake admin:create
Email:  testadmin123@example.com
Password:
Repeat password:
rake aborted!
NoMethodError: undefined method `password_algorithm=' for #<User id: nil, username: "d8b57755b12086606777", created_at: nil, updated_at: nil, name: nil, seen_notification_id: 0, last_posted_at: nil, password_hash: nil, salt: "7512e03d29d4990a0bce5dd9b5954adc", active: false, username_lower: "d8b57755b12086606777", last_seen_at: nil, admin: false, last_emailed_at: nil, trust_level: 0, approved: false, approved_by_id: nil, approved_at: nil, previous_visit_at: nil, suspended_at: nil, suspended_till: nil, date_of_birth: nil, views: 0, flag_level: 0, ip_address: nil, moderator: false, title: nil, uploaded_avatar_id: nil, locale: nil, primary_group_id: nil, registration_ip_address: nil, staged: false, first_seen_at: nil, silenced_till: nil, group_locked_trust_level: nil, manual_locked_trust_level: nil, secure_identifier: nil, flair_group_id: nil, last_seen_reviewable_id: nil>
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activemodel-7.0.4.3/lib/active_model/attribute_methods.rb:458:in `method_missing'
/var/www/discourse/app/models/user.rb:1882:in `ensure_password_is_hashed'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:400:in `block in make_lambda'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:199:in `block (2 levels) in halting'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:687:in `block (2 levels) in default_terminator'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:686:in `catch'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:686:in `block in default_terminator'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:200:in `block in halting'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `block in invoke_before'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `invoke_before'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:116:in `block in run_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:138:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/callbacks.rb:929:in `_run_save_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/callbacks.rb:457:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/timestamp.rb:126:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/persistence.rb:615:in `save'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/validations.rb:47:in `save'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/transactions.rb:298:in `block in save'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/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.4.3/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.4.3/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.4.3/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.4.3/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.4.3/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.4.3/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.4.3/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.4.3/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/transactions.rb:298:in `save'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/suppressor.rb:50:in `save'
/var/www/discourse/lib/tasks/admin.rake:87:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => admin:create
(See full trace by running task with --trace)

몇 시간 후 다시 빌드하니 문제가 해결되었습니다. 이런 현상을 이전에 본 적 있으신가요?

결국 잘 해결되어 다행이지만, 이상하게 느껴졌습니다.

아마도 admin:create를 실행하려고 할 때 대기 중인 데이터베이스 마이그레이션이 있었을 가능성이 큽니다. (password_algorithm 열이 최근에 users 테이블에 추가되었습니다)

재미있네요.

마이그레이션이 마침내 실행되도록 한 트리거가 무엇이라고 생각하시나요? 재시작은 문제를 해결하지 못했고, 기다리는 것도 해결책이 되지 못했어요. 하지만 컨테이너를 다시 빌드하니까 해결됐죠.

마이그레이션은 관리자 UI를 통해 업그레이드를 수행하거나 재구성을 수행할 때 실행됩니다.

그 말이 맞아요. 컨테이너가 /shared보다 최신 버전이어서 필요한 마이그레이션이 아직 적용되지 않았던 거였어요.