ToS3MigrationError:上传未迁移到S3,导致附件损坏。如何修复此错误?

FileStore::ToS3MigrationError: 21512 个上传文件中有 182 个尚未迁移至 S3。数据库 ‘default’ 的 S3 迁移失败。

随后是来自 ‘raise_or_log’、‘migration_successful?’、‘migrate_to_s3’、‘migrate’ 以及 ‘block in migrate_to_s3_all_sites’ 的部分堆栈跟踪信息。

我在运行任务 uploads:migrate_to_s3 时两次遇到这些错误。大约 1% 的文件未能成功迁移,导致在重新生成(rebake)后网站上的附件链接损坏。这些问题似乎都出现在我最初创建此 Discourse 实例的头几个月内的旧文件上。

深入检查 S3 存储桶后发现,这些文件似乎确实已成功上传到 S3,只是在重新生成后链接不正确。


重新运行迁移(在再次重新生成之前)似乎以某种原因解决了该问题。尽管在运行 migrate_to_s3 任务期间仍会出现相同的错误。

然而,如果我再运行一次重新生成,附件链接又会再次损坏。

我认为这些并非错误,但我仍会附上重新生成期间的输出信息:

/var/www/discourse/lib/file_store/base_store.rb:6: warning: already initialized constant FileStore::BaseStore::UPLOAD_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:6: warning: previously definition of UPLOAD_PATH_REGEX was here
/var/www/discourse/lib/file_store/base_store.rb:7: warning: already initialized constant FileStore::BaseStore::OPTIMIZED_IMAGE_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:7: warning: previous definition of OPTIMIZED_IMAGE_PATH_REGEX was here

运行 rake posts:missing_uploadsPostCustomField.where(name: Post::MISSING_UPLOADS) 并未发现任何问题,因此这似乎与此无关。

我的问题可能与这个议题有关:Migrate_to_S3 Fails on Rebake - #12 by evenif

我会看看能了解到什么,可能会关闭此帖并将讨论转移到那里。

旧的损坏的附件/上传在帖子的原始文本中显示为 [{文件名}|attachment](/uploads/default/original/2X/6/{sha1 哈希 + 扩展名})。这会被处理为 href="/uploads/default/original/2X/6/{sha1 哈希 + 扩展名}",从而导致文件附件失效,但图片不受影响。

之后正常工作的附件则显示为 [{文件名}|attachment](upload://{sha1 转 base62 + 扩展名}),并被处理为 href="/uploads/short-url/{sha1 转 base62 + 扩展名}"

我写了一段 Ruby 代码,遍历已知问题时间段内的所有帖子,将所有旧的上传 URL 替换为新版格式。我利用了 Upload 模型的 base62_sha1 函数,将 SHA1 哈希转换为 Discourse 短链接所期望的文件名。

这使得附件恢复正常。随后,我再次运行了重新渲染(rebake)以确认修复效果,结果依然正常。看来问题仅存在于 Post.raw 中,与 Upload 无关。

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.