Job 예외: DiscourseActivityPub::AP::Link 인스턴스에 'json=' 메서드가 정의되지 않았습니다

Discourse 카테고리 팔로우 기능이 이제 작동하지 않는 것 같습니다

Job exception: undefined method 'json=' for an instance of DiscourseActivityPub::AP::Link
백트레이스
Message (19 copies reported)

Job exception: undefined method 'json=' for an instance of DiscourseActivityPub::AP::Link

Backtrace

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/object.rb:194:in 'DiscourseActivityPub::AP::Object.factory'
/var/www/discourse/plugins/discourse-activity-pub/plugin.rb:857:in 'block (4 levels) in Plugin::Instance#activate!'
/var/www/discourse/plugins/discourse-activity-pub/plugin.rb:856:in 'Array#each'
/var/www/discourse/plugins/discourse-activity-pub/plugin.rb:856:in 'block (3 levels) in Plugin::Instance#activate!'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/database_statements.rb:376:in 'ActiveRecord::ConnectionAdapters::DatabaseStatements#transaction'
activerecord-8.1.4/lib/active_record/transactions.rb:234:in 'block (2 levels) in ActiveRecord::Transactions::ClassMethods#transaction'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:487:in 'ActiveRecord::ConnectionAdapters::ConnectionPool#with_pool_transaction_isolation_level'
activerecord-8.1.4/lib/active_record/transactions.rb:233:in 'block in ActiveRecord::Transactions::ClassMethods#transaction'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:459:in 'ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection'
activerecord-8.1.4/lib/active_record/connection_handling.rb:313:in 'ActiveRecord::ConnectionHandling#with_connection'
activerecord-8.1.4/lib/active_record/transactions.rb:232:in 'ActiveRecord::Transactions::ClassMethods#transaction'
/var/www/discourse/plugins/discourse-activity-pub/plugin.rb:817:in 'block (2 levels) in Plugin::Instance#activate!'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/plugin/instance.rb:10:in 'block in DiscourseActivityPub::Plugin::Instance#activity_pub_on'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/handlers.rb:76:in 'block in DiscourseActivityPub::AP::Handlers::ClassMethods#apply_handlers'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/handlers.rb:74:in 'Array#all?'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/handlers.rb:74:in 'DiscourseActivityPub::AP::Handlers::ClassMethods#apply_handlers'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/handlers.rb:24:in 'DiscourseActivityPub::AP::Handlers#apply_handlers'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/object.rb:225:in 'DiscourseActivityPub::AP::Object.resolve_and_store'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/activity.rb:136:in 'DiscourseActivityPub::AP::Activity#process_actor_and_object'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/activity.rb:56:in 'DiscourseActivityPub::AP::Activity#process_activity'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/activity.rb:36:in 'block in DiscourseActivityPub::AP::Activity#perform_transactions'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:648:in 'block in ActiveRecord::ConnectionAdapters::TransactionManager#within_new_transaction'
activesupport-8.1.4/lib/active_support/concurrency/null_lock.rb:9:in 'ActiveSupport::Concurrency::NullLock#synchronize'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:645:in 'ActiveRecord::ConnectionAdapters::TransactionManager#within_new_transaction'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/database_statements.rb:386:in 'ActiveRecord::ConnectionAdapters::DatabaseStatements#within_new_transaction'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/database_statements.rb:378:in 'ActiveRecord::ConnectionAdapters::DatabaseStatements#transaction'
activerecord-8.1.4/lib/active_record/transactions.rb:234:in 'block (2 levels) in ActiveRecord::Transactions::ClassMethods#transaction'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:487:in 'ActiveRecord::ConnectionAdapters::ConnectionPool#with_pool_transaction_isolation_level'
activerecord-8.1.4/lib/active_record/transactions.rb:233:in 'block in ActiveRecord::Transactions::ClassMethods#transaction'
activerecord-8.1.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:465:in 'ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection'
activerecord-8.1.4/lib/active_record/connection_handling.rb:313:in 'ActiveRecord::ConnectionHandling#with_connection'
activerecord-8.1.4/lib/active_record/transactions.rb:232:in 'ActiveRecord::Transactions::ClassMethods#transaction'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/activity.rb:34:in 'DiscourseActivityPub::AP::Activity#perform_transactions'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/a_p/activity.rb:26:in 'DiscourseActivityPub::AP::Activity#process'
/var/www/discourse/plugins/discourse-activity-pub/app/jobs/regular/discourse_activity_pub/process.rb:16:in 'block in Jobs::DiscourseActivityPub::Process#execute'
/var/www/discourse/lib/distributed_mutex.rb:53:in 'block in DistributedMutex#synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in 'Thread::Mutex#synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in 'DistributedMutex#synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in 'DistributedMutex.synchronize'
/var/www/discourse/plugins/discourse-activity-pub/app/jobs/regular/discourse_activity_pub/process.rb:9:in 'Jobs::DiscourseActivityPub::Process#execute'
/var/www/discourse/app/jobs/base.rb:313:in 'block (2 levels) in Jobs::Base#perform'
rails_multisite-9.0.0/lib/rails_multisite/connection_management/null_instance.rb:54:in 'RailsMultisite::ConnectionManagement::NullInstance#with_connection'
rails_multisite-9.0.0/lib/rails_multisite/connection_management.rb:23:in 'RailsMultisite::ConnectionManagement.with_connection'
/var/www/discourse/app/jobs/base.rb:300:in 'block in Jobs::Base#perform'
/var/www/discourse/app/jobs/base.rb:297:in 'Array#each'
/var/www/discourse/app/jobs/base.rb:297:in 'Jobs::Base#perform'
sidekiq-7.3.10/lib/sidekiq/processor.rb:220:in 'Sidekiq::Processor#execute_job'
sidekiq-7.3.10/lib/sidekiq/processor.rb:185:in 'block (4 levels) in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:180:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/suppress_user_email_errors.rb:6:in 'Sidekiq::SuppressUserEmailErrors#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/discourse_event.rb:6:in 'Sidekiq::DiscourseEvent#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:136:in 'Sidekiq::Pausable#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/job/interrupt_handler.rb:9:in 'Sidekiq::Job::InterruptHandler#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:26:in 'Sidekiq::Metrics::ExecutionTracker#track'
sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:134:in 'Sidekiq::Metrics::Middleware#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:173:in 'Sidekiq::Middleware::Chain#invoke'
sidekiq-7.3.10/lib/sidekiq/processor.rb:184:in 'block (3 levels) in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:145:in 'block (6 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_retry.rb:118:in 'Sidekiq::JobRetry#local'
sidekiq-7.3.10/lib/sidekiq/processor.rb:144:in 'block (5 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/config.rb:39:in 'block in <class:Config>'
sidekiq-7.3.10/lib/sidekiq/processor.rb:139:in 'block (4 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/processor.rb:281:in 'Sidekiq::Processor#stats'
sidekiq-7.3.10/lib/sidekiq/processor.rb:134:in 'block (3 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_logger.rb:15:in 'Sidekiq::JobLogger#call'
sidekiq-7.3.10/lib/sidekiq/processor.rb:133:in 'block (2 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_retry.rb:85:in 'Sidekiq::JobRetry#global'
sidekiq-7.3.10/lib/sidekiq/processor.rb:132:in 'block in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_logger.rb:40:in 'Sidekiq::JobLogger#prepare'
sidekiq-7.3.10/lib/sidekiq/processor.rb:131:in 'Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/processor.rb:183:in 'block (2 levels) in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'Thread.handle_interrupt'
sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'block in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Thread.handle_interrupt'
sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:86:in 'Sidekiq::Processor#process_one'
sidekiq-7.3.10/lib

셀프 호스팅 환경이며, 2026.10.0-latest (+458 commits, 어제 밤에 업그레이드됨)를 사용하고 있습니다. 직전 업그레이드 전까지는 정상적으로 작동했습니다.

이미지에 대해 죄송합니다. 그런데 이거 관련 있는 건가요?

Mastodon에서 Discourse로의 연동이 Mastodon 인스턴스가 5.0.0으로 업데이트되면 깨지는 것 같습니다. 그렇다면 결국 이건 Mastodon의 버그일 수도 있겠네요… 하지만 제 실력으로는 어떻게 되는지 알 수 없습니다.

수정

제 추측이 틀렸습니다. Mastodon 버전은 중요하지 않습니다. 팔로우 중인 액터의 해당 투트(toot)에 링크가 있으면 Discourse로 연동되지 않고 json= 오류가 발생했습니다.

이 문제가 Mastodon 쪽인지 Discourse 쪽인지 확실히 알아야 합니다…