전역 설정과 사이트 설정 간 S3 구성 차이

저희는 몇 달 전에 인스턴스를 처음 생성한 후, S3(저희 경우 Digital Ocean Spaces)를 관리자 설정을 통해서만, app.yml 파일의 DISCOURSE_ 설정 옵션 없이 잠깐 동안 활성화해 두었습니다. 모든 것을 S3로 마이그레이션하지는 않았지만, 이미지 대부분은 S3가 활성화되어 있을 때 작성되었습니다. 이제 여러 이유로(여기서는 중요하지 않은) S3에서 모든 것을 마이그레이션하고 싶습니다.

(지금까지 지원 요청처럼 들릴 수 있지만, 실제로는 아닙니다…)

최근 병합된 PR에서 uploads:migrate_from_s3의 단순 래퍼인 rake 태스크 uploads:batch_migrate_from_s3를 추가하여, 게시글 1개 분량의 이미지처럼 아주 작은 배치로도 마이그레이션할 수 있게 했고, 이를 실행했습니다. 이 시점에서 제 태스크가 호출하는 upload:migrate_from_s3가 UI에서 사용할 수 없는 S3 설정이 discourse.conf에 있다고 가정하고 있음을 발견했습니다:

** Invoke uploads:batch_migrate_from_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:batch_migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'

최선의 해결책은 무엇일까요?

  1. S3 설정은 항상 app.yml 파일의 DISCOURSE_ 환경 변수를 통해 수행되고 컨테이너 빌드 시 config/discourse.conf에 기록되는 것이 기대되는 것이며, 이제 그 작업을 하고 앱을 다시 빌드해야 한다는 것입니다. (여기서 rake에 대한 환경 변수 입력이 GlobalSettings를 설정하지 않는 것 같다는 점을 주목합니다. 그것도 시도해 보았습니다. 아마도 SiteSettings만 설정되어서 아무것도 작동한 것은 과소평가되고 의도치 않은 것일 것입니다.) 기존 컨테이너의 config/discourse.conf에 s3_bucket을 넣어 테스트해 보았더니 오류가 해결되었습니다.
  2. SiteSetting.s3_upload_bucket이 설정되어 있지만 GlobalSetting.s3_bucket이 nil인 경우, GlobalSetting.s3_bucket을 SiteSetting.s3_upload_bucket으로 설정하도록 마이그레이션 태스크를 더 수정합니다 — 이것이 올바른 것으로 간주된다면 어려운 PR이 아닐 것이라 추측하지만, 아직 자세히 살펴본 것은 아닙니다. 수정: uploads:migrate_from_s3에서 GlobalSetting.s3_bucket을 수정해 보았지만, 액세서가 없어서 작동하지 않았습니다.
  3. GlobalSetting.s3_bucket이 nil인 경우 SiteSetting.s3_upload_bucket을 사용하도록 SiteSetting.absolute_base_url을 수정합니다 — 이것이 의도된 올바른 구성인지요?
  4. s3_bucket을 사이트 설정에서 설정할 수 있는 기능을 추가하여 UI에 노출합니다.

첫 번째는 단순한 사이트 구성 문제이며, 아마도 그냥 그렇게 할 것입니다. 두 번째가 좋은 대안으로 간주된다면 PR을 시도해 보겠습니다. 하지만 저는 아직 이곳에서 신참이라, 후자 두 가지처럼 핵심적인 변경을 하는 것에 자신감이 없습니다. 구성 객체가 작동하는 방식에 대한 기대치가 저에게는 다소 불분명합니다.

명확히 하자면: 저는 제 문제를 자명한 방식으로 우회했습니다. 단지 그것이 필요하다는 점이 놀라웠을 뿐입니다.

2개의 좋아요