gitignore未生效导致Heroku部署后static/uploads文件夹文件丢失如何解决
根本原因
Heroku的dyno使用的是临时短命文件系统(Ephemeral Filesystem),这是平台的默认设计:
- 每次你执行
git push heroku master部署新版本时,平台会基于你提交的代码包构建一个全新的运行镜像,替换掉旧dyno的全部文件系统 - 就算你不部署,dyno每24小时也会自动执行一次轮换,运行过程中产生的所有非构建阶段的文件都会被清空
- 你添加
.gitignore的操作只能阻止本地static/uploads目录下的内容被提交到Git仓库,完全不影响Heroku对运行时文件的清理逻辑,所以自然解决不了问题
解决方案
生产环境推荐使用第三方对象存储方案,这也是Heroku官方推荐的标准实践:
- 将用户上传的文件直接存储到阿里云OSS、腾讯云COS、AWS S3等对象存储服务中
- 你的Flask服务只需要将文件对应的访问URL存储到数据库,后续用户查看文件时直接返回对象存储的访问地址即可
- 该方案完全规避了Heroku临时文件系统的限制,还支持高并发访问、容量弹性扩展,适合生产环境使用
如果是临时测试场景不想接入第三方服务,可以了解Heroku的持久化附加组件,比如各类文件存储类的Add-on,但这类方案普遍成本更高,性能也不如通用对象存储,不推荐生产使用。
额外补充
如果你需要解决本地开发时static/uploads目录的Git提交问题,可以按以下操作配置:
- 在
static/uploads目录下新建一个空的.gitkeep文件(作用是让Git可以追踪空目录) - 在
.gitignore中添加规则:static/uploads/*,同时添加例外规则:!static/uploads/.gitkeep
这样配置后,空的uploads目录会被提交到Git仓库,但目录下的用户上传文件不会被提交,适配本地开发的需求。
内容的提问来源于stack exchange,提问作者Hhggg
相关产品推荐
相关产品推荐

