DISCOURSE_S3_CDN_URL を設定している場合でも、S3 からのダウンロード

I followed the guide at Using Object Storage for Uploads (S3 & Clones) 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?

「いいね!」 1

このストレージの仕組みとその設定は、長年にわたって大きな課題です。

私は画像をAws S3に保存していましたが、その後ストレージをローカルサーバーに戻しました。そうすると、突然何百枚もの画像が消えてしまいました。

これはあなたの質問への直接的な返答やコメントではありませんが、似たような問題に対して共感を示したいだけです。

サイト設定を確認してください:S3 全てのアップロードに CDN URL を使用

画像だけでなく、アップロードされた全てのファイルに CDN URL を使用します。

「いいね!」 1

ありがとうございます。
地元の友人に仕事を依頼しました。彼は現在対応中です。
ただ、あなたに尋ねられたので、今このオプションを選択しました。「Use CDN URL for all the files uploaded to s3 instead of only for images.

しかし、別の問題があるようです。彼はS3ストレージをローカルサーバーに移行しました。そのため、私の古い投稿の多くで、写真が10枚あった場合、半分が表示され、残りの半分が表示されなくなっています(そのようなトピックの例)。

彼は来週末にこれを解決するために作業する予定です。



彼に依頼する前に、私は単純にすべての画像をバックアップに含めるオプションを選択し、そのバックアップを復元しました。これにより、すべての画像をS3からローカルサーバーに移行できると考えていました。
しかし、これはそれほど単純ではありません(metaの多くの関連トピックで調べているように)。

すみません。別の問題について話していました。

そちらは、かなり複雑だと思います。

確かにそれは複雑ですね。

その投稿で画像が失われたのは、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;
「いいね!」 1