백업 생성 또는 백업 내비게이션이 불가능합니다

Getting

The backup has failed.

Here’s the log:

undefined method `start_with?' for nil /var/www/discourse/app/models/site_setting.rb:172:in `use_dualstack_endpoint’
/var/www/discourse/lib/s3_helper.rb:269:in `s3_options' /var/www/discourse/lib/backup_restore/s3_backup_store.rb:14:in `initialize’
/var/www/discourse/lib/backup_restore/backup_store.rb:17:in `new'`


after a very recent rebuild to latest.

In my case S3 is hosted with a vanilla AWS bucket.

Could this be related?

4개의 좋아요

저는 S3에 MinIO 객체 스토리지를 사용하는데 다음과 같은 오류가 발생합니다:

rake aborted!
Aws::S3::Errors::Http504Error: Aws::S3::Errors::Http504Error (Aws::S3::Errors::Http504Error)
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/client.rb:11285:in `list_objects_v2'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/bucket.rb:1304:in `block (2 levels) in objects'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/user_agent.rb:28:in `feature'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/bucket.rb:1303:in `block in objects'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:101:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:101:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:101:in `block in non_empty_batches'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:52:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:52:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:52:in `block in each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:58:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:58:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/resources/collection.rb:58:in `each'
/var/www/discourse/lib/tasks/s3.rake:14:in `map'
/var/www/discourse/lib/tasks/s3.rake:14:in `existing_assets'
/var/www/discourse/lib/tasks/s3.rake:210:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => s3:expire_missing_assets
(See full trace by running task with --trace)
I, [2024-11-11T08:02:51.942337 #1]  INFO -- : Checking for stale S3 assets...

I, [2024-11-11T08:02:51.944197 #1]  INFO -- : Terminating async processes
I, [2024-11-11T08:02:51.944334 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 39
I, [2024-11-11T08:02:51.944432 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 107
2024-11-11 08:02:51.944 UTC [39] LOG:  received fast shutdown request
107:signal-handler (1731312171) Received SIGTERM scheduling shutdown...
2024-11-11 08:02:51.945 UTC [39] LOG:  aborting any active transactions
2024-11-11 08:02:51.949 UTC [39] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2024-11-11 08:02:51.950 UTC [49] LOG:  shutting down
107:M 11 Nov 2024 08:02:51.960 # User requested shutdown...
107:M 11 Nov 2024 08:02:51.960 * Saving the final RDB snapshot before exiting.
2024-11-11 08:02:52.047 UTC [39] LOG:  database system is shut down
107:M 11 Nov 2024 08:02:52.207 * DB saved on disk
107:M 11 Nov 2024 08:02:52.208 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:expire_missing_assets failed with return #<Process::Status: pid 3550 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "cmd"=>["sudo -E -u discourse bundle exec rake s3:upload_assets", "sudo -E -u discourse bundle exec rake s3:expire_missing_assets"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
4f601885ffad64bcd29f6dbd06df1f0f86ad301341d40e752df7447809a32eff

@martin

1개의 좋아요

또 다른 문제는 이제 백업으로 이동할 수 없다는 것입니다:

Error while computing report `storage_stats`: undefined method `start_with?' for nil
/var/www/discourse/app/models/site_setting.rb:172:in `use_dualstack_endpoint'
/var/www/discourse/lib/s3_helper.rb:269:in `s3_options'
2개의 좋아요

이것이 원인이 될 수 있을까요?

[7] pry(main)> SiteSetting.Upload.s3_region
=> nil
[8] pry(main)> SiteSetting.s3_region
=> "eu-west-2"
[9] pry(main)>

내 인스턴스에서 SiteSetting.Upload.s3_region이 비어 있어 starts_with?가 오류를 일으키고 있습니다.

1개의 좋아요

이 PR에서:

스펙에서는 SiteSetting.s3_region을 사용하지만, 코드에서는 SiteSetting.Upload.s3_region을 사용하고 있습니다 :thinking:

2개의 좋아요

@hosna 와 @merefield 님, 둘 다 SiteSetting.enable_s3_uploads가 true인가요? 그렇다면 SiteSetting.s3_region만 사용하면 됩니다:

그렇다면 SiteSetting::Upload.enable_s3_uploads는 어떤 값을 반환하나요?

SiteSetting.Upload.s3_region에 대해 safe navigation을 사용하여 다음과 같은 수정을 할 수 있습니다:

def self.use_dualstack_endpoint
  SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region&.start_with?("cn-")
end

하지만 SiteSetting.Upload.s3_region이 왜 비어 있는지 이해하고 싶습니다.

2개의 좋아요

자, 이게 더 기묘해지는데, 설정이 두 개가 있대요?

image

  • 저는 백업에는 S3를 사용하지만 업로드에는 사용하지 않고 있습니다(이건 유효한 선택이며 수년간 그렇게 해왔죠? )
  • 인터페이스에서 둘 다 활성화하는 것을 강제하지 않습니다.
  • 수년간 어떤 설정도 변경하지 않았습니다.

따라서 업로드를 사용하지 않기 때문에 SiteSetting::Upload.s3_region이 비어 있나요?

비록 부수적인 언급이지만, 업로드는 백업과 함께 묶여서 처리되어야 하지만, SiteSetting.s3_region만으로도 충분할 것 같나요?

제 백업은 여전히 실패하고 있습니다

3개의 좋아요

이 설정을 말씀하시는 거라면, 제 환경에서는 활성화되어 있지 않습니다.

app.yml 파일에서 S3를 다음과 같이 설정했습니다.

여기에 언급된 내용입니다.

@martin

3개의 좋아요

위에서 언급된 동일한 문제를 보고하기 위해 게시합니다. /admin/backups에 접근할 수 없습니다(에러 500), 백업이 실패했습니다.

S3 백업은 활성화되어 있지만 S3 업로드는 비활성화되어 있습니다. 수년 동안 이 상태로 성공적으로 운영되어 왔습니다.

Error log
### Message (14 copies reported)

Error while computing report `storage_stats`: undefined method `start_with?' for nil /var/www/discourse/app/models/site_setting.rb:172:in `use_dualstack_endpoint' /var/www/discourse/lib/s3_helper.rb:269:in `s3_options' /var/www/discourse/lib/backup_restore/s3_backup_store.rb:14:in `initialize' /var/www/discourse/lib/backup_restore/backup_store.rb:17:in `new' /var/www/discourse/lib/backup_restore/backup_store.rb:17:in `create' /var/www/discourse/app/models/concerns/reports/storage_stats.rb:10:in `report_storage_stats' /var/www/discourse/app/models/report.rb:269:in `public_send' /var/www/discourse/app/models/report.rb:269:in `block in find' /var/www/discourse/app/models/report.rb:165:in `block in wrap_slow_query' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.5/lib/active_record/connection_adapters/abstract/transaction.rb:535:in `block in within_new_transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.1.5/lib/active_support/concurrency/null_lock.rb:9:in `synchronize' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.1.5/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.5/lib/active_record/connection_adapters/abstract/database_statements.rb:344:in `transaction' /var/www/discourse/app/models/report.rb:160:in `wrap_slow_query' /var/www/discourse/app/models/report.rb:267:in `find' /var/www/discourse/app/controllers/admin/reports_controller.rb:97:in `block (2 levels) in bulk' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:400:in `block in each_pair' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair' /var/www/discourse/app/contro...

### Backtrace

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:134:in `block in error'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:231:in `each'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:231:in `dispatch'

activesupport-7.1.5/lib/active_support/broadcast_logger.rb:134:in `error'

/var/www/discourse/app/models/report.rb:295:in `rescue in find'

/var/www/discourse/app/models/report.rb:262:in `find'

/var/www/discourse/app/controllers/admin/reports_controller.rb:97:in `block (2 levels) in bulk'

actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:400:in `block in each_pair'

actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair'

actionpack-7.1.5/lib/action_controller/metal/strong_parameters.rb:399:in `each_pair'

/var/www/discourse/app/controllers/admin/reports_controller.rb:76:in `block in bulk'

/var/www/discourse/lib/hijack.rb:64:in `instance_eval'

/var/www/discourse/lib/hijack.rb:64:in `block in hijack'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:797:in `call_callback'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve_with'

concurrent-ruby-1.3.4/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve'

/var/www/discourse/lib/scheduler/defer.rb:115:in `block in do_work'

rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'

rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'

/var/www/discourse/lib/scheduler/defer.rb:109:in `do_work'

/var/www/discourse/lib/scheduler/defer.rb:97:in `block (2 levels) in start_thread'

### Env

1/14

|hostname|forum-app|
| --- | --- |
|process_id|849|
|application_version|234133bd3b0750b2675a1c2c6745616c899df990|
|HTTP_HOST|forum.glasair-owners.com|
|REQUEST_METHOD|GET|
|HTTP_USER_AGENT|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36|
|HTTP_ACCEPT|application/json, text/javascript, */*; q=0.01|
|HTTP_REFERER|https://forum.glasair-owners.com/admin|
|HTTP_X_FORWARDED_FOR|xxx|
|HTTP_X_REAL_IP|xxx|
|username|xxx|
|time|6:47 pm|
||params null|
2개의 좋아요

여기서도 같은 문제가 있습니다…

3개의 좋아요

아니요. 그게 문제인 것 같습니다. S3를 백업에는 사용하지만 업로드에는 사용하지 않는 설정인데, 이는 셀프호스터들 사이에서 꽤 일반적인 구성입니다. S3 백업 설정은 간단하고, 에셋을 사전 컴파일하기 위해 CDN이나 YML 파일을 변경할 필요가 없습니다.

업로드에 S3를 사용하지 않기 때문에 비어 있습니다.

      SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

위 GitHub 링크의 코드는 다음으로 되어야 합니다.

      GlobalSettings.use_s3 && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

아니면

      SiteSetting.enable_s3_uploads && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

use_s3와 enable_s3_uploads가 어떻게 연결되어 있는지 정확히 모르겠습니다.

4개의 좋아요

그리고 나는

이 부분이 실제로는 def self.enable_s3_uploads?가 되어야 한다고 생각합니다(왜냐하면 s3 업로드를 활성화하는 것이 아니라 s3 업로드가 활성화되어 있는지 보고하기 때문이죠). 그리고 그 다음에

  SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

은

  use_s3_uploads? && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

이어야 합니다.

하지만 다른 한편으로는, Sam이 7년 전에 그렇게 이름을 지었고, 지금까지 잘 작동해 온 것 같습니다.:slight_smile:

그래서, 현재 함수 이름에 맞춰서

  use_s3_uploads && SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")
5개의 좋아요

여기서는 다음과 같이 되어야 하는 것 아닌가요?:

use_s3_uploads? && !SiteSetting.Upload.s3_endpoint.blank? && !SiteSetting.Upload.s3_region.start_with?("cn-")

즉, s3 업로드 엔드포인트가 비어 있지 않은 상태가 되어야 한다는 뜻이죠?

3개의 좋아요

하지만 저도 업로드에 S3를 사용합니다. app.yml 파일에서 설정했습니다.

3개의 좋아요

저도 같은 상황입니다. 스토리지 제공업체에 로그인해서 요금을 납부했는지 확인해 봤는데, 납부해 두었더라고요.

왜 아무런 공지 없이 이렇게 호환성이 깨지는 변경사항이 적용된 걸까요?

이제 모든 세부 정보를 app.yml에 입력해야 하나요?

관리자 백엔드에서 모든 설정이 삭제된 이유는 무엇인가요? 어떻게 그 설정들을 가져올 수 있나요? 몇 년 전에 한 번 설정해 두었기 때문에 제 키나 시크릿이 뭔지 전혀 모르겠고, 키를 재설정하지 않고 이 정보를 가져올 수 있을지도 확신할 수 없습니다(키를 재설정하면 같은 S3 엔드포인트를 사용하는 다른 서비스에도 영향을 미치거든요…).

2개의 좋아요

UI에서 설정(백업 위치, 빈도, S3 버킷 등)은 여전히 존재하는 것 같습니다. 다만 이전과 같은 방식으로 작동하지 않고 있을 뿐입니다.

이것은 의도적인 기능 변경이라기보다는 단순히 고장 난 것 같습니다.

S3에 업로드를 저장하지 않고도 S3로 백업하는 것은 여전히 가능해야 합니다. 이 둘은 다소 관련은 있지만 결국 별개의 사용 사례이므로 …

5개의 좋아요

같은 문제입니다
업로드가 아니라 백업용으로 S3를 사용했습니다

2개의 좋아요

아무것도 깨지지 않을 것이라고 생각했기 때문이지만, s3 코드는 수많은 엣지 케이스를 지원해야 합니다. 해당 코드를 직접 작성했거나 수년간 개발 과정을 주시하지 않았다면, 실제로 문제가 얼마나 큰지 파악하기가 매우 어렵습니다.

3개의 좋아요

모두 죄송합니다. 며칠 동안 병가를 썼습니다. 이 방법으로 문제를 해결할 수 있을 것입니다:

수정 전후로 S3 업로드를 비활성화하고 S3 백업을 활성화한 상태로 로컬에서 테스트해 보았으며, 동일한 오류를 재현한 후 해결할 수 있었습니다.

7개의 좋아요

재구축 및 백업이 성공적으로 완료되었습니다.

@martin 감사합니다.

4개의 좋아요