Приоритет/Серьезность:
Высокий для самохостинговых инстансов, использующих хранилище резервных копий, совместимое с S3, поскольку запланированные резервные копии не удаются после создания архива.
Платформа:
Самохостинговый Discourse на последней ветке.
Текущая рабочая версия при наблюдении: v2026.4.0-latest
Ruby: 3.4.0
aws-sdk-s3: 1.182.0
Описание:
Резервное копирование в Cloudflare R2 завершается ошибкой на финальном этапе «Загрузка архива…».
Создание дамп базы данных и локального архива проходит успешно, но загрузка multipart-архива готового резервного копирования завершается ошибкой.
Фактический результат:
Резервное копирование завершается ошибкой с сообщением:
EXCEPTION: multipart upload failed: undefined method 'downcase' for nil
Стек вызовов включает:
aws-sdk-s3-1.182.0/lib/aws-sdk-s3/multipart_file_uploader.rb
lib/backup_restore/s3_backup_store.rb:48
lib/backup_restore/creator.rb:434
Ожидаемый результат:
Архив резервной копии должен успешно загружаться в настроенное хранилище резервных копий, совместимое с S3.
Шаги для воспроизведения:
- Настройте хранилище резервных копий на Cloudflare R2, используя путь к резервному копированию, совместимый с S3.
- Используйте архив резервной копии, превышающий порог multipart-загрузки.
- Запустите ручное или запланированное резервное копирование.
- Наблюдайте ошибку на этапе «Загрузка архива…».
Актуальная конфигурация:
- DISCOURSE_BACKUP_LOCATION=s3
- DISCOURSE_S3_ENDPOINT=https://.r2.cloudflarestorage.com
- DISCOURSE_S3_FORCE_PATH_STYLE=true
- DISCOURSE_S3_BACKUP_BUCKET=
- AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED
- AWS_RESPONSE_CHECKSUM_VALIDATION=WHEN_REQUIRED
Фрагмент наблюдаемого стека вызовов:
algorithm = resp.context.params[:checksum_algorithm]
k = "checksum_#{algorithm.downcase}".to_sym
Это указывает на то, что checksum_algorithm равен nil в пути multipart-загрузки.
Дополнительный контекст:
Существует похожая недавняя тема на Meta для Backblaze B2:
Кроме того, записи в changelog aws-sdk-s3 после версии 1.182.0 кажутся актуальными:
- 1.201.0: Исправлена multipart-загрузка для учета режима request_checksum_calculation WHEN_REQUIRED
- 1.210.2: При использовании пользовательских конечных точек или провайдеров конечных точек для операций PutObject и UploadPart выполняется переход к заголовочным контрольным суммам запросов
Discourse main по-прежнему, судя по всему, фиксирует версию aws-sdk-s3 на 1.182.0:
https://raw.githubusercontent.com/discourse/discourse/main/Gemfile.lock