Heroku部署Directus后上传图片过段时间消失 报502错误如何解决
问题根因
该故障由Heroku平台的临时文件系统机制触发,与Vercel上的Next.js项目、MySQL数据库配置无关联:
- Heroku所有Dyno实例的文件系统为临时运行时存储,每次Dyno休眠唤醒、自动重启、版本重部署、平台底层维护迁移时,运行过程中写入本地磁盘的所有文件都会被完全清除。
- Directus默认配置会将上传的媒体文件实体存储在项目本地
storage/uploads路径下,仅将文件名称、存储路径、大小、所属文件夹等元信息写入MySQL数据库。 - 图片刚上传完成时,文件实体还在当前运行的Dyno本地磁盘中,因此Next.js拉取、Directus后台预览都正常;一旦Dyno触发重启类操作,本地存储的图片实体被删除,数据库中的元数据记录仍然保留,就会出现媒体库仅显示文件格式标识、无缩略图、请求图片返回502 Bad Gateway的现象。

修复步骤
核心是替换Directus的默认本地存储为持久化存储,彻底脱离对Heroku本地临时磁盘的依赖:
- 配置S3兼容对象存储作为默认存储端
选择任意S3协议兼容的对象存储服务(AWS S3、Cloudflare R2、国内云厂商对象存储均可),在Heroku的Directus应用环境变量中添加如下配置:
配置完成后重新部署Directus实例,后续新上传的所有媒体文件都会直接写入持久化对象存储,不会因为Dyno重启丢失。# 声明默认存储位置 STORAGE_LOCATIONS=s3 # 配置S3存储驱动 STORAGE_S3_DRIVER=s3 STORAGE_S3_KEY=<你的存储服务AccessKey> STORAGE_S3_SECRET=<你的存储服务SecretKey> STORAGE_S3_REGION=<存储桶所属地域> STORAGE_S3_BUCKET=<存储桶名称> # 非AWS官方S3服务需要填写对应服务的接入端点 STORAGE_S3_ENDPOINT=<存储服务接入地址> STORAGE_S3_FORCE_PATH_STYLE=true - 清理历史无效数据
之前上传的图片实体已经随Dyno重启被永久删除,无法从Heroku侧找回。可以直接在Directus媒体库批量删除残留的无效文件记录,找到原素材后重新上传即可。 - 配置校验
存储配置完成后,手动触发一次Heroku Dyno重启,上传测试图片后等待Dyno自动休眠(免费版Dyno无访问30分钟会自动休眠)再唤醒访问,确认图片可以正常加载、Next.js侧拉取无报错即为配置生效。 - 可选优化
不要依赖Heroku本地磁盘存储任何需要持久化的业务数据,可搭配Redis实例存储Directus的缓存与会话信息,避免Dyno重启引发的其他接口异常。
内容的提问来源于stack exchange,提问作者GVdL
相关产品推荐
相关产品推荐

