Heroku部署时如何排除指定文件夹不被删除、保留原有文件
问题核心原因
- Heroku的dyno采用临时文件系统,这是平台的默认设计规则:任何应用运行阶段写入本地文件系统的内容,都会在dyno重启、重新部署、自动缩放操作时被完全重置,仅保留代码仓库中已提交的静态文件。你提到的
files文件夹是运行时生成的内容,自然会在每次部署后丢失,和应用代码逻辑无关。
可行解决方案
方案1:使用第三方对象存储服务(最推荐,生产环境首选)
这是Heroku官方推荐的标准方案,完全规避本地文件存储的限制:
- 可选用阿里云OSS、腾讯云COS、七牛云、AWS S3这类对象存储服务,所有运行时生成的文件直接上传到对象存储中
- 数据库仅存储文件的访问链接,不需要存储本地文件路径
- 前端可直接通过对象存储的链接访问文件,不需要经过应用服务转发,还能降低服务负载
方案2:挂载Heroku持久化存储卷
如果你确实需要保留本地文件读写的逻辑,不想大幅改造现有代码,可以使用Heroku的持久化存储附加组件:
- 可以选用官方的
Heroku Volume块存储服务,或者第三方的持久化存储附加组件 - 配置存储卷挂载到你应用的
/app/files路径即可(Heroku应用默认的根目录为/app) - 参考配置命令:
# 创建容量为10G的存储卷 heroku volumes:create files-storage --size 10 --region us-east-1 # 将存储卷挂载到应用的指定路径 heroku volumes:attach files-storage --app 你的应用名 --mount-path /app/files - 注意:该方案仅支持运行在Heroku Common Runtime或Private Space的应用,免费dyno不支持该功能。
方案3:同步生成文件到代码仓库(不推荐,仅适合临时小文件场景)
如果你的文件生成频率极低,且文件体积很小,可以用这个临时过渡方案:
- 应用生成文件后,自动提交并推送到代码仓库的
files目录 - 每次部署时会自动拉取仓库内最新的
files目录内容 - 缺陷:需要在应用内存储git凭据,大文件会拖慢部署速度,频繁生成的文件会导致git仓库体积严重膨胀,不适合生产环境使用。
额外注意事项
- 不要尝试在部署脚本中做本地文件备份恢复的逻辑,Heroku每次部署都会启动全新的实例,部署脚本无法读取上一次实例的本地文件内容
- 如果选用对象存储方案,建议提前配置跨域规则,允许你的应用域名访问存储资源,避免前端加载文件时报跨域错误
内容的提问来源于stack exchange,提问作者Mateusz Świątek
相关产品推荐
相关产品推荐

