You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 04:24:02