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

I followed the guide at Configure an S3 compatible object storage provider for uploads to set up Backblaze B2 for upload storage and I’m seeing a strange problem.

If I create a thread and upload an image the img src is set to my S3_CDN_URL. If I upload a zip file the URL is at /uploads and redirect directly to my bucket instead of using the S3_CDN_URL. I do not have DISCOURSE_CDN_URL set - the guide indicate it doesn’t affect this issue.

Me relevant settings are:

  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

Why would zip files be handled differently than images?

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

저는 이미지를 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;