【问题标题】:Folder contents are automatically deleted every time I deploy my Rails app每次部署 Rails 应用程序时都会自动删除文件夹内容
【发布时间】:2021-08-16 15:29:19
【问题描述】:

我在 /public 文件夹下有一个目录,使用 CarrierWave 我将所有 PDF 文件存储在此目录下。但问题是我一直在部署新版本的 Rails 应用程序时,这个目录会被清理并且所有文件都丢失了。这个目录是在我的上传器下设置的。

我还有一个名为“private”的目录,我手动创建了该目录,以免在 WEB 上全局提供敏感文件。这些文件也在新的部署过程之后消失了。

如何防止文件在部署过程中被删除?

谢谢。

【问题讨论】:

    标签: ruby-on-rails nginx carrierwave


    【解决方案1】:

    我假设您正在使用一些自动化进行部署。因为如果您手动更新服务器实例上的代码,那么您可以保留预先上传的文件,但使用手动方法更新代码不是一个好习惯。

    所以在自动化部署中,我们通常遵循这种流程。 每当您部署它时,都会创建一个新的部署版本并将其设置为当前版本。

    这意味着它正在创建一个新目录并将您的 rails 项目放入其中。现在,您存储在项目目录中的文件在以前的版本中,如果您使用任何 linux 实例,这些文件不会消失。(只有当您以这种方式设置以保留最后几个版本以恢复新部署的情况下)

    到现在还清楚吗?

    假设您没有保留任何以前的版本,您的文件将永远消失。

    因此,在项目存储库下存储任何文件都不是一个好主意。

    最佳实践是使用存储桶系统,例如 AWS 存储桶或 Google 云存储桶,我们将所有上传的文件存储在其中。如果存储桶不在预算之内,您可以在项目目录之外的 linux 服务器实例上选择不同的目录。但是您必须设置所有这些上传路径和目录系统才能用作存储桶。

    【讨论】:

    • 谢谢。我使用 capistrano 作为部署自动化,使用云对我来说不是一件事情,因为我的公司对在我们的 Intranet 上保存文件有一些严格的规定。无论如何,公用文件夹的内容并没有完全删除,只有carrierwave上传的文件被删除。所以,我不确定我应该重新配置什么配置才能让该目录永远存在。
    • 在公共目录中,那些在存储库中的文件将被保留,那些稍后添加且从未推送到 GitHub 的文件将消失。所以在这种情况下,carrierwave 上传的文件在 GitHub 上没有任何关系,这就是它消失的原因。这里最好的选择是在同一服务器实例上设置项目外部的目录,这不会破坏将文件保存在内网之外的规则。
    • 如果您在设置外部目录时遇到任何问题,您可以创建目录的“符号链接”,在公共目录中使用该符号链接,因此它实际上被存储到不同的目录,但应用程序感觉就像它存储在公共目录中存在的目录中一样。
    • Hiren Bhalani 谢谢你,我确实通过在 :linked_dirs 列表中添加我的目录解决了这个问题。我认为这会在部署目录中创建一个符号链接,并且无论我保存在此路径中是否在 git 下,它们都会永远保留。
    【解决方案2】:

    当您使用 capistrano 进行部署时,会从存储库中创建一个新的部署(文件夹)。

    任何不在存储库中的文件都不会被转移。

    如果您想公开保存文件,您需要先在服务器中创建一个目录,然后在该文件夹的 public 中创建一个带有 capistrano 的符号链接。

    然后将您的载波上传保存到该位置。

    在每个部署期间,上限将符号链接到该目录,您的文件将在那里

    【讨论】:

    • 在 deploy.rb 上使用 :linked_dirs 解决了我的问题。感谢您的回复。
    • 太棒了。我们通常不公开存储文件,所以我没有意识到这一点,但我们使用我描述的技术将秘密部署到带有盐的虚拟机。很高兴您找到了解决方案。
    【解决方案3】:

    我面临的这个问题是由于 capistrano 而发生的。每次我在服务器上运行 cap production deploy 命令时,capistrano 部署工具都会将每个文件与 git repo 同步。当然,最终用户添加的文件不会存储在我的 git 存储库下,因此 capistrano 会将空的公共文件夹从我的存储库覆盖到服务器。在 deploy.rb 下添加 :linked_dirs 变量的路径解决了我的问题。

    另一种方法是使用项目根路径以外的目录(例如 /home/files)来存储所有文件。通过这样做,您将文件与项目分开,并防止 capistrano 的覆盖问题。

    希望这些信息对某人或未来的我有用:) ..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2013-02-08
      • 1970-01-01
      • 2020-10-04
      • 2020-03-29
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多