Defining DISCOURSE_S3_CDN_URL links to assets in S3 CDN URL

여기에서 어떤 변수를 설정하는지 확인할 수 있습니다: https://github.com/debtcollective/infra/blob/master/modules/services/discourse/web.yml

다음은 S3/CDN 관련으로 설정하는 변수들입니다.

  • DISCOURSE_CDN_URL
  • DISCOURSE_S3_ACCESS_KEY_ID
  • DISCOURSE_S3_BACKUP_BUCKET
  • DISCOURSE_S3_CDN_URL
  • DISCOURSE_S3_REGION
  • DISCOURSE_S3_SECRET_ACCESS_KEY
  • DISCOURSE_S3_UPLOAD_BUCKET
  • USE_DB_S3_CONFIG: true

DISCOURSE_S3_BUCKET은 DISCOURSE_S3_UPLOAD_BUCKET과 DISCOURSE_S3_BACKUP_BUCKET으로 대체되어 더 이상 사용되지 않는 것으로 보입니다. 대신 이 변수들을 설정해야 합니다.

그렇게 생각했는데, DISCOURSE_S3_UPLOAD_BUCKET와 DISCOURSE_S3_BUCKET 둘 다 설정해야만 다음 단계로 나아갈 수 있습니다. 위에 게시된 코드 스니펫에서 볼 수 있듯이 use_s3?는 여전히 s3_upload_bucket이 아니라 s3_bucket을 찾고 있습니다.

제가 아는 한, DISCOURSE_BACKUP_BUCKET을 설정해도 이 문제가 해결되지 않습니다.

두 버킷 환경 변수를 모두 설정하면 한 단계 더 나아갈 수 있지만, 이제 Discourse가 제 S3 CDN URL을 무시하고 기본 경로(base path)에서 자산을 로드하려는 새로운 문제에 부딪혔습니다. 이로 인해 CSP(Content Security Policy) 오류가 발생하고 있는데, CSP에는 제 S3 CDN의 자산 경로만 포함되어 있기 때문입니다.

DISCOURSE_S3_BACKUP_BUCKET을 DISCOURSE_BACKUP_BUCKET 대신 사용해야 합니다. 그 외에는 두 개의 CloudFront 배포를 설정하면서 모든 변수를 설정한다면 작동할 것입니다. 저희 설정을 보면 DISCOURSE_S3_BUCKET을 정의하지 않고 있습니다.

재베이(rebake)가 필요한지도 확실하지 않습니다.

@Falco 기억이 맞다면, 이 문제를 매우 직관적이지 않게 만드는 요인 중 하나는 DISCOURSE_S3_CDN_URL을 환경 변수/GlobalSetting으로 설정할 때와 SiteSetting으로 설정할 때 동작에 차이가 있다는 점입니다. 아마 howto 글에서 이 부분을 주의 깊게 다뤄야 할 것 같습니다.

네, 죄송합니다. 이전 게시물에 오타가 있었습니다. 제 환경에서는 DISCOURSE_S3_BACKUP_BUCKET이 GlobalSetting의 s3_bucket을 설정하지 않습니다. DISCOURSE_S3_BUCKET을 설정하지 않고 어떻게 해당 rake 작업을 실행하고 계신지 모르겠습니다.

그리고 도움 주셔서 정말 감사드립니다. 이 문제는 당신의 책임이 아니라는 것도 잘 알고 있으니, 다시 한번 감사드립니다.

걱정하지 마세요, 문제가 아닙니다. app.yml 파일에서 USE_DB_S3_CONFIG: true도 정의하고 있다는 점을 언급하지 못한 것을 잊어버렸네요. https://github.com/debtcollective/infra/blob/master/modules/services/discourse/web.yml#L32

S3 버킷이 정의되는 방식을 변경하기 때문에(discourse/lib/tasks/s3.rake at 427d54b2b00fa94474c0522eaed750452c4e7f43 · discourse/discourse · GitHub) 말씀이 맞으신 것 같고, 아마도 버그일 가능성이 높습니다.

해당 설정을 적용해 보시면 해결되는지 확인해 주세요.

안녕하세요 @eatcodetravel, 훌륭한 글 감사합니다.

지금 @eatcodetravel 님처럼 CloudFront를 설정하려고 하고 있습니다.

에셋 폴더를 S3 버킷에 직접 업로드해야 하는지, 아니면 자동으로 업로드되는 건지 궁금합니다.

Discourse 업데이트 이후에는 어떻게 되나요? 자동으로 업로드되지 않는다면 테마를 다시 업로드해야 하는 건가요?

감사합니다.

물론입니다.

def ensure_s3_configured!
  unless GlobalSetting.use_s3? || use_db_s3_config
    STDERR.puts "ERROR: Ensure S3 is configured in config/discourse.conf or environment vars"
    exit 1
  end
end

use_db_s3_config는 그 추가 변수를 설정할 필요가 없게 해 줍니다. 이는 global_setting.rb의 버그일 수 있습니다. DISCOURSE_S3_UPLOAD_BUCKET만 설정하면 충분해야 하는데, DISCOURSE_S3_BUCKET와 차이가 없다면 그렇다는 뜻입니다. 다만 후자가 비권장(deprecated)되어야 한다는 당신의 의견에 동의합니다.

global_setting.rb의 버그 여부와 관계없이, 모든 변수를 선언했고 DISCOURSE_ENABLE_S3_UPLOADS가 true로 설정되어 있음에도 불구하고, Discourse가 자산을 S3 CDN이 아닌 원래 위치에 있는 것처럼 찾는 문제가 여전히 발생하고 있습니다.

이 작업을 위한 bundle exec rake uploads:migrate_to_s3 태스크가 있습니다. 버킷을 설정한 후에는 업로드 파일을 S3로 이동하기 위해 해당 태스크를 실행해야 합니다. 최근 몇 달간 S3/CDN이 변경되어 문서가 최신 상태가 아니므로, 문제가 발생했을 때를 대비하여 백업을 진행하고 준비해 두시기 바랍니다.

처음 이 기능을 활성화했을 때 모든 것을 파악하는 동안 일부 다운타임이 발생했습니다.

아마도 DISCOURSE_CDN_URL이 누락되어 그런 것 같습니다. 저희 설정에서는 다음과 같이 되어 있습니다.

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # 서버를 가리킴
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # S3 버킷을 가리킴

스타일시트는 서버에서 가져오므로 DISCOURSE_CDN_URL을 사용합니다. JavaScript는 S3 버킷에 업로드되며 DISCOURSE_S3_CDN_URL을 사용합니다. @Falco 님이 여기서 저에게 이 부분을 설명해 주셨습니다.

네, 그거 봤어요. DISCORNSE_CDN_URL을 설정했는데도 같은 문제가 계속됩니다. 하지만 피곤해서 이것저것 만지다가 뭔가 놓친 것 같기도 해요. 내일 다시 이어서 진행하겠습니다. 도움 주셔서 감사합니다.

이것이 업로드 파일을 이미지로, 에셋을 JS 파일로 S3에 모두 업로드하는 건가요? 그리고 CloudFront URL을 사용해야 하나요, 아니면 S3만으로도 충분한가요? 도움 주셔서 감사합니다.

bundle exec rake uploads:migrate_to_s3는 첨부 파일만 S3로 업로드하며, 이 작업은 한 번만 실행해야 합니다. S3를 활성화한 후 새 업로드 파일은 S3 버킷에 저장됩니다.

에셋을 업로드하려면 bundle exec rake s3:upload_assets를 사용해야 하며, 이는 모든 재빌드/업그레이드 후에 실행해야 합니다.

말씀하신 대로 진행했고, S3(이미지 등) 업로드는 성공적으로 이루어졌습니다. 하지만 assets의 경우 아래 오류가 발생합니다.

ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

두 가지를 모두 설정했는데

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # 이 항목은 서버를 가리킴
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # 이 항목은 S3 버킷을 가리킴

아마도 USE_DB_S3_CONFIG: true와 관련이 있을 수 있습니다. 해당 변수를 설정해 보시고 작동하는지 확인해 보세요.

S3/CDN과 관련하여 제가 설정한 모든 변수는 다음과 같습니다.

네, 감사합니다 :slightly_smiling_face:. 문제 해결되었습니다.

흥미로운 문제가 하나 있습니다. Discourse가 잘못된 경로에서 에셋 파일을 찾으려 합니다. brotli_asset 경로를 통해 접근을 시도하지만, S3 버킷에는 해당 경로가 없습니다.

또한 CDN URL을 통해 JavaScript와 스타일시트 파일을 찾으려 하지만, 버킷에는 이 파일들도 없습니다.

@ufukayyildiz 질문하신 문제들의 답은 이 스레드에 다 있다고 생각합니다. 저는 방금 동일한 설정을 그대로 진행해 봤거든요.

요약하자면, 에셋을 사전 컴파일한 후에 업로드했는지 확인해야 합니다.

잠깐,
한 가지 이해가 되지 않습니다.

왜 이 데이터를 ENV에 설정해야 하는가요?

제 예를 들어 설명하겠습니다.

관리자 패널에서 데이터를 S3로 설정하면 모든 것이 정상적으로 작동하고 모든 것이 S3로 로드됩니다. ENV에는 아무 설정도 하지 않았습니다. 이것이 잘못된 건가요? 모든 것이 정상적으로 작동하는데도 ENV 설정이 필요한가요?

두 번째 예시는 상황이 다릅니다. 기존 데이터를 S3로 마이그레이션할 수 없고(새 데이터만 작동합니다) 여기서 app.yml 파일에 이 데이터를 입력해도(DISCOURSE_S3_ACCESS_KEY_ID: ‘key’ 등) 아무 변화가 없고 여전히 작동하지 않습니다. (즉,

rake uploads:migrate_to_s3

명령어가 작동하지 않습니다)

이 부분을 설명해 주실 수 있나요?

아니요, 환경 변수는 관리 패널에 접근할 수 없거나 같은 상황에서 이 설정들을 구성할 수 있는 추가적인 방법을 제공합니다.