【问题标题】:Is it not prefer to use :local/:disk option on production environment when using ActiveStorage? Will it make me not able to backup the files?使用 ActiveStorage 时是否不喜欢在生产环境中使用 :local/:disk 选项?它会让我无法备份文件吗?
【发布时间】:2025-12-07 00:10:02
【问题描述】:

我正在开发一个使用 Rails 作为后端 API 服务器的项目。上传客户的文件将是该应用程序最重要的部分之一(它类似于 CRM/ERP 系统)。但是,由于客户的安全和隐私问题,我的客户更喜欢将所有数据和文件存储到他们自己的服务器中。

但是,当我阅读 ActiveStorage 的文档时,听起来:disk 选项仅用于testdevelopment 环境。我知道使用像 s3 这样的云存储将受益于可扩展性和备份内容,这对于 Web 开发来说非常安全和灵活,但毕竟,你知道,这是客户的要求。

1) 因此,想知道在任何生产环境中都不要使用:disk 吗?我可能会错过什么缺点?

另外,对我来说备份文件会不会很困难,正如我在/storage路径中看到的那样,这些文件都保存在与原始文件不同的名称中。

我猜想,我是否可以通过执行 pg_dump 和整个站点目录的克隆(包括 /storage 文件)来备份整个站点(它们将是 gitignore,所以我需要通过我自己并在进行恢复或服务器转换时做一些 git clone git pull 的东西)。这个工作流程会完美运行吗?

2) 如果我在 ActiveStorage 中使用:disk 选项,实际的备份和恢复流程应该是什么?

感谢您的帮助,感谢您的任何帮助!

【问题讨论】:

    标签: ruby-on-rails rails-activestorage cloud-storage


    【解决方案1】:

    磁盘和本地确实不推荐用于生产。

    如果您丢失了表格内容或存储中的某些文件/您可能无法恢复数据。

    不断增长的 storage/ 目录将使您的应用程序难以移动到其他位置,因为您必须将所有内容与代码一起复制。

    由于 storage/ 目录必须存在于应用程序的所有实例上并且始终保持同步,因此水平扩展也很困难。您可以通过在某处设置 NFS 共享并安装在 storage/ 下来解决此问题,但这可能会带来一些可靠性问题 - 例如,写入文件时的超时或权限错误将生成 ActiveStorage 表条目但没有关联文件 =>很多烦人的错误。

    我相信进行增量备份也可能相当困难,您必须转储表并将其与所有存储/文件一起压缩,如果在备份或恢复数据时发生某些变化,您将遇到各种错误。

    这些并不是真的不可能解决,只是相当不可行。

    您可能想查看 Minio 或类似的应用程序。它为您提供 ActiveStorage 支持,而无需担心 S3 成本和数据隐私问题。只需将它放在网络上某处的 docker 实例上,设置持久性和备份/RAID,就完成了。

    【讨论】:

    • 也可能会问,如果我想将所有文件从 Minio 传输到真正的 Amazon S3,可以吗?有没有一种方便的方法来保持 ActiveStorage 关联并进行传输?
    • 理论上它应该就像将目录复制到存储桶中并更新您的 yml 一样简单。然而,我有一种预感,它不可能那么简单,总有一些东西不适用于这些开源项目,所以你可能需要设置一个脚本来遍历资产,将它们上传到 S3 和更新 active_storage_ 表条目。这不是不可能的,只是有点麻烦。 AS 的开发考虑了一个非常特定的目的(Basecamp),因此它可能无法完全满足那里的每个用例,尽管有所有相关的炒作,但也无法轻松管理。
    • 除了文件不一定只通过文件名引用(以及重定向到上传的图像而不是仅仅提供它们的额外步骤)之外,使用disk 的缺点是大多数“传统“(很少依赖)Web应用程序必须处理,恕我直言。人们自古就有这个“问题”。此外,我看不出将文件放在外部存储服务中的哪些地方会使备份/恢复过程变得不那么棘手。当然,您可以恢复,但您可能需要编写一些脚本才能恢复 - 普通副本可能还不够。
    最近更新 更多