Загрузка файлов с S3 происходит даже при установленной переменной DISCOURSE_S3_CDN_URL

Я следовал руководству по адресу Configure an S3 compatible object storage provider for uploads, чтобы настроить Backblaze B2 для хранения загружаемых файлов, и столкнулся со странной проблемой.

Если я создаю тему и загружаю изображение, атрибут src тега img указывает на 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. Затем я перенёс хранилище обратно на локальный сервер. Теперь сотни изображений внезапно исчезли.

Хотя это не прямой ответ или комментарий к вашему вопросу, я просто выражаю сочувствие в связи с похожими проблемами.

Смотрите настройки сайта: Использовать URL CDN для всех загрузок в S3

Используйте URL CDN для всех файлов, загружаемых в S3, а не только для изображений.

Спасибо. Я поручил задачу одному своему местному знакомому. Он уже разбирается в этом.

Хотя, следуя вашему вопросу, я только что выбрал эту опцию: Использовать CDN-URL для всех файлов, загруженных в S3, а не только для изображений.

Но, похоже, возникла ещё одна проблема. Он перенёс хранилище S3 на локальный сервер. Теперь многие из моих старых постов, где было 10 фотографий, отображаются лишь частично: примерно половина картинок видна, а половина — нет (пример такой темы).

Он займётся решением этой проблемы в ближайшие выходные.



Ранее, прежде чем проконсультироваться с ним, я наивно выбрал опцию включения всех изображений в резервные копии, а затем восстановил эту копию, полагая, что это вернёт изображения на локальный сервер, и этого будет достаточно для переноса всех моих изображений из S3. Но, как я выяснил, читая множество связанных тем на Meta, всё не так просто.

Извините. Я говорил о другой проблеме.

Ваша, я почти уверен, гораздо сложнее.

Действительно сложно.

Полагаю, отсутствующие изображения в том посте связаны с тем, что запись об загрузке (Upload record) не существует, поэтому вам нужно предпринять какие-то действия, чтобы вернуть это изображение. Возможно, я ошибаюсь.

Если я прав, вот как я решил ранее похожую проблему. Предоставляю только этот скрипт, бесплатная поддержка далее не оказывается.

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;