每次部署Rails应用时文件夹内容自动删除,如何解决?
解决Rails部署时自定义存储目录被清空的问题
该问题的核心原因是标准Rails部署流程(包括Capistrano、云平台自动部署等常见方案)的默认逻辑:每次部署都会拉取全新的代码生成独立的版本目录,未被配置为持久化共享的运行时生成/手动创建目录,会随旧版本目录一同被清理,该问题和上传器的存储路径配置无关,由部署环节的目录管理规则导致。
针对最常用的Capistrano部署方案
- 打开项目下的
config/deploy.rb文件,将需要持久化的两个目录加入共享目录配置,示例如下:
# 请将public/your_pdf_dir替换为你实际存储PDF的目录路径 set :linked_dirs, fetch(:linked_dirs, []).push('public/your_pdf_dir', 'private')
- 配置完成后执行一次正常部署即可,Capistrano会自动将两个目录迁移到项目根目录的
shared文件夹下,后续每次发布新版本都会自动给当前版本目录创建对应路径的软链接,所有写入的文件都会保存在共享目录中,不会随版本更新被删除。 - 额外配置:将两个目录的路径加入
.gitignore文件,避免提交到代码库,防止部署时代码库的空目录覆盖共享目录的软链接。
针对其他部署方案/自定义部署脚本
- 核心逻辑和Capistrano一致:将需要持久化的存储目录和代码发布目录做物理分离,每次部署新版本时,把持久化目录软链接到新版本的对应路径即可。
- 如果是Docker/K8s类容器化部署:将两个目录对应的路径配置为持久化Volume挂载,即可避免容器重建/更新时数据丢失。
敏感目录安全提醒
你的private目录如果放在项目根目录下,确保Web服务器(Nginx/Apache)的站点根目录仅指向public文件夹,不要暴露整个项目根目录,避免敏感文件被公网直接访问,该配置不会影响CarrierWave读取private目录的文件做鉴权后输出。
内容的提问来源于stack exchange,提问作者Baran Yeni
相关产品推荐
相关产品推荐

