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

Heroku部署Directus后上传图片过段时间消失 报502错误如何解决

问题根因

该故障由Heroku平台的临时文件系统机制触发,与Vercel上的Next.js项目、MySQL数据库配置无关联:

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

Directus媒体库故障截图

修复步骤

核心是替换Directus的默认本地存储为持久化存储,彻底脱离对Heroku本地临时磁盘的依赖:

  • 配置S3兼容对象存储作为默认存储端
    选择任意S3协议兼容的对象存储服务(AWS S3、Cloudflare R2、国内云厂商对象存储均可),在Heroku的Directus应用环境变量中添加如下配置:
    # 声明默认存储位置
    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
    
    配置完成后重新部署Directus实例,后续新上传的所有媒体文件都会直接写入持久化对象存储,不会因为Dyno重启丢失。
  • 清理历史无效数据
    之前上传的图片实体已经随Dyno重启被永久删除,无法从Heroku侧找回。可以直接在Directus媒体库批量删除残留的无效文件记录,找到原素材后重新上传即可。
  • 配置校验
    存储配置完成后,手动触发一次Heroku Dyno重启,上传测试图片后等待Dyno自动休眠(免费版Dyno无访问30分钟会自动休眠)再唤醒访问,确认图片可以正常加载、Next.js侧拉取无报错即为配置生效。
  • 可选优化
    不要依赖Heroku本地磁盘存储任何需要持久化的业务数据,可搭配Redis实例存储Directus的缓存与会话信息,避免Dyno重启引发的其他接口异常。

内容的提问来源于stack exchange,提问作者GVdL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:21:06