Migrate_from_s3: 해당 작업을 실행하려면 S3 업로드를 비활성화해야 합니다

S3에서 모든 데이터를 내 서버로 되돌리는 작업을 시도하고 있습니다. 하지만 rake uploads:migrate_from_s3를 실행하면 You must disable S3 uploads before running that task라는 오류가 반환됩니다. 그래서 Discourse 설정에서 enable s3 uploads 옵션의 체크를 해제하고, app.yml 파일에도 DISCOURSE_USE_S3: false를 추가했습니다. 하지만 여전히 같은 오류가 발생합니다.

[1] pry(main)> SiteSetting.enable_s3_uploads
=> false
[2] pry(main)> GlobalSetting.use_s3
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true

상황이 이해가 되지 않습니다. 어떻게 비활성화해야 할까요?

app.yml 파일에 S3 환경 변수가 포함되어 있나요? S3 업로드를 비활성화하려면 해당 변수를 확인해야 할 수 있습니다.

S3 환경 변수란 무엇인가요? 제 경우, DISCOURSE_USE_S3는 env 아래에 유지됩니다.

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  UNICORN_WORKERS: 2

  ## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
  DISCOURSE_HOSTNAME: engineersasylum.com

  ## 컨테이너를 위에서 지정된 동일한 호스트 이름(-h 옵션)으로 시작하려면 주석 해제(기본값 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 초기 가입 시 관리자 및 개발자로 지정될 쉼표로 구분된 이메일 목록 예: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'praveen369gen@gmail.com'

  #S3 설정
  DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKxxxxxxxxxxxxxxxxxxxxxDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: QWVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLigGs
  DISCOURSE_S3_BUCKET: enginxxxxxxxxxxket
  DISCOURSE_S3_BACKUP_BUCKET: enginxxxxxxxxxxxxcket
  DISCOURSE_BACKUP_LOCATION: s3

… 그리고 @Pravi님, yml 파일의 대부분의 변수를 변경한 후에는 컨테이너(앱)를 다시 빌드해야 한다는 것을 잊지 마세요. 일부 변수는 컨테이너를 중지하고 다시 시작하는 것만으로 변경될 수 있지만, 확실하지 않을 경우 yml 파일을 변경한 후에는 컨테이너(앱)를 다시 빌드하는 것이 좋습니다.

app.yml 파일이 변경될 때마다 컨테이너를 다시 빌드합니다. 그런데도 여전히 꺼져 있습니다.

백업 위치를 로컬로 변경해 보세요?
도움이 될지 확실하지는 않지만, 그게 제 최선의 선택이 될 것 같습니다.

백업 위치에 local을 추가한 후 컨테이너를 다시 빌드하고 마이그레이션을 시도했지만 여전히 성공하지 못했습니다. 해당 작업을 실행하기 전에 S3 업로드를 비활성화해야 합니다라는 오류가 발생하고 있습니다.

죄송합니다. 이 문제가 발생하는 원인을 정확히 알지 못하겠습니다.

yml 파일에 DISCOURSE_USE_S3=false를 설정하고 다시 빌드한 후, rake 작업을 실행했는데도 여전히 "S3 업로드를 비활성화해야 합니다"라는 메시지가 표시됩니까? 관리 패널에 들어가서 거기서도 S3를 비활성화하셨나요?

현재 다음 코드의 출력은 무엇인가요?

SiteSetting.Upload.enable_s3_uploads
SiteSetting.enable_s3_uploads
GlobalSetting.use_s3?

GlobalSetting.use_s3?의 로직은 환경 변수를 동일한 방식으로 사용하지 않습니다. 다음을 사용합니다:

  def self.use_s3?
    (@use_s3 ||=
      begin
        s3_bucket &&
        s3_region && (
          s3_use_iam_profile || (s3_access_key_id && s3_secret_access_key)
        ) ? :true : :false
      end) == :true
  end

이 부분이 혼란스러울 수 있다는 점을 이해합니다. 담당자에게 확인하도록 하겠습니다.

당분간은 환경 변수의 DISCOURSE_USE_S3와 DISCOURSE_S3_BUCKET을 해제하면 S3에서 마이그레이션할 수 있습니다.

다음과 같은 결과를 얻었습니다.

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)>

네, app.yml에 DISCOURSE_USE_S3=false를 추가하고 컨테이너를 다시 빌드한 뒤 rake 작업을 실행했는데도 여전히 같은 출력이 나옵니다. 네, 관리자 페이지에서 업로드를 비활성화했습니다.

여기서 말한 대로, yml 파일에서도 DISCOURSE_S3_BUCKET을 해제해야 합니다. 아마 앞에 # 기호만 추가하면 될 것입니다.

현재 컨테이너를 다시 구축하고 있습니다. 몇 분 내에 결과를 보고드리겠습니다.

환경 변수를 false로 설정하고 재빌드한 경우 마지막 항목이 어떻게 true가 될 수 있는지 이해가 되지 않습니다. SiteSetting 항목들은 관리자 패널에서 설정된 것이고, GlobalSetting은 app.yml을 통해 설정됩니다.

관리자 패널의 SiteSetting이 비활성화되어 있습니다.

s3

S3 설정

  #DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
  #DISCOURSE_S3_BUCKET: engineers-leakybucket
  DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
  DISCOURSE_BACKUP_LOCATION: s3
  #DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com

DISCOURSE_USE_S3와 DISCOURSE_S3_BUCKET를 해제하면 다음과 같은 오류가 발생합니다.

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads: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'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

업데이트:

DISCOURSE_USE_S3와 DISCOURSE_S3_BUCKET를 해제하기 전에는,

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)> 

DISCOURSE_USE_S3와 DISCOURSE_S3_BUCKET를 해제한 후에는,

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)>

@Pravi 님, 안녕하세요.

네, 방금 말씀드릴려던 내용인데, 이 모든 ENV 변수를 주석 처리하고 아래 내용을 시도해 보세요:

DISCOURSE_USE_S3: false
#DISCOURSE_S3_REGION: ap-south-1
#DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
#DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
##DISCOURSE_S3_BUCKET: engineers-leakybucket
#DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
#DISCOURSE_BACKUP_LOCATION: s3
#DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com 

하지만 그 후 최신 업데이트 내용(세부 사항 감사합니다)을 읽었는데, 진전이 있는 것 같습니다.

진전을 이루신 것을 축하드립니다. 잘하고 계십니다!

저도 그 방법을 시도해 봤습니다. DISCOURSE_USE_S3: false를 제외한 나머지는 모두 주석 처리했는데, 이전과 동일한 오류가 발생합니다.

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads: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'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

SiteSetting과 GlobalSettings는 비활성화되어 있습니다.

root@ip-172-31-7-247-app:/var/www/discourse# rails c
[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)> 

감사합니다. 하지만 진전을 이뤘다고 확신은 못 하겠네요. 이제 이 새로운 오류를 다뤄야 합니다.

이 문제를 해결하는 방법을 아는 분이 계신가요?