DISCOURSE_S3_CDN_URL 설정에도 S3에서 다운로드가 발생하는 문제

Configure an S3 compatible object storage provider for uploads 가이드를 따라 업로드 저장용으로 Backblaze B2를 설정했는데, 이상한 문제가 발생하고 있습니다.

쓰레드를 만들고 이미지를 업로드하면 img src가 S3_CDN_URL로 설정됩니다. 하지만 zip 파일을 업로드하면 URL이 /uploads로 설정되고, S3_CDN_URL을 사용하지 않고 버킷으로 직접 리디렉션됩니다. DISCOURSE_CDN_URL은 설정되어 있지 않으며, 가이드에서는 이 설정이 해당 문제에 영향을 주지 않는다고 명시하고 있습니다.

관련 설정은 다음과 같습니다:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-west-000"
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  DISCOURSE_S3_ENDPOINT: "https://s3.us-west-000.backblazeb2.com"
  DISCOURSE_S3_ACCESS_KEY_ID: "ID"
  DISCOURSE_S3_SECRET_ACCESS_KEY: "KEY"
  DISCOURSE_S3_CDN_URL: "https://devforum-b2-cdn.freetls.fastly.net"
  DISCOURSE_S3_BUCKET: "bucket-name"
  DISCOURSE_S3_BACKUP_BUCKET: "backup-bucket/devforum"
  DISCOURSE_BACKUP_LOCATION: s3

왜 zip 파일은 이미지와 다르게 처리되는 것일까요?

이 저장소 문제와 그 설정은 수년 동안 정말 큰 도전이었습니다.

저는 이미지를 AWS S3에 저장하고 있었는데, 이후 저장소를 로컬 서버로 다시 변경했습니다. 그런데 갑자기 수백 장의 이미지가 사라졌습니다.

이것은 질문에 대한 직접적인 답변이나 댓글은 아니지만, 비슷한 문제를 겪고 있는 분들에게 공감의 마음을 전하고 싶었습니다.

사이트 설정 확인: S3 use CDN URL for all uploads

이미지뿐 아니라 S3에 업로드된 모든 파일에 대해 CDN URL을 사용하세요.

감사합니다.
이 일을 제 지인 중 한 명에게 맡겼습니다. 현재 확인 중입니다.
다만, 질문을 받고 방금 이 옵션을 선택했습니다. Use CDN URL for all the files uploaded to s3 instead of only for images.

하지만 다른 문제도 있는 것 같습니다. 그가 S3 스토리지를 로컬 서버로 이동시켰는데, 이제 사진 10장이 있던 기존 게시물 중 절반 정도만 표시되고 나머지 절반은 표시되지 않습니다. (이러한 토픽의 예시)

그는 이번 주말에 이 문제를 해결하기 위해 작업할 예정입니다.



그에게 묻기 전에, 저는 어리석게도 모든 이미지가 백업에 포함되도록 하는 옵션을 선택한 뒤, 그 백업을 복원했습니다. 이렇게 하면 이미지가 로컬 서버로 복원되어 S3에서 모든 이미지를 로컬로 옮기는 데 충분할 것이라고 생각했기 때문입니다.
하지만 생각만큼 단순하지 않다는 것을 깨닫고 있습니다(메타의 관련 토픽들에서 확인하고 있습니다).

죄송합니다. 다른 문제에 대해 말씀드린 것이었습니다.

당신의 문제는 훨씬 더 복잡할 것 같습니다.

정말 복잡한 일이네요.

그 게시물에 이미지가 없는 이유는 업로드(Upload) 레코드가 존재하지 않기 때문이라고 생각합니다. 따라서 그 이미지를 되찾기 위해 어떤 조치를 취해야 할 것입니다. 제 추측이 틀릴 수도 있습니다.

제가 맞다면, 이전에 제가 비슷한 문제로 생각했던 문제를 어떻게 해결했는지 알려드리겠습니다. 이 스크립트 외에 무료 지원은 제공하지 않습니다.

def process_uploads
  begin
    # 파일명 목록 읽기
    filenames = File.readlines('/shared/uploads/allfiles.txt').map(&:strip)
    count = 0

    filenames.each do |filename|
      # 파일명에 /shared 접두사 붙이기
      filename.gsub!(/\.\//,"")
      full_path = File.join('/shared/uploads/default/original/', filename)

      begin
        # 경로가 존재하고 일반 파일(디렉터리 아님)인지 확인
        count += 1
        
        if File.exist?(full_path) && File.file?(full_path)
          # 파일 열기
          File.open(full_path, 'r') do |tempfile|
            # 지정된 매개변수를 사용하여 업로드 생성
            u = UploadCreator.new(tempfile, 'imported', {}).create_for(-1)
            puts "#{count} -- #{u.id}: #{u.url}"
          end
        else
          puts "경고: 경로를 찾지 못했거나 일반 파일이 아닙니다: #{full_path}"
        end
      rescue => e
        puts "파일 #{full_path} 처리 중 오류 발생: #{e.message}"
        # 현재 파일이 실패해도 다음 파일로 계속 진행
        next
      end
    end
  rescue Errno::ENOENT
    puts "오류: files.txt를 찾을 수 없습니다"
  rescue => e
    puts "files.txt 읽기 중 오류 발생: #{e.message}"
  end
end

# 처리 실행
process_uploads;